目录
一、ROS2节点
1.概念
在ROS2中,每个节点都负责单一模块,不比如轮子的电机或者是传感器的数据等。每个节点都可以接受和发送信息,这些信息通过话题,服务,动作或者是参数服务器进行传递。
所有的机器人系统都由许都节点组成。在ROS2中每个可执行文件(C++程序或者python文件)可以保护多个或者单个节点。
2.实例
(1)ros2 run
ros2 run <package_name> <executable_name>
比如我们打开小海龟的功能包:
ros2 run turtlesim turtlesim_node
其中turtlesim为功能包名称,可执行程序的名称为turtlesim_node。
(2)ros2 node list
如果我需要查询目前运动的节点,可以直接使用该语句进行查找。
在终端中则会显示:
(3)remapping重映射
节点重映射运行修改节点原始的属性(名字,话题名,服务属性等)
这里我们测试修改turtle_teleop_key
的属性。
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
这里将节点名称修改为了:
/my_turtle
可以使用ros2 node list进行查看。
(4)ros2 node info
将刚刚重映射的话题,查看节点信息:
ros2 node info /my_turtle
有兴趣的读者可以查看一下原始节点的信息发现那里做出了更改。
二、话题
ROS2将复杂的系统分解为多个模块的节点,话题则是充当节点之间信息交换的总线。
节点可以将数据发布到任意数量的话题,并同时订阅任意数量的话题。
使用rqt_graph我们可以清晰的看见节点和话题之间的关系。
打开小海龟和控制小海龟键盘的节点:
/teleop_turtle节点发布数据给/turtle1/cmd_vel话题,这个话题将数据传递给/my_turtle节点。对于一个比较复杂的系统可以使用rqt很方便的看清楚程序内部话题节点信息接收关系。
(1) ros2 topic list
该语句可现实当前的话题,如果在指令的后面带上-t选项则可以显示出话题的类型
(2) ros2 topic echo
如果已知话题的名字,可以使用该语句输出话题的信息在终端当中。
ros2 topic echo <topic_name>
ros2 topic echo /turtle1/cmd_vel
如果此时你移动键盘方向键:
(3) ros2 topic info
ros2 topic info /turtle1/cmd_vel
这个语句和node info类似,终端会输出话题的类型发送和接受者的相关信息。
(4)ros2 inerface show
如果我们需要查询一个话题使用的类型是有那些信息可以使用该语句,话题的类型可以通过
ros2 topic list -t
ros2 interface show geometry_msgs/msg/Twist
(5) ros2 topic pub
同时我们也可以在终端中发布和修改话题,该语句的使用格式:
ros2 topic pub <topic_name> <msg_type> '<args>'
我们需呀知道话题的名称,话题发布信息的类型,args则是按照话题的类型输入的信息(ROS2中规定要以yaml的格式进行输入)。
比如我希望小海龟x轴移动2,z轴旋转1.8弧度。
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表示发布出这个信息后就退出。
可以看见小海龟转动了1/4圈,当然如果你希望它一直旋转则可以设置发布的频率:
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}}"
这里需要去除--once选项,并且加上--rate 1表示这个话题以1HZ的形式进行发布,这样我们可以看见小海龟一直在花圈运动。
当然最后你也可以去rqt_graph中查看话题和节点的变换。
(6)ros2 topic hz
改语句在终端中输出需要查询话题的频率。
ros2 topic hz /turtle1/pose
三、服务
服务通信是是ROS中的另一种通信方式。这种方式不同于发布于订阅的方式,服务通讯可以理解为呼叫和响应的模型。多个节点使用同一个服务通信,只能是一个进行。
(1) ros2 service list
运行该语句会再终端中输出目前运行的服务通信:
可以看出一个节点中带有6个参数的名字,在ROS2中几乎大部分的服务都是这样的结构。
同样的如果在最后加上-t 则可以显示出服务的类型。
(2)ros2 services type
该语句的作用是查看服务的类型。服务的类型类似于话题。服务有两个部分组成:
信息的请求+响应
ros2 service type <service_name>
ros2 service type /clear
Empty类型表示的是这个服务没有发送任何请求和响应。
(3)ros2 service find
如果你知道服务使用的类型,想找到服务的名字则可以使用:
ros2 service find std_srvs/srv/Empty
(4)ros2 service call
如果你知道服务的名字和类型,则可以调用这个服务:
#ros2 service call <service_name> <service_type> <arguments>
ros2 service call /clear std_srvs/srv/Empty
如果你打开了小海龟的节点,并且使用键盘控制运行了一段轨迹。启动这个服务会发现小海龟走的路径都被清除了。
同时我们可以再对/spawn进行操作
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"
我们再次调用/spawn这个服务,并且在小海龟串口中再生成一只,同时指定了小海龟的位姿。
服务的小总结:
对比话题:话题可以一对多,一个发布者多个订阅者。服务式一种请求/响应模式,客户端提出请求,服务段生成响应。是只能单独进行的。
未完待更新...