ROS:发布者Publisher的编程实现(C++)

目录

  • 一、话题模型
  • 二、创建功能包
  • 三、创建Publisher代码
  • 四、编译代码
  • 五、运行

一、话题模型

在这里插入图片描述
图中,我们使用ROS Master管理节点。
有两个主要节点:
Publisher,名为Turtle Velocity(即海龟的速度)
Subscriber,即海龟仿真器节点 /turtlesim
Publisher(Turtle Velocity),发布Message(即海龟的速度信息,以geometry_msgs::Twist的数据结构,包括线速度和角速度),通过Topic(/turtle1/cmd_vel)总线管道,将数据传输给Subscriber。Subscriber订阅得到的速度信息,来控制海龟发生运动。

“/turtle1/cmd_vel”这个topic是海归仿真器节点/turtlesim下自带的topic,可直接拿来用。

二、创建功能包

我们之前已经创建了工作空间了,这次我们在src文件夹创建一个新的功能包learning topic

cd ~/catkin_ws/src
catkin_create_pkg learning_topic roscpp rospy std_msgs geometry_msgs turtlesim

在这里插入图片描述

三、创建Publisher代码

步骤:
初始化ROS节点
向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型
创建消息数据
按照一定的频率循环发布消息

先以C++为例,我们需要在src里创建C++的代码文件以输入代码,文件名称为:velocity_publisher.cpp

/*** 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist*/#include <ros/ros.h>
#include <geometry_msgs/Twist.h>int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "velocity_publisher");// 创建节点句柄ros::NodeHandle n;// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);// 设置循环的频率ros::Rate loop_rate(10);int count = 0;while (ros::ok()){// 初始化geometry_msgs::Twist类型的消息geometry_msgs::Twist vel_msg;vel_msg.linear.x = 0.5;vel_msg.angular.z = 0.2;// 发布消息turtle_vel_pub.publish(vel_msg);ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", vel_msg.linear.x, vel_msg.angular.z);// 按照循环频率延时loop_rate.sleep();}return 0;
}

四、编译代码

首先需要配置CMakeLists.txt中的编译规则:
设置需要编译的代码和生成的可执行文件
设置链接库
将下列代码拷贝至CMakeLists.txt中:

add_executable(velocity_publisher src/velocity_publisher.cpp)
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})

放在如下位置
在这里插入图片描述

回到工作空间目录,执行编译.

cd ~/catkin_ws
catkin_make

我们之后每次运行这个程序都需要source一下devel/setup.bash,我们不妨将
source devel/setup.bash放入环境变量.bashrc中。

五、运行

roscore

在这里插入图片描述

rosrun turtlesim turtlesim_node

在这里插入图片描述

rosrun learning_topic velocity_publisher

海龟就按照我们之前代码中设定的线速度和角速度画圆啦!
在这里插入图片描述
参考视屏:古月居ROS入门21讲
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/251744.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

GlobalMapper20:10分钟根据CAD、shp等离散高程点生成一份精准边界的地形数据

序&#xff1a; 做工程设计&#xff0c;规划设计也好&#xff0c;经常性需要地形数据&#xff0c;而到手的数据多数为excel、txt等文本文件&#xff0c;或者等高线等cad文件。 设计方案汇报是设计项目经理的主要职责&#xff0c;经常需要把设计中的地形&#xff08;shp、cad、…

CAD中怎么批量标注坐标?CAD批量标注坐标​

在CAD绘图过程中&#xff0c;当需要进行有大量CAD坐标标注时&#xff0c;该如何操作呢&#xff1f;下面就来和小编一起来了解一下浩辰CAD建筑中关于批量标注普通坐标的相关操作步骤吧&#xff01; CAD批量标注普通坐标操作步骤&#xff1a; 首先打开浩辰CAD建筑软件&#xff…

ARCGIS格式转CAD时保留其图层、高程及颜色的方法

ARCGIS格式转CAD时保留其图层、高程及颜色的方法 一.转换时&#xff0c;保留高程值 通常情况&#xff0c;shp转CAD格式过程中会丢失某些需要的字段&#xff08;如高程&#xff09;&#xff0c;这是因为CAD无法识别这些字段。如果需要保留某字段的信息&#xff0c;转换之前需添…

CAD导入Revit缺少东西原因-Revit中如何批量导出CAD图纸

一、CAD导入Revit缺少东西原因汇总 在Revit中导入CAD进行模型搭建是建模过程中常用的方法&#xff0c;但是有时会遇到导入的CAD缺少东西的情况&#xff0c;下面介绍几种导致这种问题的原因 1.CAD导入的时候&#xff0c;不是设置为全部可见。 CAD导入Revit中时&#xff0c;“图层…

CAD图纸导入REVIT内并精准建模

整体原理逻辑&#xff1a; 1、CAD图纸(原点至原点&#xff09;导入&#xff0c;作为建模参考底图&#xff0c;此刻测量点、项目基点位置都与CAD图纸原点重合。 2、测量点位置不动&#xff08;目的是为了保障明确参考坐标系原点的坐标&#xff09;&#xff0c;挪动项目基点位置…

CAD中怎么绘制攒尖屋顶?CAD设计攒尖屋顶技巧

在给排水CAD设计中&#xff0c;有些时候为了需要会在图纸中绘制攒尖屋顶&#xff0c;那么你知道CAD软件中怎么构造攒尖屋顶三维模型吗&#xff1f;其实很简单&#xff0c;浩辰CAD给排水软件中提供了实用的攒尖屋顶功能&#xff0c;下面就和小编一起来看看浩辰CAD给排水软件中CA…

CAD中如何识别CAD标高范围?

