目录
- 0 专栏介绍
- 1 ROS2核心架构
- 1.1 工作空间
- 1.2 功能包
- 2 ROS2常用指令
- 2.1 功能包相关
- 2.2 节点运行相关
- 2.3 话题相关
- 2.4 参数相关
- 2.4 录制包、播放包相关
- 2.5 服务相关
- 2.6 动作相关
- 2.7 生命周期相关
0 专栏介绍
本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。
🚀详情:《ROS2从入门到精通》
1 ROS2核心架构
ROS2工程的核心架构如图所示
其中的核心概念阐述如下:
1.1 工作空间
工作空间是存放工程开发文件的地方,可能包含多个功能包,其中又细分为四个子空间:
- 源码空间src:源码空间包含了功能包源代码
- 编译空间build:编译空间存放编译源码空间产生的缓存信息和中间文件
- 日志空间log:日志空间存放各种警告、错误、信息等日志;
- 安装空间install:安装空间存放开发完毕并通过测试的构建目标,如可执行文件和脚本。
工作空间的名称可以自己定义,数量也并不唯一
1.2 功能包
功能包是ROS的基本功能单元,可能包含多个节点,其中包含工程文件主体
-
CMakeLists.txt
(用于C++功能包):配置编译规则,比如源文件、依赖项、链接库,注意这里使用ament
而非ROS1中的catkin
。ament
基于CMake
构建系统,开发者可以方便地管理依赖关系、编译选项、安装目标等cmake_minimum_required(VERSION 3.8) project(node_lab) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() # find dependencies find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) add_executable(node_helloworld_class src/node_helloworld_class.cpp) ament_target_dependencies(node_helloworld_class rclcpp) install(TARGETS node_helloworld_class DESTINATION lib/${PROJECT_NAME}) ament_package()
-
package.xml
(用于C++与Python功能包):包信息,比如包名、版本、作者<?xml version="1.0"?> <?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?> <package format="1"> <name>node_lab</name> <version>0.0.0</version> <description>TODO: Package description</description> <maintainer email="winter@winter.com">winter</maintainer> <license>TODO: License declaration</license> <buildtool_depend>ament_cmake</buildtool_depend> <test_depend>ament_lint_auto</test_depend> <test_depend>ament_lint_common</test_depend> <export> <build_type>ament_cmake</build_type> </export> </package>
-
setup.py
(用于Python功能包):包含版权信息,并配置程序入口setup( name=package_name, version='0.0.0', packages=[package_name], data_files=[ ('share/ament_index/resource_index/packages', ['resource/' + package_name]), ('share/' + package_name, ['package.xml']), (os.path.join('share', package_name, 'launch'), glob(os.path.join('launch', '*.launch.py'))), (os.path.join('share', package_name, 'config'), glob(os.path.join('config', '*.*'))), (os.path.join('share', package_name, 'rviz'), glob(os.path.join('rviz', '*.*'))), ], install_requires=['setuptools'], zip_safe=True, maintainer='winter', maintainer_email='winter@winter.com', description='TODO: Package description', license='TODO: License declaration', tests_require=['pytest'], entry_points={ 'console_scripts': [ ], }, )
-
scripts
:存储脚本文件,例如python源码或.sh脚本 -
src
: 存储C++源文件 -
include
:存储.h头文件 -
launch
:存储启动文件,可一次性运行多个节点 -
config
:存储配置信息 -
…
其中,package.xml
与CMakeLists.txt
非常重要,前者作为功能包入口声明依赖关系;后者解析.xml
并执行具体的查找依赖、链接库等行为,文件缺失或错误配置都会导致编译失败。
2 ROS2常用指令
2.1 功能包相关
-
查看功能包列表
ros2 pkg list
-
创建一个新的功能包
ros2 pkg create --build-type ament_cmake package_name
-
创建功能包时添加依赖项
ros2 pkg create --build-type ament_cmake package-name --dependencies [deps]
-
编译所有功能包
colcon build
-
编译指定功能包
colcon build –packages-select package_name
2.2 节点运行相关
-
查看所有运行节点
ros2 node list
-
查看某一个节点信息
ros2 node info node_name
-
节点运行方式1
ros2 run package_name executable_file
-
节点运行方式2
ros2 launch package_name node_launch_file (e.g., .py, .launch)
2.3 话题相关
-
查看系统内活跃topic
ros2 topic list
-
查看topic的消息类型
ros2 topic type topic_name
-
显示topic内容
ros2 topic echo topic_name
-
向特定topic发送数据,其中args是实际数据,需要以YAML格式输入
ros2 topic pub topic_name msg_type 'args' [--once | --rate <num>]
- 例1:发送一次运动指令
其中ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
--once
表示发布一个消息然后退出 - 例2:以10Hz发送运动指令
其中ros2 topic pub --rate 10 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
--rate num
表示以num
Hz稳定流发布消息
- 例1:发送一次运动指令
-
查看发布数据的帧率
ros2 topic hz topic name
2.4 参数相关
-
查看节点的子命名空间和参数
ros2 param list
-
获取当前参数的值
ros2 param get node_name param_name
-
设置参数的值
ros2 param set node_name param_name value
-
存储节点所有参数值到本地的
node_name.yaml
文件ros2 param dump node_name
-
存储节点的所有参数值到指定路径
ros2 param dump node_name --output-dir /path
-
导入本地参数文件
ros2 run package_name executable_name --ros-args --params-file <file_name>
2.4 录制包、播放包相关
- 查看bag信息
ros2 bag info bag_name
- 正常播包命令
ros2 bag play bag_dir_name
- 倍速播包命令
ros2 bag play bag_dir_name -r 2
- 循环播包命令
ros2 bag play bag_dir_name -l
- 播放单个topic
ros2 bag play bag_dir_name --topics /topic_name
以上包路径bag_dir_name
也可以换成具体的包数据库文件xxx.db3
- 录制特定topic的包
ros2 bag record topic_name
- 录制多个topic的包
ros2 bag record -o new_bag_name topic1_name topic2_name
- 录制所有topic的包
ros2 bag record -a
以上录制完成后会在本地多一个bag_dir_name
,其中包含配置.yaml
和数据.db3
2.5 服务相关
-
查看服务列表
ros2 service list # 加-t可显示服务消息类型
-
查看服务的数据类型
ros2 service type service_name
-
查找使用指定数据类型的服务
ros2 service find type_name
-
通过命令行调用服务
ros2 service call <service_name> <service_type> <args>
例如
ros2 service call /spawn turtlesim/srv/Spawn “{x: 2, y: 2, theta: 0.2, name: ‘’}”
2.6 动作相关
-
列出域内可用的动作列表
ros2 action list # 加 -t 可显示动作消息类型
-
查看指定action的信息
ros2 action info action_name
-
模拟客户端手动发起动作请求
ros2 action send_goal <action_name> <type_name> <goal_data> <--feedback>
--feedback
指定是否显示反馈信息,例如ros2 action send_goal /crossing_acton duckietown_interface/action/Crossing “{speed: 0.2, direction: ‘right’}” --feedback
2.7 生命周期相关
- 查看有哪些lifecycle节点
ros2 lifecycle nodes
- 查看lifecycle节点所有可行的转换
ros2 lifecycle list node_name -a
- 获取节点状态
ros2 lifecycle get node_name
- 设置节点状态
ros2 lifecycle set node_name configure
🔥 更多精彩专栏:
- 《ROS从入门到精通》
- 《Pytorch深度学习实战》
- 《机器学习强基计划》
- 《运动规划实战精讲》
- …