Part2.1.4话题通信实际操作 C++实现

本文介绍了如何使用ROS进行话题通信,以控制小乌龟节点的运动并订阅其位姿信息。通过`/turtle1/cmd_vel`话题发布`geometry_msgs/Twist`消息来设定乌龟的线速度和角速度,实现运动控制;同时,通过`/turtle1/pose`话题订阅`turtlesim/Pose`消息来获取乌龟的位姿数据。这些实践加深了对ROS话题通信的理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.之前大家已经知道了如何去生成小乌龟节点,本节会带着大家通过话题通信去控制小乌龟进行运动,以及去订阅乌龟的运动信息。

首先,要知道控制乌龟运动的节点话题是什么
首先启动 乌龟显示节点
在这里插入图片描述
然后通过rostopic list 去查看所有的活跃话题

在这里插入图片描述
其中/turtle1/cmd_vel 是速度订阅话题,接下来要看一下该话题的消息类型,通过rostopic type /turtle1/cmd_vel

在这里插入图片描述
话题的消息类型为 geometry_msgs/Twist ,然后去看一下该消息类型的信息和参数,通过rosmsg info geometry_msgs/Twist

在这里插入图片描述
如图所示,其中的消息有线速度和角速度,各有三个方向。

2.下面通过c++来实现发布速度话题

#include "ros/ros.h"
#include "geometry_msgs/Twist.h"
/*
该节点在于使用程序去控制小乌龟的运动
首先要知道控制小乌龟运动的话题以及消息类型和格式、
rostopic list :/turtle1/cmd_vel
rostopic type /turtle1/cmd_vel  :geometry_msgs/Twist
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
*/

int main(int argc,char *argv[])
{
 ros::init(argc,argv,"contrl_turtlesim");
 ros::NodeHandle nh;
 ros::Publisher pub=nh.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel",100);//这个话题要和查询出来的话题名称保持一致
 ros::Rate loop(1);
 ros::Duration(3).sleep();
 geometry_msgs::Twist ct;
 ct.linear.x=1;  //设置要发布的数据信息
 ct.angular.z=0.785; //角速度是以弧度为单位的
  while(ros::ok)
  {

      pub.publish(ct);
      loop.sleep();
      ros::spinOnce();
  }

    
    return 0;
}

3.乌龟的位姿话题消息的获取
乌龟位姿的话题是 /turtle1/pose
在这里插入图片描述
话题的类型是 : turtlesim/Pose
消息的信息是:
float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity

4.下面通过c++来实现乌龟位姿的获取

#include "ros/ros.h"
/*
  订阅乌龟的位姿信息,并打印
  首先获取乌龟的位姿发布话题:
  rostopiclist : /turtle1/pose
rostopic type /turtle1/pose :turtlesim/Pose
rosmsg info turtlesim/Pose
消息类型:
float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity


*/
#include "turtlesim/Pose.h"
void Pose(const turtlesim::Pose::ConstPtr& msg)
{
  float x=msg->x;
  float y=msg->y;
  float theta =msg->theta;
  float lvelocity=msg->linear_velocity;
  float avelocity=msg->angular_velocity;
  ROS_INFO("X=%.2f Y=%.2f theta=%.2f lvelocity=%.2f avelocity=%.2f ",x,y,theta,lvelocity,avelocity);

}
int  main(int argc,char *argv[])
{
   ros::init(argc,argv,"turtlrsim_pose");
   ros::NodeHandle nh;
   ros::Subscriber sub=nh.subscribe("/turtle1/pose",100,Pose);
    ros::spin();
    return 0;
}

5.综上所述,相信大家对于话题通信有了更深层次的理解,下一节会开始对服务通信进行模型讲解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一蓑烟雨荏平生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值