ROS:节点已订阅主题但未收到消息

时间:2018-07-12 16:18:31

标签: arduino ros

我的硬件是Romi32U4。 我的串行节点是cmd_vel主题的订阅者,并且有一种方法可以将Twist转换为左右速度。我可以通过手动发布Twist消息来移动机器人。

现在,我想使用turtlebot3_teleop发布Twist消息。我已经按照电子手册教程设置了远程PC。根据rqt_graph,teleop正在发布到cmd_vel,串行节点也在订阅cmd_vel。当我回显cmd_vel时,可以获得值。但是,串行节点没有响应。不调用回调函数。我不知道为什么串行节点在收到Twist消息(应通过Teleop发布)时应执行回调函数。

这是我的课程:

#define USE_USBCON
#include <Romi32U4.h>
#include <ros.h>
#include <geometry_msgs/Twist.h>
#include <std_msgs/Float32.h>

Romi32U4Motors motors;

ros::NodeHandle_<ArduinoHardware, 6, 6, 150, 150> nh;
std_msgs::Float32 left_msg;
ros::Publisher left_vel_pub("chatter", &left_msg);

std_msgs::Float32 right_msg;
ros::Publisher right_vel_pub("chatter", &right_msg);


//call back
void msgTwist(const geometry_msgs::Twist& twist_msg){
  float wheel_dist = 13;

  float linear_vel = twist_msg.linear.x * 2000;
  float angle_vel = twist_msg.angular.z * 15; 

  float right_sp = (angle_vel*wheel_dist)/2 + linear_vel;
  float left_sp = linear_vel*2 - right_sp;

  left_msg.data = left_sp;
  left_vel_pub.publish( &left_msg );

  right_msg.data = right_sp;
  right_vel_pub.publish( &right_msg );

  motors.setSpeeds(left_sp, right_sp)
}

ros::Subscriber<geometry_msgs::Twist> sub("cmd_vel", &msgTwist);

void setup() {
  nh.initNode();  
  nh.advertise(left_vel_pub);
  nh.advertise(right_vel_pub);
  nh.subscribe(sub);
}

void loop() {
  nh.spinOnce();
}

1 个答案:

答案 0 :(得分:0)

我解决了自己的问题。问题是回调函数的延迟。 turtlebot3_teleop继续发送消息。延迟会减慢接收消息的速度,并最终导致串行节点崩溃。只需删除延迟即可解决问题。