ROS2了解
WSL -d Ubuntu-22.04-ROS2-Study1. 节点
节点就是 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