ROS学习笔记四:用C++编写ROS发布与订阅
一、创建并编译功能包
1.1 创建功能包
在工作空间的 src 目录下创建功能包:
$ cd ~/dev/catkin_ws/src
$ catkin_create_pkg chapter2_tutorials std_msgs roscpp
1.2 编译功能包
进入工作目录下编译全部功能包:
$ cd ~/dev/catkin_ws/
$ catkin_make
如果到达100%,表示一切顺利,否则会报错停止编译。
二、创建并编译节点
2.1 创建节点
进入功能包的 src 目录下,在这个文件夹中,创建两个新文件:example1_a.cpp 和 example1_b.cpp。
example1_a.cpp(发布节点):
#include "ros/ros.h" //"ros/ros.h"包含ROS节点所有节点的必要文件
#include "std_msgs/String.h" //"std_msgs/String.h"包含消息类型
#include <sstream>
int main(int argc, char **argv)
{
ros::init(argc, argv, "example1_a"); //启动该节点并设置其名称(example1_a),该名称是唯一的
ros::NodeHandle n; //设置节点进程的句柄
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("message", 1000); //把这个节点设置成发布者,并把发布主题的类型告诉节点管理器。第一个参数是消息名称“message”,第二个参数将缓冲区设置为1000个消息
ros::Rate loop_rate(10); //设置频率10Hz
while (ros::ok()) //一直运行,直到CTRL+C停止运行
{
std_msgs::String msg; //创建消息变量,变量类型必须符合发送的要求
std::stringstream ss;
ss << " I am the example1_a node "; //要发布的消息内容
msg.data = ss.str();
chatter_pub.publish(msg); //发布消息
ros::spinOnce(); //如果出现订阅者,ROS会更新和读取所有主题
loop_rate.sleep(); //按频率挂起
}
return 0;
}
example1_b.cpp(订阅节点):
#include "ros/ros.h"
#include "std_msgs/String.h"
/*接收消息然后发布*/
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str()); //在命令行窗口显示消息内容
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "example1_b");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("message", 1000, chatterCallback); //创建一个订阅者,从主题获取以“message”为名称的消息,缓冲区为1000,处理消息句柄的回调函数chatterCallback
ros::spin(); //ros::spin()库是响应循环,消息到达时调用函数chatterCallback,CTRL+C结束循环
return 0;
}
2.2 编译节点
将下列几行代码添加到CMakeLists.txt文件中include_directories(include ${catkin_INCLUDE_DIRS})之后:
add_executable(chap2_example1_a src/example1_a.cpp)
add_executable(chap2_example1_b src/example1_b.cpp)
add_dependencies(chap2_example1_a chapter2_tutorials_generate_messages_cpp)
add_dependencies(chap2_example1_b chapter2_tutorials_generate_messages_cpp)
target_link_libraries(chap2_example1_a ${catkin_LIBRARIES})
target_link_libraries(chap2_example1_b ${catkin_LIBRARIES})
回到工作目录下,编译功能包:
$ cd ~/dev/catkin_ws/
$ catkin_make chapter2_tutorials
如果顺利编译的话,将会生成两个可执行程序 example1_a 和 example1_b 文件,默认生成可执行文件的目录是catkin工作空间的devel目录下的lib目录。
3 检验编写的节点
首先要确认在carkin_make之后加载了工作空间的环境变量,然后分别在三个新的终端运行如下命令:
$ roscore
$ rosrun chapter2_tutorials chap2_example1_a
$ rosrun chapter2_tutorials chap2_example1_b

使用rqt_graph命令能够创建一个显示当前系统运行情况的动态图形,如下图所示。example1_a 节点发布 /message 主题,同时 example1_b 节点订阅了这个主题。

ROS学习笔记四:用C++编写ROS发布与订阅的更多相关文章
- Redis学习笔记四:独立功能之发布与订阅
客户端可以通过执行 subscribe 命令订阅一个或多个频道,每当有其他客户端向被订阅的频道发送消息时,频道所有的订阅者都会收到这条消息. 客户端还可以通过执行 psubscribe 命令订阅一个或 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(四) indigo devices
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- ROS学习笔记七:在ROS中使用USB摄像头
下面是一些USB摄像头的驱动(大多数摄像头都支持uvc标准): 1 使用软件库里的uvc-camera功能包 1.1 检查摄像头 lsusb ----------------------------- ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
- ROS入门笔记(二):ROS安装与环境配置及卸载(重点)
ROS入门笔记(二):ROS安装与环境配置及卸载(重点) [TOC] 1 ROS安装步骤 1.1 ROS版本 ROS目前只支持在Linux系统上安装部署, 它的首选开发平台是Ubuntu. 发布时间 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
随机推荐
- 【nginx】【转】Nginx启动框架处理流程
Nginx启动过程流程图: ngx_cycle_t结构体: Nginx的启动初始化在src/core/nginx.c的main函数中完成,当然main函数是整个Nginx的入口,除了完成启动初始化任务 ...
- zookeeper的集群部署
1.上传安装包到集群服务器 2.解压 3.修改配置文件 进入zookeeper的安装目录的conf目录 cp zoo_sample.cfg zoo.cfg vi zoo.cfg # The numbe ...
- oracle技术总结
http://www.cnblogs.com/jimeper/ http://blog.csdn.net/dragonxiangfu http://www.boobooke.com/bbs/threa ...
- 网页中打开exe
网页上打开本地的exe文件,可以吗? 西蒙说:可以的. 方法如下: 1.定义一个私有协议,指向本地的那个exe 2.在网页上将此私有协议作为URL,点击之即可打开那个exe 3.URL中还可以包含参数 ...
- 2016/05/10 thinkphp 3.2.2 ①系统常量信息 ②跨控制器调用 ③连接数据库配置及Model数据模型层 ④数据查询
[系统常量信息] 获取系统常量信息: 如果加参数true,会分组显示: 显示如下: [跨控制器调用] 一个控制器在执行的时候,可以实例化另外一个控制,并通过对象访问其指定方法. 跨控制器调用可以节省我 ...
- 6.游戏特别离不开脚本(3)-JS脚本操作java(2)(直接解析JS公式,并非完整JS文件或者函数)
在游戏中可以考虑数据由javabean保存,逻辑方法由JS提供. public class Bean4JS { private int id; private String name; private ...
- XMU C语言程序设计实践(1)
题目: 任务1:英雄出世 炎热的夏天午后,小明正在百无聊赖地写c语言程序.忽然,电脑屏幕一阵抖动,浮现下面18×18个看似杂乱无章的数字: 32, 32, 32, 32, 32, 32, ...
- SprigMVC基础测试
创建POJO package org.entity; public class User { private int id; private String userName; private Stri ...
- HDU1045 Fire Net —— 二分图最大匹配
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others) ...
- YTU 2901: G-险恶逃生II
2901: G-险恶逃生II 时间限制: 1 Sec 内存限制: 128 MB 提交: 44 解决: 14 题目描述 SOS!!!koha is trapped in the danger ...