diff --git a/src/dynamixel_robot_gazebo.cpp b/src/dynamixel_robot_gazebo.cpp index ebf54b376ee1672ebf3240a14c7b2e65fe3c9558..ad32ccf511141268c5de4ea355193444fdc79604 100644 --- a/src/dynamixel_robot_gazebo.cpp +++ b/src/dynamixel_robot_gazebo.cpp @@ -166,9 +166,9 @@ namespace dynamixel_robot_gazebo try{ dynamixel_nh.getParam("protocol_version", protocol); if(protocol==1) - this->dyn_slave=new CDynamixelSlaveSerial(root_nh.getNamespace()+"_slave",device_name,dyn_version1); + this->dyn_slave=new CDynamixelSlaveSerial(name+"_slave",device_name,dyn_version1); else if(protocol==2) - this->dyn_slave=new CDynamixelSlaveSerial(root_nh.getNamespace()+"_slave",device_name,dyn_version2); + this->dyn_slave=new CDynamixelSlaveSerial(name+"_slave",device_name,dyn_version2); else { ROS_ERROR_STREAM("Dynamixel gazebo plugin: Invalid protocol version"); diff --git a/src/dynamixel_servo.cpp b/src/dynamixel_servo.cpp index 3a72ed4b3d1cb3e7ffe8ff3eac7dcd68311d19fc..0a054937d11f2a44ef01968dc1027c73a64a2175 100644 --- a/src/dynamixel_servo.cpp +++ b/src/dynamixel_servo.cpp @@ -114,6 +114,11 @@ namespace dynamixel_robot_gazebo } else if(model=="XL320") { + this->encoder_res=1023; + this->max_angle=300.0; + this->gear_ratio=238.0; + this->max_torque=0.39; + this->max_speed=684.0; this->init_pid(joint_name,controller_nh); } else if(model=="XL430") @@ -166,6 +171,12 @@ namespace dynamixel_robot_gazebo *((unsigned short int *)&this->memory[82])=gains.d_gain_; *((unsigned short int *)&this->memory[84])=gains.d_gain_; } + else if(this->model=="XL320") + { + this->memory[27]=gains.d_gain_; + this->memory[28]=gains.i_gain_; + this->memory[29]=gains.p_gain_; + } } } @@ -326,6 +337,33 @@ namespace dynamixel_robot_gazebo this->memory[35]=3; } } + else if(model=="XL320") + { + this->memory[0]=94; + this->memory[1]=1; + this->memory[3]=this->id; + this->memory[4]=1; + this->memory[5]=250; + this->memory[8]=255; + this->memory[9]=3; + this->memory[11]=2; + this->memory[12]=65; + this->memory[13]=60; + this->memory[13]=90; + this->memory[15]=255; + this->memory[16]=3; + this->memory[17]=2; + this->memory[18]=7; + // initialize RAM + this->memory[27]=0; + this->memory[28]=0; + this->memory[29]=32; + this->memory[30]=255; + this->memory[31]=1; + this->memory[35]=255; + this->memory[36]=3; + this->memory[48]=32; + } else { this->memory[7]=this->id; @@ -419,6 +457,11 @@ namespace dynamixel_robot_gazebo this->memory[36]=value&0x000000FF; this->memory[37]=(value>>8)&0x000000FF; } + else if(this->model=="XL320") + { + this->memory[37]=value&0x000000FF; + this->memory[38]=(value>>8)&0x000000FF; + } else { this->memory[132]=value&0x000000FF; @@ -439,7 +482,7 @@ namespace dynamixel_robot_gazebo this->memory[38]=value&0x000000FF; this->memory[39]=(value>>8)&0x000000FF; } - else if (model=="MX12W") + else if(model=="MX12W") { value/=0.916; this->memory[38]=value&0x000000FF; @@ -451,6 +494,12 @@ namespace dynamixel_robot_gazebo this->memory[38]=value&0x000000FF; this->memory[39]=(value>>8)&0x000000FF; } + else if(this->model=="XL320") + { + value/=0.111; + this->memory[39]=value&0x000000FF; + this->memory[40]=(value>>8)&0x000000FF; + } else { value/=0.229; @@ -474,6 +523,11 @@ namespace dynamixel_robot_gazebo this->memory[40]=value&0x000000FF; this->memory[41]=(value>>8)&0x000000FF; } + else if(this->model=="XL320") + { + this->memory[41]=value&0x000000FF; + this->memory[42]=(value>>8)&0x000000FF; + } else { this->memory[124]=value&0x000000FF; @@ -486,7 +540,7 @@ namespace dynamixel_robot_gazebo unsigned int value=0; double angle; - if(model=="AX12W" || model=="AX12A" || model=="AX18A" || model=="MX12W" || model=="MX28v1" || model=="MX64v1" || model=="MX106v1") + if(model=="AX12W" || model=="AX12A" || model=="AX18A" || model=="MX12W" || model=="MX28v1" || model=="MX64v1" || model=="MX106v1" || model=="XL320") value=this->memory[30]+(this->memory[31]<<8); else value=this->memory[116]+(this->memory[133]<<8)+(this->memory[134]<<16)+(this->memory[135]<<24); @@ -500,19 +554,19 @@ namespace dynamixel_robot_gazebo unsigned int value=0; double speed; - if(model=="AX12W" || model=="AX12A" || model=="AX18A" || model=="MX12W" || model=="MX28v1" || model=="MX64v1" || model=="MX106v1") + if(model=="AX12W" || model=="AX12A" || model=="AX18A" || model=="MX12W" || model=="MX28v1" || model=="MX64v1" || model=="MX106v1" || model=="XL320") { - this->memory[32]=value&0x000000FF; - this->memory[33]=(value>>8)&0x000000FF; + value=this->memory[32]; + value+=this->memory[33]<<8; } else { - this->memory[104]=value&0x000000FF; - this->memory[105]=(value>>8)&0x000000FF; - this->memory[106]=(value>>16)&0x000000FF; - this->memory[107]=(value>>24)&0x000000FF; + value=this->memory[104]; + value+=this->memory[105]<<8; + value+=this->memory[106]<<16; + value+=this->memory[107]<<24; } - if(model=="AX12W" || model=="AX12A" || model=="AX18A") + if(model=="AX12W" || model=="AX12A" || model=="AX18A" || model=="XL320") value*=0.111; else if (model=="MX12W") value*=0.916; @@ -527,10 +581,12 @@ namespace dynamixel_robot_gazebo void CDynServo::on_ping(void) { + std::cout << "device " << (int)this->id << " pinged" << std::endl; } unsigned char CDynServo::on_read(unsigned short int address, unsigned short int length, unsigned char *data) { + std::cout << "device " << (int)this->id << " read operation" << std::endl; for(unsigned int i=0;i<length;i++) data[i]=this->memory[address+i]; @@ -539,6 +595,7 @@ namespace dynamixel_robot_gazebo unsigned char CDynServo::on_write(unsigned short int address, unsigned short int length, unsigned char *data) { + std::cout << "device " << (int)this->id << " write operation" << std::endl; for(unsigned int i=0;i<length;i++) this->memory[address+i]=data[i]; return 0;