ROS学习笔记4:通信机制实操

前言

本人ROS小白,利用寒假时间学习ROS,在此以笔记的方式记录自己每天的学习过程。争取写满20篇(4/20)。
环境:Ubuntu20.04、ROS1:noetic
环境配置:严格按照下方学习链接的教程配置,基本一次成功。
学习链接:【Autolabor初级教程】ROS机器人入门
对应链接文档:ROS机器人入门课程《ROS理论与实践》
笔记绝大部分代码使用Python语言编写。
本期关键词:运动控制,位姿订阅,乌龟生成,更换背景

本期通过实操练习,加强自己对通信机制的理解和运用,主要实现以下操作:

  • 控制乌龟做圆周运动
  • 订阅乌龟实时位姿
  • 在乌龟显示窗口生成新乌龟
  • 更换乌龟显示窗口背景颜色

运动控制

  1. 在这里我先列出最基本的乌龟控制指令(键盘控制运动):
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
  1. 先在终端里运行以上指令。一开始可能对运动的修改没啥头绪,这时我们不妨运行rqt_graph指令查看计算图,结果如下图所示:![[Pasted image 20240125140916.png]]
  2. 从计算图中可以看出乌龟的运动控制存在两个节点,节点间通过/turtle1/cmd_vel话题进行通信。很显然,/teleop_turtle是话题的发布方,是运动控制节点;/turtlesim是话题订阅方,属于显示节点。
  3. 要使乌龟做圆周运动,我们只需要修改话题内容即可,故我们需要自己编写运动控制节点。
  4. 既然要编写运动节点,我们就需要知道话题通信的消息类型,使用一下指令查看:
rostopic type /turtle1/cmd_vel

结果为:
geometry_msgs/Twist
  1. 知道消息类型后,我们通过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
  1. 这里需要注意一下,这个消息类型不需要我们自定义,是ROS包里自带的,我们编写代码的时候只需要导入就行。
  2. geometry_msgs 是 ROS中的一个内置消息包,它提供了用于表示几何信息的消息类型,如点、向量、四元数、变换(变换矩阵)等。这些消息类型在机器人编程和导航任务中非常有用,因为它们允许机器人系统的不同部分之间有效地交换关于位置、方向和姿态的信息。例如,PoseTwist 类型在机器人的运动规划和导航中被广泛使用。
  3. 具体的参考以下代码:
#! 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()
  1. 除了编程实现之外,还可以用指令来使乌龟做圆周运动:
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" 

位姿订阅

  1. 执行rostopic list指令查看话题,/turtle1/pose即为包含乌龟位姿信息的话题,执行rostopic echo /turtle1/pose指令即可订阅。执行ostopic echo /turtle1/pose>save.txt指令即可保存位姿信息。
  2. 也可以使用代码的方法订阅位姿,实现流程和运动控制类似,先查看话题消息的内容:
rostopic type /turtle1/pose 

结果为:
turtlesim/Pose
  1. 使用rosmsg指令查看:
rosmsg info turtlesim/Pose 

结果为:
float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity
  1. 代码如下:
#! /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()

乌龟生成

  1. “乌龟生成”操作的实现与服务调用相关。
  2. 使用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!")
  1. 注意:编写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: 成功

更换背景

  1. 背景通过参数服务器的方式来设置。
  2. 执行rosparam list命令获取参数列表,结果如下:
/turtlesim/background_b
/turtlesim/background_g
/turtlesim/background_r
  1. 修改参数服务器的参数方法很多,我这里只采用指令的方式来修改:
rosparam set /turtlesim/background_b 自定义数值
rosparam set /turtlesim/background_g 自定义数值
rosparam set /turtlesim/background_r 自定义数值
  1. 也可以在启动界面显示节点时设置背景颜色:
rosrun turtlesim turtlesim_node _background_r:=255 _background_g:=255 _background_b:=255

往期内容

  1. ROS学习笔记1:基础知识
  2. ROS学习笔记2:话题通信
  3. ROS学习笔记3:服务通信与参数服务器
  4. ROS常用命令记录

你可能感兴趣的:(学习,笔记,python,c++,vscode)