本篇文章记录手写ROS消息发布器和订阅器的过程,(C++版本)
开发环境:VSCode Ubuntu18.04
开发前期准备
1 引入开发所需库文件
需要准备开发的ROS包库
2 打开已建立的ros开发文件夹,建立过程可以参见 工作空间创建和功能包创建
然后就发现 VSCode 自动导入所建立的文件夹了,下面 src 目录下的 test_tutorials 为在工作空间创建的功能包,在/test_tutorials/src 下新建 talker.cpp
假设说环境已经准备完毕,接下来就是进行开发的过程了。
手写发布器
1 代码如下
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
//以一定频率(10hz)向固定话题上发布消息(hello world + count)
int main(int argc,char **argv){
//初始化ros节点名称 唯一
ros::init(argc,argv,"talker");
ros::NodeHandle n;
//声明发布器 以std_msgs::String形式向chatter 话题名称 1000为话题缓存
ros::Publisher chatter_pub=n.advertise<std_msgs::String>("chatter",1000);
// 循环频率为10hz
ros::Rate loop_rate(10);
int count=0;
// ros::ok() 如果节点一直开着为 true 否则 为 false
while(ros::ok()){
std_msgs::String msg;
std::stringstream ss;
ss<<"hello world "<<count;
msg.data=ss.str(); // 获取消息数据
ROS_INFO("%s",msg.data.c_str());// 打印消息数据
chatter_pub.publish(msg);//发布话题消息
ros::spinOnce();//ros 回调函数 一般加上
loop_rate.sleep();//调用频率函数 休息10hz
++count; // 计数器递增
}
return 0 ;
}
2 编写 CmakeLists.txt 内容
注意打开的 CmakeLists.txt 的目录结构
然后添加下面的内容
#引入库文件
include_directories(include ${catkin_INCLUDE_DIRS})
# 生成执行文件
add_executable(talker src/talker.cpp)
# 将生成的talker 文件链接到catkin_LIBRARIES
target_link_libraries(talker ${catkin_LIBRARIES})
3 编译
打开终端切换至工作空间文件夹,输入
catkin_make
进行编译
编译成功
4 运行查看发布器是否成功
打开一个终端 启动 roscore
roscore
再打开一个终端,输入
rosrun test_tutorials talker // test_tutorials 为功能包名,talker为发布器
再打开一个终端 查看计算图
先查看是否存在 chatter 话题
rostopic list
只打开 roscore
打开 roscore 和 talker 节点
查看计算图
rosrun rqt_graph rqt_graph
则说明手写发布器成功。
手写订阅器
1 代码
#include "ros/ros.h"
#include "std_msgs/String.h"
//#include <sstream>
//回调函数参数与发布器信息类型一致
void chatterCallback(const std_msgs::String::ConstPtr& msg){
//打印监听器听到的信息
ROS_INFO("I hear [%s]",msg->data.c_str());
}
int main(int argc,char **argv){
//初始化ros节点 名称唯一
ros::init(argc,argv,"listener");
//声明ros 句柄
ros::NodeHandle n;
//声明一个订阅器 1000订阅器缓存 并调用回调函数
ros::Subscriber sub=n.subscribe("chatter",1000,chatterCallback);
//阻塞式回调 类似于
/*
while(ros::ok()){ros::spinOnce();}
*/
ros::spin();
return 0;
}
2 编写CmakeLists.txt
#引入库文件
include_directories(include ${catkin_INCLUDE_DIRS})
# 生成执行文件
add_executable(talker src/talker.cpp)
# 将生成的talker 文件链接到catkin_LIBRARIES
target_link_libraries(talker ${catkin_LIBRARIES})
# 生成执行文件
add_executable(listener src/listener.cpp)
# 将生成的talker 文件链接到catkin_LIBRARIES
target_link_libraries(listener ${catkin_LIBRARIES})
3 编译 catkin_make
4 和调试talker 一样,打开 listener
rosrun test_tutorials listener
这个为 发布者 talker
listener
计算图
以上是手写简单的消息发布器和订阅器的经过,希望对您有所帮助。