使用rosserial与MX-64 DYNAMIXEL电机通信

时间:2018-08-02 02:36:56

标签: arduino ros

当我尝试使用rosserial与Arduino通信以控制MX-64电机时,每次使用rostopic pub发送消息时,都会出现此错误:

  

“数据包中的协议版本不匹配:同步丢失或rosserial_python来自与rosserial客户端不同的ros版本”

如果我删除了代码中的Dynamixel.move(X_SERVO_ID,rollint);函数,或者没有通过ROS发送任何信息,则不会有错误。我尝试了所有玫瑰色的示例,它们都工作正常,没有任何错误。

奇怪的是,即使它给我一个错误,程序仍在工作。每当我发送一条消息时,DYNAMIXEL电动机就会开始运动。

#if (ARDUINO >= 100)
 #include <Arduino.h>
#else
 #include <WProgram.h>
#endif

#include <ros.h>
#include <std_msgs/Int8.h>


ros::NodeHandle  nh;

#include <Dynamixel_Serial.h>       // Library needed to control Dynamixal servo
#include <sensor_msgs/Imu.h>

#define X_SERVO_ID 0x01 // ID which we will be set in Dynamixel too 

int rollint = 0;

void motor_cb(const std_msgs::Int8& cmd_msg) {
  rollint = ((1.00*(90-cmd_msg.data))/360)*4095;
  Dynamixel.move(X_SERVO_ID,rollint); 
}

ros::Subscriber<std_msgs::Int8> sub("MX_Motor", motor_cb);

void setup() {
  delay(100); // Give time for Dynamixel to start on power-up
  nh.initNode();
  nh.subscribe(sub);

}

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

1 个答案:

答案 0 :(得分:0)

您的Dynamixel伺服器似乎已连接到与rosserial服务器进行通信的同一串行端口。在像Uno这样的许多Arduino板中,硬件串行端口(连接Dynamixel的地方)都连接到USB串行转换器(通过USB连接ROS)。

您需要将Dynamixel连接到Arduino上的其他硬件(或software)串行,并使用Dynamixel.begin(Stream&)Dynamixel_Serial.h#L162)对其进行初始化,其中Stream&是硬件/软件序列。