【ROS通信机制实战练习】通过话题发布实现turtlesim小乌龟圆周运动

本节记录下使用ROS中的话题机制,实现turtlesim中小乌龟的圆周运动。

如果想通过话题通信机制,实现小乌龟的圆周运动,需要首先明确小乌龟的运动情况,以及所涉及的指挥运动的参数,这里需要首先手动发布一个turtlesim的节点,这里我使用roslaunch来实现小乌龟模拟器,然后再分别尝试使用C++与Python语言进行编程实现小乌龟的圆周运动

launch 文件相关

其中< node pkg=“包名” type=“节点类型” name=“此处名字可自动逸” output=“screen”/>

<launch>
    <node pkg="turtlesim" type="turtlesim_node" name="turtle1" output="screen"/>
     <node pkg="turtlesim" type="turtle_teleop_key" name="key" output="screen"/>
</launch>

launch文件需要放在对应的launch文件夹下
在这里插入图片描述
运行launch文件,使用roslaunch命令,该命令其实内部启动了 roscore,所以比较方便。打开终端,切换到项目目录下,运行下面的命令:

source ./devel/setup.bash
roslaunch plumbing_test01(您的项目名,可自定义) start_turtle.launch

然后会发现自己的屏幕上会有小乌龟了。
在这里插入图片描述
这个时候我们可以将光标定位在命令框中,通过键盘操作小乌龟的运动,但是我们希望小乌龟实现圆周运动,这个时候仅仅通过键盘实现其实不太现实,这个时候我们尝试编程实现,我们通过话题进行发布相关的数据,实现圆周运动

查看话题名称和信息的数据类型

在命令框中,使用下面的命令进行查看,然后得到乌龟运动对应的话题名称

rostopic list

在这里插入图片描述
查看topic的消息数据类型

rostopic info /turtle1/cmd_vel

在这里插入图片描述
查看该消息类型的数据结构

rosmsg info geometry_msgs/Twist

在这里插入图片描述
可以发现该消息数据类型包括了线速度和角速度,每个速度又包含了三个维度(x,y,z),这就对应了ROS运动中的 偏航(yaw)、俯仰(pitch)、横滚(roll),即右手坐标系中的:偏航(yaw)绕z轴旋转,俯仰(pitch)绕y轴旋转,横滚(roll)绕x轴旋转。由于模拟器中的乌龟为平面图,乌龟运动的线速度仅有 x 方向和角速度的 z 方向,即绕着z轴转动,将乌龟的平面作为oy平面即可。
有了以上的逐步分析, 我们接下来进行编程实现。

C++实现
#include "ros/ros.h"
#include "geometry_msgs/Twist.h"

int main(int argc,char *argv[]){
    ros::init(argc,argv,"my_control");
    ros::NodeHandle nh;
    ros::Publisher pub = nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",10);
    ros::Rate rate(10);//设置发布频率
    //组织消息
    geometry_msgs::Twist twist;
    twist.linear.x=1.0;
    twist.linear.y=0.0;
    twist.linear.z=0.0;
    twist.angular.x=0.0;
    twist.angular.y=0.0;
    twist.angular.z=0.5;
    while(ros::ok()){
        pub.publish(twist);
        //休眠
        rate.sleep();
        //回调
        ros::spinOnce();
    }
    return 0;
}
Python实现
#! /usr/bin/env python
# -*- coding:utf-8 -*-
import rospy
from geometry_msgs.msg import Twist
if __name__ == "__main__":
    rospy.init_node("pub_test_01_p")
    pub = rospy.Publisher("/turtle1/cmd_vel",Twist,queue_size=10)
    #发布频率
    rate = rospy.Rate(10)
    #确定发布数据
    twist = Twist()
    twist.linear.x = 1.0
    twist.linear.y=0.0
    twist.linear.z = 0.0
    twist.angular.x=0.0
    twist.angular.y=0.0
    twist.angular.z=0.5
    while not rospy.is_shutdown():
        pub.publish(twist)
        rate.sleep()

【注:不论C++实现还是Python实现均需要进行CMakeLists.txt的配置,然后编译运行】
运行效果如下:
在这里插入图片描述

当然以上的编程,也可以通过 rostopic pub 命令实现,-r 为循环次数,但是这里我们目的是训练编程实现,而不是ros命令,因为ros命令的操作性不太强。
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: 0.5" 
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值