前言
本人ROS小白,利用寒假时间学习ROS,在此以笔记的方式记录自己每天的学习过程。争取写满15篇(4/15)。
环境:Ubuntu20.04、ROS1:noetic
环境配置:严格按照下方学习链接的教程配置,基本一次成功。
学习链接:【Autolabor初级教程】ROS机器人入门
对应链接文档:ROS机器人入门课程《ROS理论与实践》
笔记绝大部分代码使用Python语言编写。
本期关键词:运动控制,位姿订阅,乌龟生成,更换背景
本期通过实操练习,加强自己对通信机制的理解和运用,主要实现以下操作:
- 控制乌龟做圆周运动
- 订阅乌龟实时位姿
- 在乌龟显示窗口生成新乌龟
- 更换乌龟显示窗口背景颜色
运动控制
- 在这里我先列出最基本的乌龟控制指令(键盘控制运动):
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
- 先在终端里运行以上指令。一开始可能对运动的修改没啥头绪,这时我们不妨运行
rqt_graph
指令查看计算图,结果如下图所示:![[Pasted image 20240125140916.png]] - 从计算图中可以看出乌龟的运动控制存在两个节点,节点间通过
/turtle1/cmd_vel
话题进行通信。很显然,/teleop_turtle
是话题的发布方,是运动控制节点;/turtlesim
是话题订阅方,属于显示节点。 - 要使乌龟做圆周运动,我们只需要修改话题内容即可,故我们需要自己编写运动控制节点。
- 既然要编写运动节点,我们就需要知道话题通信的消息类型,使用一下指令查看:
rostopic type /turtle1/cmd_vel
结果为:
geometry_msgs/Twist
- 知道消息类型后,我们通过rosmsg指令查看消息类型的具体内容:
rosmsg info geometry_msgs/Twist
结果为:
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
- 这里需要注意一下,这个消息类型不需要我们自定义,是ROS包里自带的,我们编写代码的时候只需要导入就行。
geometry_msgs
是 ROS中的一个内置消息包,它提供了用于表示几何信息的消息类型,如点、向量、四元数、变换(变换矩阵)等。这些消息类型在机器人编程和导航任务中非常有用,因为它们允许机器人系统的不同部分之间有效地交换关于位置、方向和姿态的信息。例如,Pose
和Twist
类型在机器人的运动规划和导航中被广泛使用。- 具体的参考以下代码:
#! usr/bin/env python
import rospy
from geometry_msgs.msg import Twist
if __name__=="__main__":
rospy.init_node("turtle_cir")
cir=rospy.Publisher("/turtle1/cmd_vel",Twist,queue_size=1000)
rate=rospy.Rate(10)
msg=Twist()
# linear.x和angular.z同时有值,乌龟即可做圆周运动
msg.linear.x=2.0
msg.linear.y=0.0
msg.linear.z=0.0
msg.angular.x=0.0
msg.angular.y=0.0
msg.angular.z=2.0
while not rospy.is_shutdown():
cir.publish(msg)
rate.sleep()
- 除了编程实现之外,还可以用指令来使乌龟做圆周运动:
rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist "linear:
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 1.0"
位姿订阅
- 执行
rostopic list
指令查看话题,/turtle1/pose
即为包含乌龟位姿信息的话题,执行rostopic echo /turtle1/pose
指令即可订阅。执行ostopic echo /turtle1/pose>save.txt
指令即可保存位姿信息。 - 也可以使用代码的方法订阅位姿,实现流程和运动控制类似,先查看话题消息的内容:
rostopic type /turtle1/pose
结果为:
turtlesim/Pose
- 使用
rosmsg
指令查看:
rosmsg info turtlesim/Pose
结果为:
float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity
- 代码如下:
#! /usr/bin/env python
import rospy
from turtlesim.msg import Pose
def doPose(data):
rospy.loginfo("turtle's pose:x=%.2f, y=%.2f,theta=%.2f",data.x,data.y,data.theta)
if __name__ == "__main__":
rospy.init_node("turtle_pose")
sub = rospy.Subscriber("/turtle1/pose",Pose,doPose,queue_size=1000)
rospy.spin()
乌龟生成
- “乌龟生成”操作的实现与服务调用相关。
- 使用
rosservice list
查看服务,其中/spawn
即为乌龟生成服务;使用rosservice type /spawn
查看服务对应的消息,得到turtlesim/Spawn
;使用rossrv info turtlesim/Spawn
指令获取消息格式,得到:
float32 x
float32 y
float32 theta
string name
---
string name
(---
之上的为客户端发送的数据,之下的为服务端返回的数据)
3. 代码实现如下:
#! usr/bin/env python
import rospy
from turtlesim.srv import Spawn,SpawnRequest,SpawnResponse
if __name__=="__main__":
rospy.init_node("turtle_create")
client=rospy.ServiceProxy("/spawn",Spawn)
# wait for service
client.wait_for_service()
# send request
req=SpawnRequest()
req.x=3
req.y=3
req.theta=0
req.name="my_turtle"
try:
response = client.call(req)
rospy.loginfo("turtle create successfully! Named: %s",response.name)
except Exception as e:
rospy.logerr("create false!")
- 注意:编写Python代码之前,要把新建的.py文件添加到CMakeLists.txt文件中,不添加的话会出现如下报错信息:
/opt/ros/noetic/bin/rosrun:/home/abc/xxx_ws/src/helloworld/scripts/test.py:usr/bin/env:解释器错误: 没有那个文件或目录
/opt/ros/noetic/bin/rosrun: 行 150: /home/abc/xxx_ws/src/helloworld/scripts/test.py: 成功
更换背景
- 背景通过参数服务器的方式来设置。
- 执行
rosparam list
命令获取参数列表,结果如下:
/turtlesim/background_b
/turtlesim/background_g
/turtlesim/background_r
- 修改参数服务器的参数方法很多,我这里只采用指令的方式来修改:
rosparam set /turtlesim/background_b 自定义数值
rosparam set /turtlesim/background_g 自定义数值
rosparam set /turtlesim/background_r 自定义数值
- 也可以在启动界面显示节点时设置背景颜色:
rosrun turtlesim turtlesim_node _background_r:=255 _background_g:=255 _background_b:=255