目标:
- 运行海龟仿真器,并使用命令行工具产生2只新的海龟;
- 查看3只海龟的计算图结构;
- 使用命令行工具控制一只海龟做圆周运动,并显示位置曲线。
先了解ROS核心概念:
节点(Node)——执行单元
- 执行具体任务的进程、独立运行的可执行文件;
- 不同节点可使用不同的变成语言来编写,可分布式运行在不同的主机;
- 节点在系统中的名称必须是唯一的。
节点管理器(ROS Master)——控制中心
- 为节点提供命名和注册服务;
- 跟踪和记录话题/服务通信,辅助节点相互查找、建立连接;
- 提供参数服务器,节点使用此服务器存储和检索运行时的参数。
再了解ROS的通信机制:
话题(Topic)——异步通信机制
- 节点间用来传输数据的重要总线;
- 使用发布/订阅模型,数据由发布者传输到订阅者,同一个话题可以有多个发布者或者订阅者。
消息(Message)——话题数据
- 具有一定的类型和数据结构,包括ROS提供的标准类型和用户自定义类型;
- 使用编程语言无关的.msg文件定义,编译过程中生成对应的代码文件。
服务(Service)——同步通信机制
- 使用客户端/服务器(C/S)模型,客户端发送请求数据,服务器完成处理后返回的应答数据;
- 使用编程语言无关的.srv文件定义请求和应答的数据结构,编译过程中生成对应的代码文件。
总结:
- 一般来说同一个话题可以有多个订阅者,但不建议有多个发布者。否则会造成消息混乱;
- 跨语言的.msg/.srv文件类型服务端RPC编程的.proto文件。
再看ROS常用命令(划重点内容,一般是要考的):
查看话题列表
rosnode list
查看节点信息
rosnode info /turtlesim
会输出/turtlesim的发布、订阅、服务等信息
发布话题消息
rostopic pub -r 10 /turtle3/cmd_vel geometry_msgs/Twist "linear:
x: 0.5
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.5"
查看话题消息
rostopic echo /turtle3/pose
会输出/turtle3的位置信息,显示话题的具体内容
实现目标:
- 启动ROS Master
打开一个Terminal,输入roscore
命令并执行
- 启动海龟仿真器
再打开一个Terminal,输入
rosrun turtlesim turtlesim_node
命令并执行,就可以看到海龟仿真器被打开了
- 再打开一个新的Terminal,通过rosservice调用/spawn服务产生2只新的海龟,名字分别为turtle2和trutle3。执行命令如下:
产生一只名字叫turtle2的新海龟:
rosservice call /spawn "x: 5.0
y: 5.0
theta: 0.0
name: 'turtle2'"
name: "turtle2"
产生一只名字叫turtle3的新海龟:
rosservice call /spawn "x: 3.0
y: 3.0
theta: 0.0
name: 'turtle3'"
name: "turtle3"
x、y表示新海龟出现的位置。
- 再打开一个终端,通过rostopic命令控制名称为turtle3的海龟做圆周运动
rostopic pub -r 10 /turtle3/cmd_vel geometry_msgs/Twist "linear:
x: 0.5
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.5"
-r 10 表示以10hz的速度,循环发布消息。
- 再打开一个Terminal,执行
rqt_graph
命令,查看3只海龟的计算图结构
- 再打开一个Terminal,执行
rqt_plot
命令,查看turtle3的曲线位置
总结
- 在ROS中看到/cmd_vel,不管前缀是什么都是用来控制速度的。geometry_msgs/Twist是定义好的速度控制指令,一般ROS里面都这样来定义。
- 在碰到一个命令不知道怎么使用时,可以直接输入命令按回车,会打印出帮助信息。
- 在ROS中输入指令按tab,会得到辅助信息。