目录
切换到工作空间的src目录下:
构建发布者
bash
catkin_create_pkg publisher std_msgs rospy roscpp
编写发布者程序:
cpp
// 1.包含头文件
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>
int main(int argc, char *argv[])
{
//设置编码
setlocale(LC_ALL,"");
//2.初始化 ROS 节点:命名(唯一)
// 参数1和参数2 后期为节点传值会使用
// 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一
ros::init(argc,argv,"talker");
//3.实例化 ROS 句柄
ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能
//4.实例化 发布者 对象
//泛型: 发布的消息类型
//参数1: 要发布到的话题
//参数2: 队列中最大保存的消息数,超出此阀值时,先进的先销毁(时间早的先销毁)
ros::Publisher pub = nh.advertise<std_msgs::String>("test",10);
//5.组织被发布的数据,并编写逻辑发布数据
//数据(动态组织)
std_msgs::String msg;
std::string msg_front = "这里是发布者发来的信息"; //消息前缀
int count = 0; //消息计数器
//发布消息前睡眠0.5秒,确保消息发布成功
ros::Duration(0.5).sleep();
//这里是每秒通过一次,剩余时间则阻塞在下面的r.sleep
ros::Rate r(1);
//节点不死
while (ros::ok())
{
//使用 stringstream 拼接字符串与编号
std::stringstream ss;
ss << msg_front << count;
msg.data = ss.str();
//发布消息
pub.publish(msg);
//加入调试,打印发送的消息
ROS_INFO("发送的消息:%s",msg.data.c_str());
//根据前面制定的发送贫频率自动休眠 休眠时间 = 1/频率;
r.sleep();
count++;//循环结束前,让 count 自增
//暂无应用
ros::spinOnce();
}
return 0;
}
在cmakelist中把:
bash
add_executable(${PROJECT_NAME}_node src/publisher.cpp)
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
)
注释去掉
构建订阅者
同样先创建包:
bash
catkin_create_pkg subscriber std_msgs rospy roscpp
然后构建订阅者节点:
cpp
// 1.包含头文件
#include "ros/ros.h"
#include "std_msgs/String.h"
//这里创建了回调函数,接收信息后传递的是std_msgs::String类型的常指针
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,"");
//2.初始化 ROS 节点:命名(唯一)
ros::init(argc,argv,"listener");
//3.实例化 ROS 句柄
ros::NodeHandle nh;
//4.实例化 订阅者 对象
ros::Subscriber sub = nh.subscribe<std_msgs::String>("test",10,doMsg);
//5.处理订阅的消息(回调函数)
ros::spin();//循环读取接收的数据,并调用回调函数处理
return 0;
}
对于cmakelist的操作相同,添加构造对象及对象所需的依赖:
cpp
add_executable(${PROJECT_NAME}_node src/subscriber.cpp)
target_link_libraries(${PROJECT_NAME}_node
${catkin_LIBRARIES}
)
然后退回到工作空间所在的下层目录,进行catkin_make编译。
编写lanch文件自动启动节点
在功能包目录下新建launch目录,下面放launch文件。形如:
bash
<launch>
<!-- screen表示输出到屏幕上 -->
<node pkg="publisher" type="publisher_node" name="talker" output="screen" />
</launch>
其中:
pkg="包名"
节点所属的包
type="nodeType"
节点类型(与之相同名称的可执行文件)
name="nodeName"
节点名称(在 ROS 网络拓扑中节点的名称)
测试运行
激活工作空间环境变量:
bash
source ./devel/setup.bash
启动:
bash
rosluanch publisher start.launch
rosluanch subscriber start.launch