前言:
⭐设备环境:VMware虚拟机、Ubuntu20.04
⭐注意:本文中的代码部分地方是需要用户手动起一个新的文件名称的,在cv上去之前注意甄别(都有中文提示的),后面还有每一步的效果案例,仅供参考
之前几期教程:
目录
一、基本原理
1.1 ROS 话题通信机制
ROS 采用分布式架构,各个功能模块以节点形式独立运行,节点间通过话题通信。在控制小乌龟画圆场景中,存在发布者节点和订阅者节点:
- 发布者节点:负责创建并发送
Twist
消息,该消息包含了控制小乌龟运动的速度指令。 - 订阅者节点:即
turtlesim_node
(小乌龟仿真节点),它订阅特定话题(如/turtle1/cmd_vel
),接收发布者发送的Twist
消息,并根据消息内容控制小乌龟运动。
1.2 Twist 消息定义
Twist
消息属于geometry_msgs
消息包,用于描述物体的线速度和角速度。其包含两个关键部分:
- 线速度(linear): 表示物体在三维空间中沿 X、Y、Z 轴方向的直线运动速度。在控制小乌龟画圆时,通常只需要设置沿 X 轴的线速度,即
msg.linear.x
,让它有一个向前运动的速度分量。 - 角速度(angular): 表示物体绕 X、Y、Z 轴的旋转速度。画圆时,一般设置绕 Z 轴的角速度,即
msg.angular.z
,让小乌龟产生转向的效果。
1.3 控制小乌龟画圆的具体过程
-
启动相关节点:先启动
roscore
以运行 ROS Master,为节点通信搭建基础;再启动turtlesim_node
节点,打开小乌龟仿真界面。 - 发布
Twist
消息:编写发布者节点代码,初始化 ROS 节点,创建发布者对象并指定发布话题为/turtle1/cmd_vel
,消息类型为Twist
。在代码中设置合适的线速度和角速度值(如msg.linear.x = 1.0
,msg.angular.z = 0.5
),然后持续循环发布Twist
消息。 - 小乌龟运动:
/turtle1/cmd_vel
话题被turtlesim_node
节点订阅,它接收到发布的Twist
消息后,按照消息中的速度指令控制小乌龟运动。由于同时存在向前的线速度和绕 Z 轴的角速度,小乌龟就会做圆周运动 。
2、通信机制实操
本节通过 ROS 内置的 turtlesim 案例,结合 ROS 命令获取节点、话题、消息、服务及参数信息,以编程方式实现乌龟运动控制、位姿订阅、乌龟生成和背景颜色修改,目的是熟悉和强化通信模式应用。
2.1 实现分析
-
乌龟运动控制涉及两个关键节点,乌龟运动显示节点
turtlesim_node
可直接调用,运动控制节点原用turtle_teleop_key
通过键盘控制,现需自定义。 - 自定义控制节点时,要先利用 ros 命令结合计算图获取与显示节点通信的话题和消息。
- 掌握话题和消息后,用 C++ 或 Python 编写运动控制节点,按逻辑发布消息。
2.2 实现流程
-
借助计算图和 ros 命令获取话题与消息信息。
- 编程实现运动控制节点。
- 启动
roscore
、turtlesim_node
和自定义控制节点,查看结果。
2.3 话题与消息获取
准备:先启动键盘控制乌龟运动案例。
- 1.1 话题获取
- 获取话题:
/turtle1/cmd_vel
- 可通过
rqt_graph
启动计算图查看,或用rostopic list
列出话题。
- 获取话题:
- 1.2 消息获取
- 获取消息类型:
geometry_msgs/Twist
- 用
rostopic type /turtle1/cmd_vel
获取消息类型,用rosmsg info geometry_msgs/Twist
获取消息格式。
- 获取消息类型:
- 因此,我们只需要在我们的工作空间(工作空间的新建可以参考我之前两篇文章,步骤完全一致,这里不再赘述了)中依次键入这几句指令代码后,再写一个(在2.4部分)相关的python代码文件即可运行:
-
rostopic type /turtle1/cmd_vel rosmsg info geometry_msgs/Twist
2.4 相关python代码
功能:
编写 ROS 节点控制小乌龟画圆。
准备工作
-
已知话题:
/turtle1/cmd_vel
- 已知消息类型:
geometry_msgs/Twist
- 运行前先启动
turtlesim_node
节点。
实现流程
- 导包
- 初始化 ROS 节点
- 创建发布者对象
- 循环发布运动控制消息
"""
编写 ROS 节点,控制小乌龟画圆准备工作:
1.获取topic(已知: /turtle1/cmd_vel)
2.获取消息类型(已知: geometry_msgs/Twist)
3.运行前,注意先启动 turtlesim_node 节点实现流程:
1.导包
2.初始化 ROS 节点
3.创建发布者对象
4.循环发布运动控制消息
"""
#!/usr/bin/env python
import rospy
from geometry_msgs.msg import Twist
if __name__ == "__main__":
# 2.初始化 ROS 节点
rospy.init_node("control_circle_p")
# 3.创建发布者对象
pub = rospy.Publisher("/turtle1/cmd_vel",Twist,queue_size=1000)
# 4.循环发布运动控制消息
rate = rospy.Rate(10)
msg = Twist()
msg.linear.x = 1.0
msg.linear.y = 0.0
msg.linear.z = 0.0
msg.angular.x = 0.0
msg.angular.y = 0.0
msg.angular.z = 0.5
while not rospy.is_shutdown():
pub.publish(msg)
rate.sleep()
2.5 运行程序
这部分和之前几篇教程中的与逆行方法一样,这里就不再赘述了,详情请参考第一二篇ROS基础教程,链接🔗我放在本文的开头了,都是修改配置文件(CamkeLists.txt文件)并保存,进入工作空间后,再执行rosrun等命令。
ps:记得在运行前先启动小乌龟
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
3、运行结果
4、查看节点关系
rqt_graph
至此,项目整体结束,因本博客写于完成后的一段时间的回忆版,有些地方可能不够详尽,有错漏或不明白的地方,欢迎大家在评论区讨论o(* ̄▽ ̄*)ブ