diff --git a/src/dynamixel_motor.cpp b/src/dynamixel_motor.cpp index e65e57f0db0bb65d0fa16c03ef2fbcf095c76da3..4a0966780f68a8cccfd81bd72589fa47c3c1e086 100644 --- a/src/dynamixel_motor.cpp +++ b/src/dynamixel_motor.cpp @@ -30,6 +30,7 @@ CDynamixelMotor::CDynamixelMotor(std::string& cont_id,unsigned char bus_id,int b this->dyn_enc_res=-1; this->dyn_max_angle=-1; this->dyn_max_speed=-1; + this->dyn_max_torque=-1; this->torque_control=false; try{ this->dyn_server->config_bus(bus_id,baudrate); @@ -44,6 +45,7 @@ CDynamixelMotor::CDynamixelMotor(std::string& cont_id,unsigned char bus_id,int b this->alarms=this->get_turn_off_alarms(); this->info.firmware_ver=this->get_firmware_version(); this->get_position_range(min,max); + this->dyn_max_torque=this->get_max_torque(); config.acceleration.resize(1); config.acceleration[0].min=0.0; config.acceleration[0].max=0.0; @@ -91,6 +93,7 @@ CDynamixelMotor::CDynamixelMotor(std::string& cont_id,std::string &bus_id,int ba this->dyn_enc_res=-1; this->dyn_max_angle=-1; this->dyn_max_speed=-1; + this->dyn_max_torque=-1; this->torque_control=false; try{ this->dyn_server->config_bus(bus_id,baudrate); @@ -105,6 +108,7 @@ CDynamixelMotor::CDynamixelMotor(std::string& cont_id,std::string &bus_id,int ba this->alarms=this->get_turn_off_alarms(); this->info.firmware_ver=this->get_firmware_version(); this->get_position_range(min,max); + this->dyn_max_torque=this->get_max_torque(); config.acceleration.resize(1); config.acceleration[0].min=0.0; config.acceleration[0].max=0.0; @@ -561,7 +565,7 @@ void CDynamixelMotor::reset_motor(void) /* do nothing - expected exception */ } try{ - this->dynamixel_dev->write_word_register(torque_limit,0x3FF); + this->dynamixel_dev->write_word_register(torque_limit,((unsigned short int)(fabs(this->dyn_max_torque)*1023.0/100.0))&0x03FF); }catch(CDynamixelAlarmException &e){ /* do nothing - expected exception */ } @@ -1444,6 +1448,48 @@ float CDynamixelMotor::get_torque(void) return torque; } +float CDynamixelMotor::get_max_torque(void) +{ + unsigned short int load; + float torque; + + if(this->dynamixel_dev==NULL) + { + /* handle exceptions */ + throw CDynamixelMotorException(_HERE_,"The dynamixel device is not properly configured."); + } + else + { + this->dynamixel_dev->read_word_register(max_torque,&load); + torque=(load&0x3FF)*100.0/1023; + if(load>0x3FF) + torque=-1*torque; + } + + return torque; +} + +float CDynamixelMotor::get_limit_torque(void) +{ + unsigned short int load; + float torque; + + if(this->dynamixel_dev==NULL) + { + /* handle exceptions */ + throw CDynamixelMotorException(_HERE_,"The dynamixel device is not properly configured."); + } + else + { + this->dynamixel_dev->read_word_register(torque_limit,&load); + torque=(load&0x3FF)*100.0/1023; + if(load>0x3FF) + torque=-1*torque; + } + + return torque; +} + CDynamixelMotor::~CDynamixelMotor() { this->close(); diff --git a/src/dynamixel_motor.h b/src/dynamixel_motor.h index c2b5a2b4df5a568c7b774c66a80e17b8064bda07..1245965a730db8226a2790ac9273ae95e2f10411 100644 --- a/src/dynamixel_motor.h +++ b/src/dynamixel_motor.h @@ -130,6 +130,11 @@ class CDynamixelMotor : public CMotorControl * */ int dyn_max_speed; + /** + * \brief + * + */ + int dyn_max_torque; protected: /** * \brief @@ -414,6 +419,16 @@ class CDynamixelMotor : public CMotorControl * */ float get_torque(void); + /** + * \brief + * + */ + float get_max_torque(void); + /** + * \brief + * + */ + float get_limit_torque(void); /** * \brief * diff --git a/src/examples/test_dynamixel_motor.cpp b/src/examples/test_dynamixel_motor.cpp index 0eeb01f6701e8cb884ea0ca8e3312aeea38347cd..20e81b32cf50724a585c0b22640a626fdaac9b41 100755 --- a/src/examples/test_dynamixel_motor.cpp +++ b/src/examples/test_dynamixel_motor.cpp @@ -19,15 +19,15 @@ int main(int argc, char *argv[]) std::vector<float> pos2(1),max(1),min(1); std::vector<float> position(1); std::vector<bool> enable(1); - std::string serial="A9007DKA"; + std::string serial="A400gaIt"; try{ if(dyn_server->get_num_buses()>0) { - cont2=new CDynamixelMotor(cont2_name,serial,1000000,12); + cont2=new CDynamixelMotor(cont2_name,serial,1000000,1); cont2->close(); delete cont2; - cont2=new CDynamixelMotor(cont2_name,serial,1000000,12); + cont2=new CDynamixelMotor(cont2_name,serial,1000000,1); enable[0]=true; cont2->enable(enable); #ifdef _HAVE_XSD @@ -37,19 +37,19 @@ int main(int argc, char *argv[]) events2.push_back(cont2->config_position_feedback(fb_polling,100.0)); #endif cont2->set_torque(100.0); - cont3=new CDynamixelMotor(cont3_name,serial,1000000,21); - enable[0]=true; - cont3->enable(enable); -#ifdef _HAVE_XSD - cont3->load_config(cont_config_file); - events3.push_back(cont3->get_position_feedback_event()); -#else - events3.push_back(cont3->config_position_feedback(fb_polling,100.0)); -#endif +// cont3=new CDynamixelMotor(cont3_name,serial,1000000,21); +// enable[0]=true; +// cont3->enable(enable); +//#ifdef _HAVE_XSD +// cont3->load_config(cont_config_file); +// events3.push_back(cont3->get_position_feedback_event()); +//#else +// events3.push_back(cont3->config_position_feedback(fb_polling,100.0)); +//#endif position=cont2->get_position(); std::cout << "Current position of device 1: " << position[0] << std::endl; - position=cont3->get_position(); - std::cout << "Current position of device 15: " << position[0] << std::endl; +// position=cont3->get_position(); +// std::cout << "Current position of device 15: " << position[0] << std::endl; vel1[0]=40.0; pos0[0]=150.0; acc1[0]=vel1[0]*vel1[0]/(0.05*pos0[0]); @@ -57,14 +57,14 @@ int main(int argc, char *argv[]) std::cout << "centering ..." << std::endl; cont2->load(pos0,vel1,acc1); cont2->move(); - event_server->wait_all(events3); - std::cout << "centering ..." << std::endl; - cont3->load(pos0,vel1,acc1); - cont3->move(); +// event_server->wait_all(events3); +// std::cout << "centering ..." << std::endl; +// cont3->load(pos0,vel1,acc1); +// cont3->move(); sleep(2); - pos1[0]=190.0; - pos2[0]=110.0; + pos1[0]=170.0; + pos2[0]=125.0; for(;;) { event_server->wait_all(events2); @@ -80,19 +80,19 @@ int main(int argc, char *argv[]) cont2->load(pos0,vel1,acc1); cont2->move(); sleep(1); - event_server->wait_all(events3); - std::cout << "servo 2 moving left ..." << std::endl; - cont3->load(pos1,vel1,acc1); - cont3->move(); - event_server->wait_all(events3); - std::cout << "servo 2 moving right ..." << std::endl; - cont3->load(pos2,vel1,acc1); - cont3->move(); - event_server->wait_all(events3); - std::cout << "servo 2 centering ..." << std::endl; - cont3->load(pos0,vel1,acc1); - cont3->move(); - sleep(1); +// event_server->wait_all(events3); +// std::cout << "servo 2 moving left ..." << std::endl; +// cont3->load(pos1,vel1,acc1); +// cont3->move(); +// event_server->wait_all(events3); +// std::cout << "servo 2 moving right ..." << std::endl; +// cont3->load(pos2,vel1,acc1); +// cont3->move(); +// event_server->wait_all(events3); +// std::cout << "servo 2 centering ..." << std::endl; +// cont3->load(pos0,vel1,acc1); +// cont3->move(); +// sleep(1); } } }catch(CException &e){