当前位置: 首页 > news >正文

4. 话题通信 ---- 发布方和订阅方cpp文件编写

本节对应赵虚左ROS书籍的2.1.2

以10hz,发布消息和消息的订阅

1) 在功能包的src文件夹下,新建cpp文件,并且写入

#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"talker");ros::NodeHandle nh;ros::Publisher pub =nh.advertise<std_msgs::String>("chatter",100);std_msgs::String msg;std::string msg_front ="hello,你好!";int count =0;ros::Rate r(10);while(ros::ok()){std::stringstream ss;ss << msg_front << count;msg.data=ss.str();pub.publish(msg);ROS_INFO("发送消息为%s",msg.data.c_str());r.sleep();count++;ros::spinOnce();}return 0;
}

代码解释        

1.1)包含ros头文件   

#include "ros/ros.h"

        包含消息类型头文件

#include "std_msgs/String.h"

1.2) 在主函数中

加入语句,防止中文乱码

setlocale(LC_ALL,"");

初始化节点

ros::init(argc,argv,"talker");

"talker"为节点名

实例化句柄

ros::NodeHandle nh;

实例化发布对象

ros::Publisher pub =nh.advertise<std_msgs::String>("chatter",10);

“chatter”为话题名,10为队列长度

组织数据

std_msgs::String msg;
std::string msg_front ="hello,你好!";
int count=0;
ros::Rate r(10);

循环发布数据

while(ros::ok())//节点不死
{std::stringstream ss;//用于拼接数据ss << msg_front << count;//拼接数据msg.data=ss.str();pub.publish(msg);//发布数据ROS_INFO("发送数据为 %s",msg.data.c_str());rate.sleep();count++;ros::spinOnce();}

2)在功能包的src文件夹下,新建cpp文件,并且写入

#include "ros/ros.h"
#include "std_msgs/String.h"
void doMsg(const std_msgs::String::ConstPtr& msg_p)
{ROS_INFO("我接受到:%s",msg_p->data.c_str());
}
int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"listener");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",100,doMsg);ros::spin();return 0;
}

代码解释:

实例化订阅对象

ros::Subscribe sub=nh.subscribe<std_msgs::String>("chatter",100,doMsg);

话题‘‘chatter’’ 必须与发布方的话题相同

100 :队列长度

doMsg :回调函数

有回调函数必须有回调循环函数

ros::spin();//回调循环函数ros::spinOnce();//在循环体中用的回调循环函数

doMsg回调函数具体写入

void doMsg(const std_msgs::String::ConstPtr& msg_p)
{ROS_INFO("接受到消息:%s",msg_p->data.c_str());
}

3) 配置CMakeLists文件

136行,149行

4)运行rosrun

rosrun <包名> <节点名>

http://www.xdnf.cn/news/40735.html

相关文章:

  • Java实现将MarkDown保留文档内容及格式输出到浏览器页面
  • 2.2/Q2,GBD数据库最新文章解读
  • 模拟算法(一)作业分析及答案
  • java lambda
  • C++入门七式——模板初阶
  • sed命令笔记250419
  • Nacos启动报错
  • BMS电池管理芯片BQ76920芯片手册详细解读
  • python基础知识点(2)
  • stack和queue
  • 借助LlamaIndex实现简单Agent
  • 多模态融合(十一): SwinFusion——武汉大学马佳义团队(二)
  • 英语四级翻译题练习文章示例
  • 生物化学笔记:医学免疫学原理23 免疫检查点分子与肿瘤免疫治疗(PD-1抑制剂黑色素瘤)
  • 最长子序列长度(LIS)--个数遍历的二分+贪心优化
  • 代码随想录背包问题完结
  • 面向AI时代与数字化转型关键期:中小企业IT人才储备计划研究分析
  • 在复杂性的迷宫里寻找路标 —— 读《人月神话》有感
  • 免费将AI生成图像放大4倍的方法
  • 如何写 commit message?
  • 细说STM32单片机FreeRTOS中断管理及其应用方法
  • 深入浅出伯努利分布:从 0‑1 随机世界到统计学习基石
  • 服务部署丨通过Docker部署AutoBangumi+qBittorrent实现自动追番
  • 云服务器性价比测评:Intel vs AMD vs Graviton
  • YuE本地部署完整教程,可用于ai生成音乐,歌曲
  • 老婆是用来爱的,不是用来吼的
  • CAN与CANFD协议说明
  • [Java · 初窥门径] Java API 文档使用说明
  • Python实例题:神经网络实现人脸识别任务
  • 离线安装elasticdump并导入和导出数据