如何在ROS中的节点之间交换数据?

时间:2013-12-17 10:37:09

标签: ros publisher subscriber

我想将数据从一个节点发送到另一个节点。例如:一个节点将数据发布到主题/mobile_base/commands/velocity,另一个节点正在订阅/mobile_base/events/bumper。用户和用户都是出版商工作正常。

我想要做的是在按下保险杠后让机器人向后移动。我不知道如何将碰撞事件发送到另一个节点。

我认为解决方案是使用管道或套接字或共享内存在两个节点之间交换数据。

这是正确的做法吗?或者ROS有内置的方法吗?

先谢谢。

1 个答案:

答案 0 :(得分:1)

通过订阅“bumper”主题,该节点可以使用该数据。 (假设您正在使用C ++,正如您未提及的那样 - 理论是相同的,但显然语法会有所不同)。使用ROS网站上的示例发布/订阅代码(link)。

#include "ros/ros.h"
#include "std_msgs/String.h"

//Callback for bumper data
// this callback happens 
void bumperCallback(const std_msgs::String::ConstPtr& msg)
{
  //print received data for debugging
  ROS_INFO("I heard: [%s]", msg->data.c_str());
  //If the callback data contains "hit" - change to integer, float or whatever type your message is
  if(msg->data.c_str() == "hit")
      move_backwards();          // Call function to move the robot backwards
}

int main(int argc, char **argv)
{

  ros::init(argc, argv, "listener");
  ros::NodeHandle n;
  ros::Subscriber sub = n.subscribe("bumper", 1000, bumperCallback);
  ros::spin();

  return 0;
}