1.首先创建 package
cd ~/catkin_ws/src catkin_create_pkg topic_demo roscpp rospy std_msgs
2. 编写 msg 文件
cd topic_demo mkdir msg cd msg vim gps.msg
将以下代码写入:
float32 x
float32 y
string state
x 是横坐标,y 是纵坐标,state 是状态
还记得以前说的吗:点击打开链接
修改 package.xml 文件:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
其中 exec_time 也可能是 run_time,看原来的 package.xml 怎么写的。
修改 CMakeLists.txt:
接下来进入工作空间:
cd ~/catkin_ws
编译:
catkin_make
如果类似这样就说明成功了。
进入 devel/include/
cd devel/include/
可以看到有我们的程序包名:
进入,可以看到生成的:
3. 编写 talker.cpp
进入 package 下的 src 目录:
cd ~/catkin_ws/src/topic_demo/src
创建 talker.cpp
vim talker.cpp
将以下代码写入:
#include <ros/ros.h> //类似 C 语言的 stdio.h
#include <topic_demo/gps.h> //要用到 msg 中定义的数据类型 int main(int argc,char **argv){
ros::init(argc,argv,"talker"); //解析参数,命名节点为 talker
ros::NodeHandle nh; //创建句柄,相当于一套工具,可以实例化 node,并且对 node 进行操作
topic_demo::gps msg; //创建 gps 消息
msg.x = 1.0; //设置 x 初值
msg.y = 1.0; //设置 y 初值
msg.state = "working"; //设置 state 初值
ros::Publisher pub = nh.advertise<topic_demo::gps>("gps_info",);//创建 publisher 对象
ros::Rate loop_rate(1.0); //创建 rate 对象,定义循环发布的频率,1 HZ
while(ros::ok()){ //只要没有关闭,一直循环
msg.x = 1.03 * msg.x; //以指数增长,每隔 1s
msg.y = 1.01 * msg.y;
ROS_INFO("Talker:GPS: x = %f,y = %f",msg.x,msg.y); //打印函数,类似 printf()
pub.publish(msg); //发布消息
loop_rate.sleep(); //根据定义的发布频率,sleep
}
return ;
}
其中 nh.advertise<topic_demo::gps>("gps_info",1);
advertise<topic_demo::gps> 是一个函数模板,<topic_demo::gps> 是将其类型定为 gps 类型,这个函数有两个参数,第一个是 topic 名称,消息在 publisher 上会先存在一个消息队列中,第二个参数决定了消息队列的长度。
保存退出,创建 listener.cpp
vim listener.cpp
将以下代码写入:
#include <ros/ros.h>
#include <topic_demo/gps.h>
#include <std_msgs/Float32.h> //ROS自带的浮点类型,类似 float,但是不同 void gpsCallback(const topic_demo::gps::ConstPtr &msg){ //回调函数,参数类型为 ConstPtr 类型的指针,它被定义在之前编译生成的 gps.h 中,指向 gps 的消息
std_msgs::Float32 distance; //声明一个距离变量 distance
distance.data = sqrt(pow(msg->x,)+pow(msg->y,)); //之所以是 distance.data,是因为 Floa32 是一个结构体,成员变量 data 才存储着值
ROS_INFO("Listener: Distance to origin = %f,state = %s",distance.data,msg->state.c_str());
} int main(int argc,char** argv){
ros::init(argc,argv,"listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("gps_info",,gpsCallback); //
ros::spin();
return ;
}
n.subscribe(),第一个参数指明需要监听哪个 topic,第二个是 subscribe 的消息队列长度,第三个参数一般是个指针,指向了处理此消息的回调函数。也就是你希望对接收到的消息进行怎么样的处理,都写在第三个参数所指向的函数中。
目前的工作已经完成的差不多了,最后
4. 修改 CMakeLists.txt
将以下语句加入
保存退出
5. 编译运行
启动 master
roscore
进入工作空间
cd ~/catkin_ws
编译
catkin_make
分别运行
rosrun topic_demo talker rosrun topic_demo listener
运行结果:
ROS手动编写消息发布器和订阅器topic demo(C++)的更多相关文章
-
SLAM+语音机器人DIY系列:(二)ROS入门——5.编写简单的消息发布器和订阅器
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
-
ROS学习(十二)—— 编写简单的消息发布器和订阅器(C++)
一.创建发布器节点 1 节点功能: 不断的在ROS网络中广播消息 2 创建节点 (1)打开工作空间目录 cd ~/catkin_ws/src/beginner_tutorials 创建一个发布器节点( ...
-
ROS 消息发布器和订阅器Publisher, Subscriber
博客参考:https://www.2cto.com/kf/201705/639776.html 1.编写发布器节点节点(Node) 是指 ROS 网络中可执行文件.接下来,将会创建一个发布器节点(“t ...
-
ROS:消息发布器和订阅器(c++)
学习资料主要源自http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29 $ roscd beginner_t ...
-
用C++编写发布器和订阅器节点
1.转移到之前教程在catkin工作空间所创建的package路径下: $ roscd package_name/ 例子:$ roscd practice/2.在package路径下创建src目录: ...
-
ROS教程2 编写简单的消息发布器和订阅器 (C++ catkin)
创建工作环境 创建文件夹,创建包 mkdir -p ~/catkin_arduino_ros/src catkin_create_pkg test1_pub_sub std_msgs rospy ro ...
-
ROS手动编写服务端和客户端service demo(C++)
service demo 原理和 topic 通信方式很像 点击打开链接,因此 1.srv : 进入 service_demo 创建 srv 文件夹,创建 Greeting.srv,将以下代码插入: ...
-
在ROS下编写自己的节点来订阅话题(C++)
参考 http://blog.csdn.net/u013453604/article/details/49102957 的博客,其实这些内容和 <开源机器人操作系统> 这本书差不多 ...
-
[转]RoboWare Studio的使用和发布器/订阅器的编写与测试
原文地址:https://blog.csdn.net/han_l/article/details/77772352,转载主要方便随时查阅,如有版权要求,请及时联系. 开始ROS学习之前,先按照官网教程 ...
随机推荐
-
Memcache之telnet操作
在telnet Memcache之前,先要确认 memcached已启用. 如:ps -ef |grep memcache netstat -elp |grep memcache 或者 netstat ...
-
jquery autocomplete实现读取sql数据库自动补全TextBox
转自我本良人 原文 jquery autocomplete实现读取sql数据库自动补全TextBox 项目需要这样子一个功能,其他部门提的意见,只好去实现了哦,搞了好久才弄出来,分享一下. 1.前台页 ...
-
c 语言 结构体
一:结构体定义结构体类型变量 三种方式1st:先声明结构体类型,再定义该类型的变量struct student liming,zhangle;2nd:声明类型的同时定义变量struct student ...
-
c enum用法
c语言中enum的用法,先用关键字enum声明一个类型如enum HUMAN {MAN ,WOMAN};这里就声明了一个HUMAN这个枚举类型.其中MAN的值为0,后面依次递增.后面要用的时候,先声明 ...
-
linux 下部署 java quartz job
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
-
Maven多模块的开发项目搭建
系统越复杂,所有的业务逻辑都放在一个项目里,各个包之间的业务逻辑相互调用,这样添加了开发成本,同时对之后的系统维护,错误排查带来一定的麻烦. 通过Maven的多模块开发,把一个系统拆分成多个模块,通过 ...
-
Myeclipse在debug模式下没加断点程序卡住,start模式下可以正常启动
参考<eclipse在debug模式下卡住,start模式下可以启动>,地址:https://blog.csdn.net/jack_chen1994/article/details/761 ...
-
二叉树查找树中序后继 &#183; Inorder Successor in Binary Search Tree
[抄题]: 给一个二叉查找树以及一个节点,求该节点的中序遍历后继,如果没有返回null [思维问题]: 不知道分合算法和后序节点有什么关系:直接return表达式就行了,它自己会终止的. [一句话思路 ...
-
BETA-4
前言 我们居然又冲刺了·四 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 过去两天完成了哪些任务 整理了一丢丢代码 接下来的计划 认真复习准备考试,挤时间把软工搞定 还剩下哪些 ...
-
P2DR模型
P2DR模型是可适应网络安全理论或称为动态信息安全理论的主要模型.P2DR模型是TCSEC模型的发展,也是目前被普遍采用的安全模型.P2DR模型包含四个主要部分:Policy(安全策略).Protec ...