ros2实现话题通信

发布时间 2023-03-24 11:54:24作者: 阿木古冷

ros2实现话题通信

一,创建工作空间

mkdir -p ros2_ws/src
cd ros2_ws/src

二,创建package

# 进到ros2_ws/src路径下
ros2 pkg create --build-type ament_python py_pubsub
# 解释
ros2 pkg create <package-name>  --build-type  {cmake,ament_cmake,ament_python}  --dependencies <依赖名字>

三,创建发布者节点

# 进到ros2_ws/src/py_pubsub/py_pubsub路径下
wget https://raw.githubusercontent.com/ros2/examples/foxy/rclpy/topics/minimal_publisher/examples_rclpy_minimal_publisher/publisher_member_function.py

四,添加依赖

# 回到ros2_ws/src/py_pubsub/路径下
# 修改package.xml
<description>Examples of minimal publisher/subscriber using rclpy</description>
<maintainer email="you@email.com">Your Name</maintainer>
<license>Apache License 2.0</license>
## 追加声明此节点需要的依赖 rclpy 和 std_msgs
<exec_depend>rclpy</exec_depend>
<exec_depend>std_msgs</exec_depend>
# 修改 setup.py :对应 package.xml 里的修改
maintainer='YourName',
maintainer_email='you@email.com',
description='Examples of minimal publisher/subscriber using rclpy',
license='Apache License 2.0',
## 在 console_scripts 中添加注册节点
entry_points={
        'console_scripts': [
                'talker = py_pubsub.publisher_member_function:main',
        ],
},
# 检查 setup.cfg :此为环境变量, 不然运行节点时setuptools找不到
[develop]
script-dir=$base/lib/py_pubsub
[install]
install-scripts=$base/lib/py_pubsub

五,创建订阅者节点

# 回到 ros2_ws/src/py_pubsub/py_pubsub 路径下
wget https://raw.githubusercontent.com/ros2/examples/foxy/rclpy/topics/minimal_subscriber/examples_rclpy_minimal_subscriber/subscriber_member_function.py

六,追加相关配置

# package.xml 和 setup.cfg 是一样的,不需要修改
# setup.py 追加listener节点信息
entry_points={
        'console_scripts': [
                'talker = py_pubsub.publisher_member_function:main',
                'listener = py_pubsub.subscriber_member_function:main',
        ],
},

七,编译执行

# ros2_ws路径下检查依赖项(用到的包啥的)是否缺失,缺失会自动安装
rosdep install -i --from-path src --rosdistro foxy -y
# 编译(colcon build --symlink-install 此参数很有用,相当于建立一个link, 以后改动python代码就不需要重新编译)
colcon build --packages-select py_pubsub --symlink-install
# 加载环境 :source install/setup.bash
. install/setup.bash
# 运行节点talker
ros2 run py_pubsub talker

[INFO] [minimal_publisher]: Publishing: "Hello World: 0"
[INFO] [minimal_publisher]: Publishing: "Hello World: 1"
[INFO] [minimal_publisher]: Publishing: "Hello World: 2"
[INFO] [minimal_publisher]: Publishing: "Hello World: 3"
[INFO] [minimal_publisher]: Publishing: "Hello World: 4"
...
# 开另一个终端加载环境并运行listener
. install/setup.bash
ros2 run py_pubsub listener

[INFO] [minimal_subscriber]: I heard: "Hello World: 10"
[INFO] [minimal_subscriber]: I heard: "Hello World: 11"
[INFO] [minimal_subscriber]: I heard: "Hello World: 12"
[INFO] [minimal_subscriber]: I heard: "Hello World: 13"
[INFO] [minimal_subscriber]: I heard: "Hello World: 14"
# ros2_ws下有四个dir:build,install,log,src
# 其中src目录结构如下
.
└── py_pubsub
    ├── package.xml
    ├── py_pubsub
    │   ├── __init__.py
    │   ├── publisher_member_function.py
    │   └── subscriber_member_function.py
    ├── resource
    │   └── py_pubsub
    ├── setup.cfg
    ├── setup.py
    └── test
        ├── test_copyright.py
        ├── test_flake8.py
        └── test_pep257.py

八,拓展

# rosdep是什么
rosdep是ros的一个功能包,在安装ros时会自动安装.在使用时需要初始化.
ros包有两个不同类型的依赖项:build依赖项和run依赖项。rosdep就是用来检查包的丢失依赖项,并且完成下载和安装。
此命令会自动检测src下的所有包依赖,如果发现没有安装的依赖,直接安装。
rosdep是ros一个命令行,用于安装系统依赖,具体地说,就是ros包的依赖。
# rosdep初始化
rosdep使用前需要先进行初始化和更新,初始化也就是执行下面指令:
sudo rosdep init
# 使用
rosdep install -i --from-path src --rosdistro foxy -y
# rosdep初始化失败的情况
1.为什么叫rosdepc?
rosdepc,c指的是China中国,主要用于和rosdep区分。
2.rosdepc和rosdep功能一致吗?
rosdep官方最新版源码直接修改的,改动了名称和源地址,将其地址修改为国内gitee地址。
3.rosdepc为什么不会初始化失败?
因为rosdepc使用的是国内的源,rosdep初始化失败是因为其使用的是github,国内无法访问。
# rosdepc安装使用
安装
sudo pip install rosdepc
如果显示没有pip可以试试pip3
sudo pip3 install rosdepc
如果pip3还没有
sudo apt-get install python3-pip 
sudo pip install rosdepc
使用
sudo rosdepc init
rosdepc update