From 569bea33a85ad55f5a22049e8de75d9a9ca9a6f0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sergi=20Hern=C3=A0ndez=20Juan?= <shernand@iri.upc.edu>
Date: Mon, 19 Oct 2015 14:17:24 +0000
Subject: [PATCH] Solved a couple of bugs in the computation of the speed and
 effort feedback. Both in the single and group classes.

---
 src/dynamixel_motor.cpp       |  8 ++++----
 src/dynamixel_motor_group.cpp | 10 ++++------
 2 files changed, 8 insertions(+), 10 deletions(-)

diff --git a/src/dynamixel_motor.cpp b/src/dynamixel_motor.cpp
index 05a9da3..da30e7f 100644
--- a/src/dynamixel_motor.cpp
+++ b/src/dynamixel_motor.cpp
@@ -1233,7 +1233,9 @@ double CDynamixelMotor::get_current_speed(void)
   {
     try{
       this->dynamixel_dev->read_word_register(this->registers[current_speed],&data);
-      c_speed = this->to_speeds(data);
+      c_speed = this->to_speeds(data&0x03FF);
+      if(data&0x0400)
+        c_speed*=-1.0;
     }catch(CDynamixelAlarmException &e){
       /* handle dynamixel exception */
       if(e.get_alarm()&this->alarms)
@@ -1312,10 +1314,8 @@ double CDynamixelMotor::get_current_effort(void)
     try{
       this->dynamixel_dev->read_byte_register(this->registers[current_load],&data);
       c_effort = (double)((data&0x3FF)*100.0/1023);
-      if (this->get_current_speed() < 0)
-      {
+      if(data&0x0400)
 	c_effort *= -1.0;
-      }
     }catch(CDynamixelAlarmException &e){
       /* handle dynamixel exception */
       if(e.get_alarm()&this->alarms)
diff --git a/src/dynamixel_motor_group.cpp b/src/dynamixel_motor_group.cpp
index 0e86391..0e48af0 100644
--- a/src/dynamixel_motor_group.cpp
+++ b/src/dynamixel_motor_group.cpp
@@ -1211,7 +1211,9 @@ void CDynamixelMotorGroup::get_current_speed(std::vector<double> &speeds)
     {
       try{
 	this->dynamixel_dev[i]->read_word_register(this->registers[i][current_speed],&data);
-	speeds[i] = this->to_speeds(i, data);
+	speeds[i] = this->to_speeds(i, data&0x03FF);
+        if(data&0x0400)
+          speeds[i]*=-1.0;
       }catch(CDynamixelAlarmException &e){
 	/* handle dynamixel exception */
 	if(e.get_alarm()&this->alarms[i])
@@ -1225,7 +1227,6 @@ void CDynamixelMotorGroup::get_current_speed(std::vector<double> &speeds)
 void CDynamixelMotorGroup::get_current_effort(std::vector<double> &efforts)
 {
   unsigned short int c_effort;
-  unsigned short int c_speed;
 
   efforts.resize(this->servo_id.size());
 
@@ -1240,12 +1241,9 @@ void CDynamixelMotorGroup::get_current_effort(std::vector<double> &efforts)
     {
       try{
 	this->dynamixel_dev[i]->read_word_register(this->registers[i][current_load],&c_effort);
-	this->dynamixel_dev[i]->read_word_register(this->registers[i][current_speed],&c_speed);
 	efforts[i] = (double)((c_effort&0x3FF)*100.0/1023);
-	if (this->to_speeds(i, c_speed) < 0)
-	{
+	if (c_effort&0x0400)
 	  efforts[i] *= -1.0;
-	}
       }catch(CDynamixelAlarmException &e){
 	/* handle dynamixel exception */
 	if(e.get_alarm()&this->alarms[i])
-- 
GitLab