diff --git a/src/dynamixel_motor.cpp b/src/dynamixel_motor.cpp index b659e6a90177b2d82ad987901c8d24335d1b8659..08a7a721b8a129a3a07b04a2af8d209298e18fa1 100644 --- a/src/dynamixel_motor.cpp +++ b/src/dynamixel_motor.cpp @@ -88,7 +88,10 @@ unsigned int CDynamixelMotor::from_speeds(double speed) if(speed>this->info.max_speed) speed=this->info.max_speed; - counts=fabs(speed)/0.666; + if(this->info.ext_memory_map) + counts=speed/0.229; + else + counts=fabs(speed)/0.666; return counts; } @@ -106,7 +109,10 @@ double CDynamixelMotor::to_speeds(unsigned int counts) { double speed; - speed = counts*0.666; // Taken from the datasheets (sfoix) + if(this->info.ext_memory_map) + speed=counts*0.229; + else + speed=counts*0.666; // Taken from the datasheets (sfoix) return speed; } @@ -787,12 +793,21 @@ void CDynamixelMotor::set_current_limit(double current) double CDynamixelMotor::get_speed_limit(void) { + unsigned int data; + double speed; + + this->read_register(this->registers[velocity_limit],data); + speed=this->to_speeds(data); + return speed; } void CDynamixelMotor::set_speed_limit(double speed) { + unsigned int data; + data=this->from_speeds(speed); + this->write_register(this->registers[velocity_limit],data); } @@ -995,27 +1010,60 @@ void CDynamixelMotor::move_absolute_angle(double angle,double speed,double curre void CDynamixelMotor::move_relative_angle(double angle,double speed,double current) { - unsigned int cmd[2],pos; + unsigned int data,pos; double abs_angle; - this->set_control_mode(position_ctrl); - this->read_register(this->registers[current_pos],pos); - abs_angle=angle+this->to_angles(pos); - if(abs_angle>this->info.center_angle) - abs_angle=this->info.center_angle; - else if(abs_angle<-this->info.center_angle) - abs_angle=-this->info.center_angle; - cmd[0]=this->from_angles(abs_angle); - this->write_register(this->registers[goal_pos],cmd[0]); - if(speed>this->info.max_speed) - speed=this->info.max_speed; - cmd[1]=this->from_speeds(speed); - this->write_register(this->registers[goal_speed],cmd[1]); + if(current==std::numeric_limits<double>::infinity()) + { + this->set_control_mode(position_ctrl); + this->read_register(this->registers[current_pos],pos); + abs_angle=angle+this->to_angles(pos); + if(abs_angle>this->info.center_angle) + abs_angle=this->info.center_angle; + else if(abs_angle<-this->info.center_angle) + abs_angle=-this->info.center_angle; + data=this->from_angles(abs_angle); + this->write_register(this->registers[goal_pos],data); + if(speed>this->info.max_speed) + speed=this->info.max_speed; + data=this->from_speeds(speed); + this->write_register(this->registers[goal_speed],data); + } + else + { + this->set_control_mode(current_pos_ctrl); + if(current>this->info.max_current) + current=this->info.max_current; + else if(current<-this->info.max_current) + current=-this->info.max_current; + data=(signed short int)(current*1000.0/2.69); + this->write_register(this->registers[goal_current],data); + this->read_register(this->registers[current_pos],pos); + abs_angle=angle+this->to_angles(pos); + if(abs_angle>this->info.center_angle) + abs_angle=this->info.center_angle; + else if(abs_angle<-this->info.center_angle) + abs_angle=-this->info.center_angle; + data=this->from_angles(abs_angle); + this->write_register(this->registers[goal_pos],data); + if(speed>this->info.max_speed) + speed=this->info.max_speed; + data=this->from_speeds(speed); + this->write_register(this->registers[goal_speed],data); + } } void CDynamixelMotor::move_speed(double speed) { + unsigned int data; + this->set_control_mode(velocity_ctrl); + if(speed>this->info.max_speed) + speed=this->info.max_speed; + else if(speed<-this->info.max_speed) + speed=-this->info.max_speed; + data=this->from_speeds(speed); + this->write_register(this->registers[goal_speed],data); } void CDynamixelMotor::move_pwm(double pwm_ratio) @@ -1046,6 +1094,10 @@ void CDynamixelMotor::move_current(double current) unsigned int data; this->set_control_mode(current_ctrl); + if(current>this->info.max_current) + current=this->info.max_current; + else if(current<-this->info.max_current) + current=-this->info.max_current; data=(signed short int)(current*1000.0/2.69); this->write_register(this->registers[goal_current],data); } @@ -1054,7 +1106,7 @@ void CDynamixelMotor::stop(void) { unsigned int current_position; - if(this->mode==position_ctrl) + if(this->mode==position_ctrl || this->mode==ext_position_ctrl || this->mode==current_pos_ctrl) { this->read_register(this->registers[current_pos],current_position); if(this->to_angles(current_position)>this->config.max_angle) @@ -1063,8 +1115,12 @@ void CDynamixelMotor::stop(void) current_position=from_angles(this->config.min_angle); this->write_register(this->registers[goal_pos],current_position); } - else - this->write_register(this->registers[goal_speed],0); + else if(this->mode==current_ctrl) + this->move_current(0.0); + else if(this->mode==velocity_ctrl) + this->move_speed(0.0); + else if(this->mode==pwm_ctrl) + this->move_pwm(0.0); } double CDynamixelMotor::get_current_angle(void)