【问题标题】:How to exchange data between nodes in ROS?ROS中节点之间如何交换数据?
【发布时间】:2013-12-17 10:37:09
【问题描述】:
我想将数据从一个节点发送到另一个节点。例如:一个节点正在向/mobile_base/commands/velocity主题发布数据,另一个节点订阅/mobile_base/events/bumper。订阅者和发布者都工作正常。
我想要做的是在按下保险杠后让机器人向后移动。我不知道如何将按下保险杠的事件发送到另一个节点。
我认为的解决方案是使用管道或套接字或共享内存在两个节点之间交换数据。
这是正确的方法吗?或者 ROS 有内置的方法吗?
提前致谢。
【问题讨论】:
标签:
ros
publisher
subscriber
【解决方案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;
}