零、ROS2的命令树
ros2
├── action
│ ├── cancel # 取消action
│ ├── send_goal # 发送action目标
│ └── show # 显示action信息
│
├── bag
│ ├── compress # 压缩bag文件
│ ├── decompress # 解压缩bag文件
│ ├── info # 显示bag文件信息
│ ├── play # 播放bag文件
│ ├── record # 记录bag文件
│ └── replay # 回放bag文件
│
├── component
│ ├── kill # 杀死组件
│ ├── list # 列出组件
│ ├── load # 加载组件
│ ├── restart # 重启组件
│ ├── set # 设置组件参数
│ ├── status # 显示组件状态
│ ├── unset # 删除组件参数
│ └── info # 显示组件信息
│
├── daemon
│ ├── start # 启动daemon
│ ├── stop # 停止daemon
│ ├── status # 显示daemon状态
│ └── restart # 重启daemon
│
├── doctor
│ ├── check # 检查ROS 2诊断信息
│ └── info # 显示ROS 2诊断信息
│
├── extension
│ ├── call # 调用扩展功能
│ ├── list # 列出扩展功能
│ ├── load # 加载扩展功能
│ ├── show # 显示扩展功能信息
│ └── unload # 卸载扩展功能
│
├── interface
│ ├── list # 列出接口
│ └── show # 显示接口信息
│
├── lifecycle
│ ├── change_state # 更改生命周期状态
│ ├── get_state # 获取生命周期状态
│ └── set_state # 设置生命周期状态
│
├── logging
│ ├── get_logger_level # 获取logger级别
│ ├── set_level # 设置logger级别
│ └── set_logger_level # 设置logger级别
│
├── msg
│ └── show # 显示消息定义
│
├── node
│ ├── cleanup # 清理节点
│ ├── info # 显示节点信息
│ ├── kill # 杀死节点
│ ├── list # 列出节点
│ ├── log # 记录节点信息
│ ├── monitor # 监控节点
│ ├── send_message # 发送节点间消息
│ ├── set # 设置节点参数
│ ├── unset # 删除节点参数
│ └── wait # 等待节点
│
├── param
│ ├── delete # 删除参数
│ ├── describe # 显示参数描述
│ ├── dump # 导出参数
│ ├── get # 获取参数
│ ├── list # 列出参数
│ ├── load # 导入参数
│ └── set # 设置参数
│
├── qos
│ ├── get # 获取QoS配置
│ └── set # 设置QoS配置
│
├── run
│ ├── launch # 运行launch文件
│ └── python # 运行Python脚本
│
├── service
│ ├── call # 调用服务
│ ├── find # 查找服务
│ ├── info # 显示服务信息
│ ├── list # 列出服务
│ └── type # 显示服务类型
│
├── srv
│ └── show # 显示服务定义
│
├── topic
│ ├── bw # 显示主题带宽
│ ├── echo # 回显主题数据
│ ├── find # 查找主题
│ ├── hz # 显示主题频率
│ ├── info # 显示主题信息
│ ├── list # 列出主题
│ ├── pub # 发布主题数据
│ ├── type # 显示主题类型
│ └── relay # 中继主题
│
├── type
│ ├── export # 导出类型
│ ├── import # 导入类型
│ ├── list # 列出类型
│ └── show # 显示类型定义
│
├── pkg
│ ├── create # 创建package
│ ├── describe # 显示package描述
│ ├── executables # 列出可执行文件
│ ├── list # 列出packages
│ ├── paths # 显示package路径
│ ├── prefix # 显示package前缀
│ └── xml # 显示package XML
│
├── rosbag2_migration
│ ├── check # 检查ROS 1 bag文件
│ ├── info # 显示ROS 1 bag文件信息
│ ├── merge # 合并ROS 1 bag文件
│ ├── migrate # 迁移ROS 1 bag文件
│ └── split # 分离ROS 1 bag文件
│
├── security
│ ├── create_key # 创建密钥
│ ├── create_permission # 创建权限
│ ├── grant_permission # 授予权限
│ ├── info # 显示安全信息
│ ├── revoke_permission # 撤销权限
│ └── set_permission # 设置权限
│
└── version # 显示ROS 2版本信息
一、ROS2的结构
- ROS2的功能由节点和功能包完成,节点相当于是机器人操作系统的组织,功能包相当于是由节点组成的器官。
- 下面的指令运行前提是要有一个以上的节点在运行。
1. 节点
- 运行节点:
ros2 run 功能包名 节点名
- 例如:启动turtlesim功能包下的turtlesim_node节点
ros2 run turtlesim turtlesim_node
- 查看当前运行的节点:
ros2 node list
- 查看某个节点的详细信息(在各个通信中扮演的身份):
ros2 node info node_name
- 例如:
ros2 node info /turtlesim # 查看/turtlesim节点的详细信息,将显示该节点的身份
- 输出结果形似:
Subscribers:
...
Publishers:
...
Service Servers:
...
Service Clients:
...
Action Servers:
...
Action Clients:
...
2. 功能包
- 创建python功能包,其中包含一个节点。(先cd到工作空间的/src目录下)
ros2 pkg create 功能包名 --build-type ament_python --dependencies rclpy --node-name 节点名
- 查看所有安装的功能包
ros2 pkg list
- 查看包中所有节点的列表
ros2 pkg executable 功能包名
- 功能包的目录如下:其中,my_package是功能包的主要代码和节点,my_package_msgs是定义自定义消息和服务的功能包,my_package_tools是提供辅助工具的功能包。
my_package/
├── my_package
│ ├── include
│ ├── launch
│ ├── msg
│ ├── package.xml
│ ├── src
│ └── srv
├── my_package_msgs
│ ├── action
│ ├── CMakeLists.txt
│ ├── include
│ ├── msg
│ ├── package.xml
│ └── srv
└── my_package_tools
├── launch
├── package.xml
└── scripts
二、ROS2的通信机制:
- 如果把功能包比作器官,把节点比作组织,那通信机制就是神经系统和循环系统。
- 下面的指令是如何查看节点之间的通信,以及如何在命令行中修改参数来人为影响通信。
- 通信接口
- 话题通信
- 话题类的消息类型文件后缀为.msg
- 话题通信是多对多的通信机制,是一种异步通信,接收端不知道消息是由谁发送的,发送端也不知道发出去的消息会被谁接收。
- 话题相当于一个中间商,发布者将信息发到话题上,订阅者通过订阅不同话题获取不同信息。
- 服务通信
- 服务类的消息类型文件后缀为.srv,请求与反馈数据之间使用"—“分隔开,请求的数据在”—“上方定义,反馈的数据在”—"下方定义
- 服务通信是一对多的通信机制,是一种同步通信,客户端向服务端发送请求,服务端向客户端返回响应。
- 服务相当于一个晚自习,服务端相当于老师,客户端相当于学生,只有学生向老师请教问题时,老师才会做出回答。而且老师只有一个,但老师的学生可以有很多个,这就明确了一个服务端对应多个客户端
- 动作通信
- 动作通信是一对多的通信机制,是一种同步通信,作为动作客户端的节点将目标发送到动作服务端节点,作为动作服务端的节点确认目标并进行实时反馈,最后返回结果。
- 这个比较抽象
- 请求、反馈、目标数据之间使用"—“分隔开,请求的数据在第一个”—“上方定义,反馈的数据在两个”—“之间定义,返回的结果数据在第二个”—"下方定义。动作类的消息类型文件后缀为.action。
- 话题通信
# The desired heading in radians
float32 theta
---
# The angular displacement in radians to the starting position
float32 delta
---
# The remaining rotation in radians
float32 remaining
1. 话题通信
- 查看目前存在的话题列表,并显示话题类型
ros2 topic list -t
- 结果形如
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]
- 查看某个话题的消息类型与发布者、订阅者数量
ros2 topic info 话题名称
- 例如:
ros2 topic info /turtle1/pose
- 结果形如
Type: turtlesim/msg/Pose
Publisher count: 3
Subscription count: 0
- 查看某个话题的发布频率
ros2 topic hz 话题名称
- 查看某个话题的传输带宽
ros2 topic bw 话题名称
- 发布一次话题消息
ros2 topic pub --once 话题名 话题类型 "话题消息"
- 以固定频率发布话题消息
ros2 topic pub --rate 频率 话题名 话题类型 "话题消息"
2. 服务通信
- 查看服务列表和服务消息类型(消息类型是[]中的内容)
ros2 service list -t
- 结果形如
/clear [std_srvs/srv/Empty]
/kill [turtlesim/srv/Kill]
/reset [std_srvs/srv/Empty]
/spawn [turtlesim/srv/Spawn]
- 查找使用某一具体服务消息类型的所有服务
ros2 service find 数据类型
- 发送服务请求
ros2 service call 服务名称 服务消息类型 "请求消息"
3. 动作服务
- 查看动作列表和动作类型(中括号内)
ros2 action list -t
- 查看动作信息
ros2 action info 动作名
- 例如:
ros2 action info /turtle1/rotate_absolute
- 发送动作请求并查看反馈( 参数–feedback用于查看此目标的反馈)
ros2 action send_goal 动作名 动作消息类型 "动作消息" --feedback
4. 所有的通信接口
- 查看所有通信接口
ros2 interface list
- 查看某个通信接口的消息类型
ros2 interface show 接口名称
- 查看某个功能包中的所有通信接口
ros2 interface package 功能包名
5. 参数
- 查看所有参数的列表
ros2 param list
- 查询某个参数的数据类型和当前值
ros2 param get node_name parameter_name
- 修改某个参数的值
ros2 param set node_name parameter_name value
- 将某个节点的参数保存到参数文件中
ros2 param dump node_name
- 重新加载parameter_flie文件中的所有参数值,赋值给节点
ros2 param load /turtlesim turtlesim.yaml # 加载文件参数值
参考文献:https://blog.youkuaiyun.com/weixin_45485619/article/details/128631829
https://www.ros.org