ROS 语法入门学习(二)

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的帮助了。

std_msgs - ROS Wiki

打开这个网站,找相对应的数据类型即可。

数组的定义及赋值:

要用vector       

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值