#1.消息(std_msgs)的种类
在/opt/ros/melodic/include/std_msgs文件夹中查询
或参考:
https://www.itdaan.com/tw/b30f2309fe4b1b2d5993c8ea0cb4fcc0
#2. 消息类型的使用
选两种消息类型举例:std_msgs/String 和 std_msgs/Float32MultiArray
##2.1 std_msgs/String
publisher端: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;
}
引用自http://t.zoukankan.com/linuxAndMcu-p-10578837.html
subscriber端 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;
}
还是引用自http://t.zoukankan.com/linuxAndMcu-p-10578837.html
最后在Cmakelist.txt中加入以下几句话
add_executable(example1_a
src/example1_a.cpp
)
add_dependencies(example1_a ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(example1_a
${catkin_LIBRARIES}
)
add_executable(example1_b
src/example1_b.cpp
)
add_dependencies(example1_b ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
target_link_libraries(example1_b
${catkin_LIBRARIES}
)
运行验证:
在 catkin_ws (或你的工作空间)打开一个终端,输入
roscore
接续打开第二个终端(也在catkin_ws文件夹下),输入
source devel/setup.bash
catkin_make
rosrun 项目的文件夹名 example1_a
此时已经开始发布消息
接续打开第二个终端(也在catkin_ws文件夹下),输入
source devel/setup.bash
rosrun 项目的文件夹名 example1_b
此时这个终端将显示接受到的信息
##2.2 std_msgs/Float32MultiArray
publisher端:example1_a.cpp
#include "ros/ros.h"
#include "std_msgs/Float32MultiArray.h"
#include <sstream>
int main(int argc, char **argv)
{
ros::init(argc, argv, "example1_a");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<std_msgs::Float32MultiArray>("message", 1000);
ros::Rate loop_rate(1); //设置频率10Hz
while (ros::ok()) //一直运行,直到CTRL+C停止运行
{
std_msgs::Float32MultiArray msg;
msg.data = {1.1, 2.2, 3.3, 4.4};
chatter_pub.publish(msg); //发布消息
ros::spinOnce(); //如果出现订阅者,ROS会更新和读取所有主题
loop_rate.sleep(); //按频率挂起
}
return 0;
}
subscriber端:example1_b.cpp
#include "ros/ros.h"
#include "std_msgs/Float32MultiArray.h"
/*接收消息然后发布*/
void chatterCallback(const std_msgs::Float32MultiArray::ConstPtr& msg)
{
float data0 = (msg->data[0])+100;//接受的数据可以在回调函数中进一步处理,这里让接受的第一个数据+100
float data1 = (msg->data[1])+100;
float data2 = (msg->data[2])+100;
float data3 = (msg->data[3])+100;
ROS_INFO("%f, %f, %f, %f", data0, data1, data2, data3);
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "example1_b");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("message", 1000, chatterCallback); //
ros::spin(); //ros::spin()库是响应循环,消息到达时调用函数chatterCallback,CTRL+C结束循环
return 0;
其余操作与上面2.1一样
ps:本博客主要目的是让自己加强记忆,如果对各位大神有一点点帮助那不胜荣幸,如果大佬们看到后有指正意见,非常非常欢迎留言!