从turtlesim学习ROS2节点
前言
学习ROS2的路,并不能通过学习ROS1代替,因为ROS2的“内核”不同于ROS1,必须认认真真从头开始重新学习。
Ubuntu版本:20.04
ROS版本:Foxy
学习笔记回顾
1.turtlesim
- 确认是否安装turtlesim
$ ros2 pkg executables turtlesim
---
turtlesim draw_square
turtlesim mimic
turtlesim turtle_teleop_key
turtlesim turtlesim_node
出现以上回复则说明安装成功,否则使用如下命令安装turtlesim功能包:
$ sudo update
$ sudo apt install ros-foxy-turtlesim
- 跑turtlesim_node包
$ ros2 run turtlesim turtlesim_node
小海龟模拟器如下所示:
- 让小海龟动起来
$ ros2 run turtlesim turtle_teleop_key
根据终端中的提示通过键盘控制小海龟移动
2.ROS2中的节点介绍
一个完整的机器人系统就是由多个节点组成,每个节点完成自己的工作。与ROS1不同的是ROS2中的每个可执行程序(C++,Ppthon)可以包含一个或者多个节点。
3.ROS2 run
ROS2 run命令相当于ROS1中的rosrun命令。主要从该命令启动可执行文件,命令如下:
$ ros2 run <package_name> <executable_name>
因为turtlesim_node是节点的可执行程序,就能用ros2 run启动,命令如下所示:
$ ros2 run turtlesim turtlesim_node
这样就能启动上面所示的小海龟界面。
可见功能包为turtlesim
,可执行程序为turtlesim_node
。
我们虽然直到包名和可执行程序名,但是还是不知道节点名,通过ros2 node list
查看
4.ros2 node list
当我们需要监视节点的工作情况时,这个命令非常有用。这个命令相当与ROS1中的rosnode list
。
打开一个新的终端,输入以下命令:
$ ros2 node list
可以看到返回的节点名称:
/turtlesim
我们再打开一个终端,启动小海龟键盘控制可执行程序:
$ros2 run turtlesim turtle_teleop_key
不出意外,使用ros2 node list
命令后,可以发现多了一个turtle_teleop_key
可执行文件的节点
5.重映射(比较重要)
重映射可以帮助我们重新定义节点的属性(节点名称,话题名称和服务名称等)。比如我们可以修改turtlesim_node
的节点名称,命令如下所示:
$ ros2 run turtlesim_node --ros-args --remap __node:=my_turtle
此时会和往常一样打开一个新的小海龟界面,但是和之前启动的界面并不冲突,再次查看node list如下图所示:
之所以没有冲突,是因为新开的界面的节点名称为my_turtle
,而不是turtlesim
。
6.ros2 node info
如果我们想获取节点的更多信息,需要使用该命令查询:
$ ros2 node info <node_name>
如果想了解my_turtle节点的消息:
$ ros2 node info /my_turtle
立马可以看到很多信息,有订阅者、发布者、服务和Action等信息:
/my_turtle
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/color_sensor: turtlesim/msg/Color
/turtle1/pose: turtlesim/msg/Pose
Service Servers:
/clear: std_srvs/srv/Empty
/kill: turtlesim/srv/Kill
/my_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
/my_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/my_turtle/get_parameters: rcl_interfaces/srv/GetParameters
/my_turtle/list_parameters: rcl_interfaces/srv/ListParameters
/my_turtle/set_parameters: rcl_interfaces/srv/SetParameters
/my_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
/reset: std_srvs/srv/Empty
/spawn: turtlesim/srv/Spawn
/turtle1/set_pen: turtlesim/srv/SetPen
/turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
/turtle1/teleport_relative: turtlesim/srv/TeleportRelative
Service Clients:
Action Servers:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
Action Clients:
我们可以使用该命令查看所有节点的详细信息。
总结
节点是ROS系统中的基本元素,主要完成机器人系统中的某项具体任务。
Reference:
https://docs.ros.org/en/foxy/Tutorials/Understanding-ROS2-Nodes.html
结语
本文也是基于笔者的学习和使用经验总结的,主观性较强,如果有哪些不对的地方或者不明白的地方,欢迎评论区留言交流~
为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
加群链接