说到CAD标高&#xff0c;相信很多CAD制图初学入门小伙伴都有所了解&#xff0c;那么浩辰CAD给排水软件中如何识别标高范围呢&#xff1f;接下来的CAD制图初学入门教程就让小编来给大家介绍一下正版CAD软件——浩辰CAD给排水软件中识别CAD标高范围的相关操作技巧吧&#xff0c;感…

CAD地形图等高线标高批量取整工具,解决等高线标高出现小数的问题,等高线高程批量取整,在指定限差内将等高线标高修改为最接近的整数

目录 一、实现效果 二、实现过程 1.暴露等高线标高 2.获取标高小数 3.标高取整 4.标高重新赋值及数据分类输出 5.工具封装 地形图等高线要求高程值须为整数&#xff0c;而在实际生产中&#xff0c;因为某些原因&#xff0c;会出现部分等高线的标高不为整数的情况&#x…

Revit中导入的CAD标高不统一处理及“标高管理”

一、Revit中如何处理导入的CAD标高不统一情况 在Revit中CAD时&#xff0c;尤其是在导入地形CAD文件时&#xff0c;有时会遇到导不进去的情况&#xff0c;这有可能是导入的CAD文件某一个图层标高过大&#xff0c;超出一定范围的原因&#xff0c;如图1所示。 对于这种问题&#x…

CAD中怎么识别标高范围?CAD标高范围识别技巧

说到CAD标高&#xff0c;相信很多CAD制图初学入门小伙伴都有所了解&#xff0c;那么浩辰CAD给排水软件中如何识别标高范围呢&#xff1f;接下来的CAD制图初学入门教程就让小编来给大家介绍一下正版CAD软件——浩辰CAD给排水软件中识别CAD标高范围的相关操作技巧吧&#xff0c;感…

CAD中怎么标注井底标高?CAD井底标高教程

在绘制CAD图纸的过程中&#xff0c;经常会需要添加各种CAD标注&#xff0c;比如&#xff1a;尺寸标注&#xff0c;角度标注等。但是井标注可能很多小伙伴没有听过&#xff0c;接下来的CAD教程就让小编来给大家介绍一下浩辰CAD给排水软件的专业CAD标注中井标注的相关使用技巧吧&…

STM32中TIM对应的引脚

高级控制定时器&#xff08;TIM1与TIM8&#xff09; 通用定时器&#xff08;TIM2~TIM5&#xff09; 基本定时器&#xff08;TIM6与TIM7&#xff09;

td是什么意思php,td是什么意思?

td是大家在生活中或电脑中都很常见的&#xff0c;那么td到底是什么意思呢&#xff1f; 1.有很多英文就算大家不知道什么意思&#xff0c;也经常会见到&#xff0c;td就算其中一个&#xff0c;无论是生活中还是网络中都经常会见到&#xff0c;那么td到底是什么意思呢&#xff0c…

STM32小白学习反思笔记——TIM

我的目标学习任务是使用STM32F429IG&#xff08;挑战者&#xff09;的基本定时器控制LED灯每隔0.5s闪烁一次。 首先我使用了CUBEMX工具进行基础部分配置&#xff0c;配置SYS&#xff0c;Debug为serial wire&#xff0c;RCC的HSE选择crystal/ceramic resonator。 一、设置clock …

TIM输出比较(PWM)

目录 一、输出比较 二、PWM简介 三、通用定时器的输出比较模块怎样输出PWM波形 四、输出比较8种模式 模式的介绍 &#xff08;1&#xff09;冻结 &#xff08;2&#xff09;匹配时电平翻转 &#xff08;3&#xff09;CNT与CCR无效&#xff0c;REF强制为无效电平或者有效电…

TIM_ClockDivision的认识

定时器计时&#xff0c;在目标中的波形&#xff08;例子&#xff09; TIM_ClockDivision TIM_ClockDivision设置了时钟分割。该参数取值见下表。 如图1&#xff0c;TIM_ClockDivision 的作用是做一段延时&#xff0c;一般在特殊场合的时候会用到。 如下图所示&#xff1a;TIM_…

TIM输出比较——PWM

目录 前言 一、什么是输出比较 二、什么是PWM 1. PWM的相关参数&#xff1a; 2.PWM的应用场景&#xff1a; 3.占空比 三.输出比较的几种模式&#xff1a; 四&#xff0c;输出比较的极性 五&#xff0c;在输出比较中,TIM常用函数 六&#xff0c;同一个定时器不同通道输出PWM的特…

stm32定时器中TIM_ICInit、TIX、ICX、TIXFPX是什么

看这个函数&#xff0c;使用时&#xff0c;需要定义一个结构体变量&#xff0c;结构体变量里面填充数据&#xff0c;然后传入TIM_ICInit进行初始化。 TIM_ICInit中&#xff0c;需要用到结构体变量的5个成员&#xff1a; 这个函数里面怎么样进行的呢&#xff1f; void TIM…

通俗理解TIM定时器并简单使用

前言&#xff1a;本文章部分代码参考自野火的例程 本人使用的是野火家的指南者开发板&#xff0c;芯片型号是STM32f103VET6 有纰漏请指出&#xff0c;转载请说明。 学习交流请发邮件 1280253714qq.com 源代码在这里 1 定时器原理 B站这位UP主讲51单片机定时器工作原理 讲得很好…

TIM_Prescaler与TIM_ClockDivision区别

TIM_Prescaler单纯的是分频&#xff0c;含义为设置分频系数用以做总线频率的分母 TIM_ClockDivision 搜索Division可得此寄存器&#xff0c;由此可知此函数控制tDTS参数&#xff0c;再次搜索tdts即可得出在其他几个寄存器的连带作用 由上可知&#xff0c;这几个功能或寄存器都…