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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
卷积码的维特比译码是一种基于动态规划的算法,用于解码卷积码。以下是一种实现卷积码的维特比译码的伪代码: 1. 初始化: 1.1 设置一个大小为 K x N 的矩阵 S,其中 K 是卷积码的约束长度,N 是接收到的码字的长度。每个元素 S[i][j] 表示在第 j 个时刻,状态 i 产生接收到的码字的概率。 1.2 设置一个大小为 K x N 的矩阵 L,其中 L[i][j] 表示在第 j 个时刻,状态 i 产生接收到的码字的最大对数似然。 1.3 设置一个大小为 K x N 的矩阵 D,其中 D[i][j] 表示在第 j 个时刻,状态 i 产生接收到的码字的最大对数似然所对应的前一个状态。 1.4 设置初始状态为 S[0][0] = 1,S[i][j] = 0 (i ≠ 0),L[0][0] = 0,L[i][0] = -∞ (i ≠ 0),D[i][0] = -1 (i ≠ 0)。 2. 递推: 对于 j = 1, 2, ..., N: 2.1 对于 i = 0, 1, ..., K-1: 2.1.1 计算状态 i 产生接收到的码字的概率:S[i][j] = ∑ S[k][j-1] × p[i][k][c[j]],其中 k 是所有可以转移到状态 i 的状态,p[i][k][c[j]] 是从状态 k 到状态 i 并产生接收到的码字 c[j] 的概率。 2.1.2 计算状态 i 产生接收到的码字的对数似然:L[i][j] = log(S[i][j])。 2.1.3 记录状态 i 产生接收到的码字的最大对数似然以及对应的前一个状态:L_max = -∞,D_max = -1,对于 k = 0, 1, ..., K-1: 如果 L[k][j-1] + log(p[i][k][c[j]]) > L_max,则 L_max = L[k][j-1] + log(p[i][k][c[j]]),D_max = k。 2.1.4 记录状态 i 产生接收到的码字的最大对数似然以及对应的前一个状态:L[i][j] = L_max,D[i][j] = D_max。 3. 回溯: 3.1 从最后一个时刻 N 开始,找到最大对数似然的状态:i_max = argmax(L[i][N]),其中 argmax 是取最大值的下标。 3.2 从最后一个时刻 N 开始,依次找到对应的前一个状态,直到第一个时刻 0:s[N] = i_max,对于 j = N-1, N-2, ..., 1,s[j] = D[s[j+1]][j+1]。 3.3 返回最终得到的状态序列 s。 该伪代码实现了一个基本的卷积码的维特比译码算法。实际应用中,还需要考虑一些优化措施,如对数域算法、软判决等,以提高译码性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一蓑烟雨荏平生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值