ROS发布订阅的消息的种类及使用

#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:本博客主要目的是让自己加强记忆,如果对各位大神有一点点帮助那不胜荣幸,如果大佬们看到后有指正意见,非常非常欢迎留言!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值