ROS2了解

ROS2了解

WSL -d Ubuntu-22.04-ROS2-Study

1. 节点

节点就是 ROS2 中正在运行的一个功能程序。

ros2 node list                 # 查看所有节点
ros2 node info /节点名          # 查看节点详细信息
ros2 run 包名 可执行文件名       # 运行节点

例子:

ros2 run turtlesim turtlesim_node
ros2 node list
ros2 node info /turtlesim

记忆:

node list 看节点
node info 看节点详细信息
ros2 run 运行节点

2. 话题

话题是单向、持续的数据流。

发布者一直发,订阅者一直收。

# 发布者
ros2 run learning_topic topic_helloworld_pub
# 订阅者
ros2 run learning_topic topic_helloworld_sub

常用命令:

ros2 topic list                 # 查看话题
ros2 topic list -t              # 查看话题和类型
ros2 topic echo /话题名          # 查看话题数据
ros2 topic info /话题名          # 查看发布者/订阅者数量
ros2 topic type /话题名          # 查看话题类型
ros2 interface show 类型名       # 查看消息结构
ros2 topic pub /话题名 类型 "数据" # 手动发布话题

例子:

ros2 topic list -t
ros2 topic echo /turtle1/pose
ros2 topic type /turtle1/cmd_vel
ros2 interface show geometry_msgs/msg/Twist

让乌龟动一下:

ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0}, angular: {z: 1.0}}"

记忆:

topic echo 看数据
topic pub 发数据
topic type 看类型
interface show 看结构

3. 服务

服务是一次请求,一次响应。

客户端 Client  --->  请求 Request  --->  服务端 Server
客户端 Client  <---  响应 Response <---  服务端 Server

常用命令:

ros2 service list               # 查看服务
ros2 service list -t            # 查看服务和类型
ros2 service type /服务名        # 查看服务类型
ros2 interface show 服务类型     # 查看请求/响应结构
ros2 service call /服务名 类型 "数据" # 调用服务

例子:

ros2 service list -t
ros2 service type /clear
ros2 service call /clear std_srvs/srv/Empty

生成一只新乌龟:

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2.0, y: 2.0, theta: 0.0, name: 'turtle2'}"

记忆:

service call 是调用服务
服务是一次请求一次响应

4. 动作

动作适合长时间任务,可以有目标、反馈、结果。

动作包含三部分:

Goal:目标
Feedback:执行过程中的反馈
Result:最终结果

动作可以理解为:

服务 + 话题 的结合

它比服务更适合长任务,因为服务一般是“请求后很快返回”,动作可以边执行边反馈。

适合:

导航到某个点
机械臂移动到某个位置
机器人旋转到某个角度
执行一个耗时任务

适合:

长时间任务,比如导航、旋转、机械臂运动

常用命令:

ros2 action list                # 查看动作
ros2 action list -t             # 查看动作和类型
ros2 action info /动作名         # 查看动作信息
ros2 interface show 动作类型     # 查看 Goal / Result / Feedback
ros2 action send_goal /动作名 类型 "目标" # 发送动作目标

例子:

ros2 action list -t
ros2 action info /turtle1/rotate_absolute
ros2 interface show turtlesim/action/RotateAbsolute

让乌龟旋转,并显示反馈:

ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}" --feedback

记忆:

action = 目标 + 反馈 + 结果
send_goal 发送目标
--feedback 显示过程反馈

5. 参数

参数特点:

参数是节点的配置
不是持续通信

常用命令:

ros2 param list                 # 查看参数
ros2 param list /节点名          # 查看某个节点参数
ros2 param get /节点名 参数名     # 获取参数
ros2 param set /节点名 参数名 值   # 修改参数
ros2 param dump /节点名 > a.yaml  # 保存参数
ros2 param load /节点名 a.yaml    # 加载参数

例子:

ros2 param list /turtlesim
ros2 param get /turtlesim background_r
ros2 param set /turtlesim background_r 100

刷新背景:

ros2 service call /clear std_srvs/srv/Empty

记忆:

param get 看参数
param set 改参数
param dump 保存
param load 加载

小结

名称一句话理解常见用途
Node 节点正在运行的功能程序摄像头节点、电机节点、控制节点
Topic 话题持续单向通信图像、速度、传感器数据
Service 服务一次请求,一次响应清空、生成、开关、查询
Action 动作长时间任务,有反馈导航、旋转、机械臂运动
Parameter 参数节点的配置项颜色、阈值、PID、开关

6. 分布式通信

ROS2 默认靠 DDS 在局域网里自动发现节点,发现过程依赖 UDP/多播。WSL2 默认 NAT 网络经常导致树莓派发现不了 WSL 里的 ROS2 节点。

解决方法:
Windows 11 22H2 及以上可以开启 WSL 的 mirrored networking
提前改成 mirrored
原因是 ROS2 的 DDS 自动发现比较依赖局域网通信、多播、UDP。微软官方说明,WSL 的 mirrored networking 支持 multicast 多播,也支持从局域网直接连接 WSL,并且改善 NAT 架构下的网络兼容性。

具体修改可以去查看ROS2的问题总结

# 将笔记本和树莓派连接到同一个网络中
ping 192.168.3.211        # 这里换成你的树莓派的ip地址
# 在树莓派的ubuntu中打开终端
vi .bashrc

# 在最后一行写上:
export ROS_DOMAIN_ID=31

# 设置脚本生效
source .bashrc

# 这样就生成了一个编号为31号的网络组,这时候电脑端和树莓派应该是不能通信了(因为电脑端没有设置31号的网络组)
# 在电脑端
vi .bashrc
# 在最后一行写上:
export ROS_DOMAIN_ID=31
# 设置脚本生效
source .bashrc

添加新评论