本文主要介绍 ROS2 机器人操作系统的一些常用命令行工具及其使用方法,使用这些命令可以使机器人编程和调试变得更加简便。
在实际应用过程中,我们会经常用到命令行操作来辅助调试,更进一步的可以使用GUI工具辅助调试。
一、创建工作空间
跟ROS相同,ROS 2也是建议创建一个工作空间,方便管理同一个项目的packages,而且也是将package源文件都放入src文件夹中。
创建工作空间:
mkdir -p ~/ros2_ws/src
cd ros2_ws/src
现在我们先关注 colcon 的编译过程,所以 package 源文件就先借用官网的。
在 ros2_ws/src
目录下运行以下命令:
git clone https://github.com/ros/ros_tutorials.git -b humble
从工作空间的根目录(ros2_ws
)运行以下命令:
# cd if you're still in the ``src`` directory with the ``ros_tutorials`` clone
cd ..
rosdep install -i --from-path src --rosdistro humble -y
如果您已经具备了所有的依赖项,控制台会返回:
#All required rosdeps installed successfully
从工作空间的根目录(ros2_ws
)开始,使用以下命令构建您的软件包:
colcon build
编译后,产生了 build, install, log 三个新文件夹。
如果要单独编译某一个 package,可以用如下命令:
colcon build --packages-select PACKAGE_NAME
如果不希望编译某一个 package,可以在该 package 中创建名为 COLCON_IGNORE 的空文件,colcon 就会忽略掉该 package,不但不编译,连 colcon list 都不显示,这个 package 对 colcon 就是透明的。
完成编译之后,要 source 一下 setup.bash 文件,确保系统能够找到当前编译生成的可执行文件和库:
source install/setup.bash
二、终端命令
1. ROS2 命令简介
ROS2 的主要命令入口是 ros2
,其中又包含大量的子命令,可用于 ROS2 程序的开发和测试。下面是其中一些常用的命令及其作用:
ros2 run
:运行 ROS2 节点或任意可执行文件。ros2 launch
:启动 ROS2 应用程序,可以同时启动多个节点。ros2 pkg
:用于操作 ROS2 软件包,包括创建 package、指定包名、编译方式、依赖项、节点名等。ros2 node
:用于管理 ROS2 节点,可以列出、杀死、查看节点等。ros2 topic
:用于管理 ROS2 话题(Topic),包括列出、发布、订阅、查看话题等。ros2 service
:用于管理 ROS2 服务(Service),包括列出、调用、创建、删除服务等。ros2 action
:用于管理 ROS2 行为(Action),包括列出、调用、取消行为等。ros2 bag
:用于记录和回放 ROS2 话题数据,可以将数据记录到文件中,以供后续回放和分析。ros2 param
:用于管理 ROS2 参数服务器,包括设置、获取、删除参数等。ros2 msg
和ros2 srv
:用于查看 ROS2 消息和服务类型的定义。ros2 doctor
:用于检查 ROS2 环境是否正常,包括检查网络、环境变量、节点和话题等。
熟练掌握上述 ROS2 命令,可以帮助开发者对 ROS2 应用程序进行管理和监控,加快开发和调试速度。
2. ros2 run
ros2 run
命令用于运行 ROS2 节点或任意可执行文件。
命令语法:
ros2 run <package_name> <executable_name>
示例:
ros2 run turtlesim turtle_teleop_key
还可以在启动 ROS2 节点时指定要加载的参数文件:
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
3. ros2 launch
ros2 launch
命令用于启动 ROS2 应用程序,可以同时启动多个节点。
命令语法:
ros2 launch <package_name> <launch_file_name>
示例:
ros2 launch launch_tutorial launch_turtlesim.launch.py
4. ros2 pkg
ros2 pkg
命令用于操作 ROS2 软件包,有 create、executables、list、prefix、xml 共 5 个子命令,我们常用的是前3个。
ros2 pkg create
命令功能:创建功能包,指定包名、编译方式、依赖项、节点名等
创建软件包:
ros2 pkg create <package_name> --build-type <build_type>
--node-name <node_name>
--dependencies <your_dependencies>
例如:
ros2 pkg create my_package --build-type ament_cmake --node-name my_node --dependencies rclcpp std_msgs sensor_msgs
选项参数说明:
--build-type
用于指定编程语言,ament_cmake
表示使用 C++,ament_python
表示使用 Python。--node-name
用于指定节点名,也是要生成的源码文件,可以后期创建,但是手动创建需要手动配置。--dependencies
用于指定依赖模块,其中rclcpp
是 C++ 必选的,rclpy
是 Python 必选的,std_msgs
和sensor_msgs
是我们要用的消息模块,可暂不指定,后续手动配置。
ros2 pkg list
查看 ROS2 系统中所有软件包(注意:需要用 source 设置环境变量才能看到自己写的软件包)
ros2 pkg list
查看软件包中的可执行文件列表
ros2 pkg executables <package_name>
5. ros2 node
ros2 node
命令用于管理 ROS2 节点,包括 list
和 info
两个子命令。
5.1 ros2 node list
列出所有正在运行的节点名称:
ros2 node list
5.2 Remapping
Remapping 允许你重新分配默认节点属性,像节点名, topic 名,service 名等等;
重新分配节点名 /turtlesim 的方式如下:
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
此时会出现两个节点名:
/turtlesim
/my_turtle
5.3 ros2 node info
查看指定节点的信息:
ros2 node info <node_name>
6. ros2 topic
ros2 topic
命令用于管理 ROS2 话题(Topic),包括列出、发布、订阅、查看话题等。
topic 不一定是一对一的通信,它也可以是一对多、多对一或者多对多的。
该命令又包含多个子命令:
bw
:显示话题使用的带宽;delay
:显示话题的延迟(基于消息头中的时间戳);echo
:输出指定话题的消息;find
:输出给定类型的可用主题列表;hz
:打印话题的平均发布率;info
:打印有关话题的信息;list
:输出可用的话题列表;pub
:向指定话题发布消息;type
:打印话题的类型。
6.1 ros2 topic list
在新的终端下运行 ros2 topic list 命令会返回在系统内所有当前活跃的 topic:
ros2 topic list
例如,查看系统内所有当前活跃的话题:(-t 表示显示其类型)
ros2 topic list -t
差异如下:
6.2 ros2 topic info
查看话题的详细信息:
ros2 topic info <topic_name>
6.3 ros2 topic type
查看主题消息类型:
ros2 topic type <topic_name>
6.4 ros2 topic find
按消息类型查找相关主题
ros2 topic find <message_type>
命令加-c参数,只统计并显示数量
6.5 ros2 topic hz
查看话题发布数据的速率:
ros2 topic hz <topic_name>
6.6 ros2 topic echo
查看数据在话题上发布的情况:
ros2 topic echo <topic_name>
6.7 ros2 topic pub
该命令可以用来直接从命令行向一个 topic 内发布数据:
ros2 topic pub <topic_name> <msg_type> '<args>'
<args> 参数是实际数据,需要以 YAML 语法输入,示例如下:
- 例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:
ros2 topic pub --rate 1 /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 1 代替了 --once 选项,意思是以一个 1Hz 的稳定流发布命令。
6.8 ros2 topic bw
显示所查阅主题的带宽:
ros2 topic bw <topic_name>
6.9 ros2 topic delay
通过header中的时间戳计算消息延迟:
ros2 topic delay <topic_name>
7. ros2 service
ros2 service
命令用于管理 ROS2 服务(Service),包括列出、调用、创建、删除服务等。使用方法与 topic 命令类似,包括以下子命令:
call
:调用一个服务;find
:查找指定类型的可用服务;list
:列出所有可用服务;type
:显示服务的类型。
例如,查看系统内所有可用服务:(-t 表示显示其类型)
ros2 service list -t
查找使用某类消息类型的服务:
ros2 service find <type_name>
查看服务接收的消息类型:
ros2 service type <service_name>
8. ros2 action
ros2 action
命令用于管理 ROS2 行为(Action),包括列出、调用、取消行为等。
例如,列出系统内所有 action:
ros2 action list
9. ros2 bag
ros2 bag
命令用于记录和回放 ROS2 话题数据,可以将数据记录到文件中,以供后续回放和分析。
录制发布到某个 topic 的消息:
ros2 bag record <topic_name>
查看录制好的 rosbag 信息:
ros2 bag info <bag_file_name>
回放 rosbag:
ros2 bag play <bag_file_name>
10. ros2 param
ros2 param
命令用于管理 ROS2 参数服务器,包括设置、获取、删除参数等。
该命令又包含多个子命令:
delete
:删除参数;describe
:显示参数的描述信息;dump
:导出一个节点的所有参数到一个 yaml 文件;get
:获取参数;list
:输出系统内所有可用参数列表;load
:加载参数文件到一个节点;set
:设置参数。
例如,查看参数及其节点归属:
ros2 param list
获取当前参数的值:
ros2 param get <node_name> <parameter_name>
在运行时间内改变参数值:
ros2 param set <node_name> <parameter_name> <value>
将参数导出到一个文件:
可以将一个节点的所有参数值 “dump” 进一个文件以储存,使得之后能使用该命令:
ros2 param dump <node_name>
例如,如果想储存节点 /turtlesim 当前的配置参数,可以输入命令:
ros2 param dump /turtlesim
终端将会返回消息:
Saving to: ./turtlesim.yaml
你将发现在该工作空间目录有一个新文件被写入了。打开该文件,会显示以下内容:
turtlesim:
ros__parameters:
background_b: 255
background_g: 86
background_r: 150
use_sim_time: false
为了使用在上面保存的参数值,输入:
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
与之前运行可执行文件方式一样,就是多了两个 flags: ‘–ros-args’ 和 ‘–params-file’,之后再接上想要加载的文件。
紧接着上一节的示例,想要读取该参数,需输入命令:
ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml
11. ros2 interface
分类显示系统内所有的接口,包括消息(Messages)、服务(Services)、动作(Actions)
ros2 interface list
显示指定接口包内的子接口
ros2 interface package <interface_name>
显示指定接口包
ros2 interface packages
显示指定接口的详细内容
ros2 interface show <interface_name>
用于消息类型Messsage
用于服务Service
用于动作Action
显示消息模板
ros2 interface proto <message_name>