ROS:从入门到放弃(二) 发布接收不同类型消息1 - 简书
二、发布接收不同类型消息1
发布接收int类型消息
第一篇文章我们发布接收了string类型的消息.我们提到在ROS里发布的消息必须是在ROS中定义了的.就是如果你要发布一个string类型的消息,你不能直接发布一个std::string,你得发布一个std_msgs::String类型的消息.后者在ROS中才有定义.
那么发布其他类型的消息我该怎么办呢?比如现在如果我想发布一个int8类型的消息,Int8是8位整型的消息,范围从-128到127.可以想象,代码在很大程度上应该和发布string类型的代码相似.咱们先直接贴上代码,然后来找不同.首先打开一个terminal.输入下面内容
cd ~/catkin_ws/src/pub_sub_test/src
touch pub_int8.cpp
touch sub_int8.cpp
创建用来发布8位整型message的发布程序 和 接收程序。
pub_int8.cpp
#include "ros/ros.h"
#include "std_msgs/Int8.h" //#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<std_msgs::Int8>("chatter", 1000); //ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok())
{
std_msgs::Int8 msg; //std_msgs::String msg;
// std::stringstream ss;
// ss << "hello world " << count;
msg.data = count;// msg.data = ss.str();
ROS_INFO("%d", msg.data); //ROS_INFO("%f", msg.data.c_str())
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
sub_int8.cpp
#include "ros/ros.h"
#include "std_msgs/Int8.h" //#include "std_msgs/String.h"
void chatterCallback(const std_msgs::Int8::ConstPtr& msg) //void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%d]", msg->data); //ROS_INFO("I heard: [%f]", msg->data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
ros::spin();
return 0;
}
CMakeLists.txt
add_executable(pub_int8 src/pub_int8.cpp)
target_link_libraries(pub_int8 ${catkin_LIBRARIES})
add_executable(sub_int8 src/sub_int8.cpp)
target_link_libraries(sub_int8 ${catkin_LIBRARIES})
编译:
cd ~/catkin_ws
catkin_make
运行ROS 程序:
打开三个终端,
第一个输入: roscore;
第二个输入:
cd ~/catkin_ws/
source devel/setup.bash
rosrun pub_sub_test sub_int8
第三个输入:
cd ~/catkin_ws/
source devel/setup.bash
rosrun pub_sub_test pub_int8
最终结果跟(一)那片文章一样。
代码对比
首先是发布器程序
1: #include "std_msgs/Int8.h"
代替了#include "std_msgs/String.h"
这表明了,每一种不同的消息都有自己的头文件,如果我们要使用不同的消息,就首先要包含它所在的头文件.像Int8, String
这类都属于C++的标准数据类型,所以这些消息在ROS中也被划分到了std_msgs
这个名字下.消息当然还有其他大类,比如我们以后要使用类似于pose的消息,它包含在geometry_msgs这个大类里.需要包含的头文件是 #include "geometry_msgs/Pose.h"
.
2:ros::Publisher chatter_pub = n.advertise<std_msgs::Int8>("chatter", 1000);
中,
std_msgs::Int8
代替了std_msgs::String
,定义publisher的时候,它需要发布什么消息是需要指定明确的,之前是ros中的string那么现在就自然换成ros中的int8了。
3:std_msgs::Int8 msg
替换了 std_msgs::String msg
. 同样你要发布的消息的类型替换掉.
4: 发布string类型的消息的代码中连续的三行 直接被替换成了msg.data = count
.
5: ROS_INFO
中msg.data本来就是int8型的变量,可以直接print出来,对应需要在ROSINFO中表明数据类型是%d
(字符串类型是%f
).
然后是接收程序.
1:#include "std_msgs/Int8.h"
代替了#include "std_msgs/String.h"
2:chatterCallback
函数的参数由std_msgs::String::ConstPtr& msg
变成了std_msgs::Int8::ConstPtr& msg
使用ROS wiki了解你需要的数据类型怎么使用
可能经过前面两个例子你会想,我知道了两种类型变量怎么发布,可以以后会遇到N多不同的类型,我该在哪儿找我想要发布的数据类型,包含什么成员之类的呢?这就需要ROS wiki的帮助了。
打开这个网站,找相对应的数据类型即可。
数组的定义及赋值:
要用vector