我的硬件是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();
}
答案 0 :(得分:0)
我解决了自己的问题。问题是回调函数的延迟。 turtlebot3_teleop继续发送消息。延迟会减慢接收消息的速度,并最终导致串行节点崩溃。只需删除延迟即可解决问题。