Workspace

Workspace 是 ROS2 的概念,表示我们在系统上进行 ROS2 开发的位置。

ROS2 的核心 Workspace 叫做 underlay ,本地的 Workspace 叫做 overlay 。 在开发 ROS2 的时候,一般会有多个 Workspace 并行存在。

结合 Workspace 能够方便的使用不同的 ROS2 版本,类似于 python 的虚拟环境

ROS2 通过 shell 环境来让不同的 Workspace 下用不同的 ROS2 环境。 新打开一个终端都需要加载 ROS2 的 setup 文件,载入 ROS2 的开发环境。

例子:

1
source /opt/ros/eloquent/setup.bash

ROS_DOMAIN_ID 环境变量

标记一个 ROS 域,不同的 ROS 域之间不能通信。

colcon_cd

colcon_cd 可以快速的改变当前的目录到ROS包的概念及创建的目录。

_colcon_cd_root 环境变量指定了 Workspace 目录。

小乌龟和rqt

小乌龟是 ROS2 Dashing 版本以上才有的一个轻量模拟器,方便我们学习 ROS2 。

rqt 是 ros2 命令的 gui 版本。一般我们只会用命令行。

具体文档: https://index.ros.org/doc/ros2/Tutorials/Turtlesim/Introducing-Turtlesim/

理解 ROS 节点

ROS核心概念 里面介绍了节点的概念,在官方教程中有详细的用法:https://index.ros.org/doc/ros2/Tutorials/Understanding-ROS2-Nodes/

ros run

ros2 run 命令载入一个包里面的可执行文件

1
ros2 run <package_name> <executable_name>

ros2 pkg executables 可以列出包里的可执行文件

1
ros2 pkg executables <package_name>

ros2 run turtlesim turtlesim_node 运行 turtlesim 包中的 turtlesim_node 可执行文件。

但是我们并不知道节点名称。

通过 ros2 node list 列出所有节点,运行 turtlesim_node 后输出为:

1
/turtlesim

再运行另一个节点 ros2 run turtlesim turtle_teleop_keu

这时输出:

1
2
/teleop_turtle
/turtlesim

启动时可以修改节点的参数,如修改节点名称:

1
ros2 run turtlesim turtlesim_node __node:=my_turtle

ros node info

通过 ros2 node info <node-name> 可以查看节点的信息,它能够看到订阅者,发布者,提供的服务等信息。

理解 ROS 的 Topic

https://index.ros.org/doc/ros2/Tutorials/Topics/Understanding-ROS2-Topics

ROS2 将复杂的系统分离成各个节点,Topic 在 ROS 图中是一个虚拟元素,作为一个节点交换信息的总线。

Topic 支持一对一,一对多,多对多的通信。

rqt_graph

rqt_graph 能够可视化节点和主题之间的连接。

ros2 topic list

返回目前系统中所有激活的 topic 。

ros2 topic list -t 打印中包括 topic 的类型。

ros2 topic echo <topic_name>

查看发布到指定 topic 的数据

ros2 topic info

查看 topic 的信息,包括发布者和订阅者数量。

ros2 interface show

显示 Topic 发送的消息定义

ros2 topic pub

向 topic 发布消息

1
2
ros2 topic pub <topic_name> <msg_type> '<args>'

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}}"

ros2 topic hz

查看数据的发布速率

理解 ROS2 的服务

https://index.ros.org/doc/ros2/Tutorials/Services/Understanding-ROS2-Services/

服务类似于 rpc ,是一个请求/响应模型 。

ros2 service list

查看所有的服务。

每个节点默认都有一些基础的服务,比如设置参数服务等。

ros2 service list -t 打印出服务的类型

ros2 service type

可以看到服务的定义,ROS2接口 中有提到。

ros2 service find <type_name>

找出指定类型的所有服务

1
ros2 service find std_srvs/srv/Empty

ros2 interface show

显示服务的定义

ros2 service call

调用服务

1
ros2 service call <service_name> <service_type> <arguments>
1
ros2 service call /clear std_srvs/srv/Empty

理解 ROS2 参数

ROS2 参数和 ROS2 节点关联,参数用于在运行时外部配置节点。

参数按节点名称、节点命名空间、参数名称和参数命名空间寻址。提供参数命名空间是可选的。

每一个参数以键和值组成,其中键是字符串,值是下面的类型:

1
bool, int64, float64, string, byte[], bool[], int64[], float64[] or string[]

参数的设置可以通过命令行,文件或者代码。它们可以单独设置,或者在参数文件中设置多个。

ros2 param list

列出所有的参数

每个节点都会有公共的参数,比如 use_sim_time

ros2 param get

获取指定参数的值

1
ros2 param get <node_name> <parameter_name>

比如:

1
ros2 param get /turtlesim background_g

ros2 param set

设置指定参数的值

1
ros2 param set <node_name> <parameter_name> <value>

例如:

1
ros2 param set /turtlesim background_r 150

ros2 dump <file_name>

dump 参数到文件中

载入参数

在运行时从文件中载入参数

1
ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>

理解 action

https://index.ros.org/doc/ros2/Tutorials/Understanding-ROS2-Actions/

行为构建在 Topics 和 Service 之上,行为包括三个部分:目标,结果和反馈。

行为类似于服务,但是操作是可抢占的,我们可以手动取消。行为也会提供稳定的反馈, 不像服务只会响应一次。

行为是客户端-服务端架构,客户端向服务端发送目标,服务返回反馈和结果。

ros2 action list

列出所有的 action 。

ros2 action list -t 打印出 action 的 type 。

ros2 action info

查看 action 的信息,包括客户端和服务端。

ros2 interface show

显示行为定义

ros2 action send_goal

发送目标

1
ros2 action send_goal <action_name> <action_type> <values>

ros2 bag

ros2 bag 是一个命令行工具,用来记录发布到 topic 的数据。 我们可以通过记录的数据进行重放,方便复现结果。

ros2 bag record

ros2 bag record <topic_name> 记录指定 topic 的数据。

ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose 记录多个 topic

ros2 bag info

查看 bag 信息。

ros2 bag play

回放 bag 信息