ROS基础教程——利用Twist消息控制小乌龟画圆

前言:

⭐设备环境:VMware虚拟机、Ubuntu20.04

⭐注意:本文中的代码部分地方是需要用户手动起一个新的文件名称的,在cv上去之前注意甄别(都有中文提示的),后面还有每一步的效果案例,仅供参考

之前几期教程:

ROS入门详细教程——动手实现你的第一个程序:Hello World!-CSDN博客 

ROS基础教程——话题通信-CSDN博客

目录

前言:

之前几期教程:

一、基本原理

1.1 ROS 话题通信机制

1.2 Twist 消息定义

1.3  控制小乌龟画圆的具体过程

2、通信机制实操

2.1 实现分析

2.2 实现流程

2.3 话题与消息获取

2.4 相关python代码

功能:

准备工作

实现流程

2.5 运行程序

 3、运行结果

4、查看节点关系


一、基本原理

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.0msg.angular.z = 0.5 ),然后持续循环发布Twist消息。
  • 小乌龟运动/turtle1/cmd_vel话题被turtlesim_node节点订阅,它接收到发布的Twist消息后,按照消息中的速度指令控制小乌龟运动。由于同时存在向前的线速度和绕 Z 轴的角速度,小乌龟就会做圆周运动 。

    2、通信机制实操

            本节通过 ROS 内置的 turtlesim 案例,结合 ROS 命令获取节点、话题、消息、服务及参数信息,以编程方式实现乌龟运动控制、位姿订阅、乌龟生成和背景颜色修改,目的是熟悉和强化通信模式应用。

    2.1 实现分析

    1. 乌龟运动控制涉及两个关键节点,乌龟运动显示节点turtlesim_node可直接调用,运动控制节点原用turtle_teleop_key通过键盘控制,现需自定义。

    2. 自定义控制节点时,要先利用 ros 命令结合计算图获取与显示节点通信的话题和消息。
    3. 掌握话题和消息后,用 C++ 或 Python 编写运动控制节点,按逻辑发布消息。

    2.2 实现流程

    1. 借助计算图和 ros 命令获取话题与消息信息。

    2. 编程实现运动控制节点。
    3. 启动roscoreturtlesim_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 节点控制小乌龟画圆。

    准备工作

    1. 已知话题:/turtle1/cmd_vel

    2. 已知消息类型:geometry_msgs/Twist
    3. 运行前先启动turtlesim_node节点。

    实现流程

    1. 导包
    2. 初始化 ROS 节点
    3. 创建发布者对象
    4. 循环发布运动控制消息

    """
    编写 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(* ̄▽ ̄*)ブ 

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值