Hi, Considering the calibration of the odometry for Pioneer robot using the p2os_driver, we believe the REVCOUNT, DRIFTFACTOR, TICKSMM are missing in both the header files and the source files. The following patch will add interfaces to adjust these three parameters to the p2os_driver package. This patch has been tested on PioneerAT and DX. (use parameter -p1) diff -Naur old/include/p2os_driver/p2os.h new/include/p2os_driver/p2os.h --- old/include/p2os_driver/p2os.h 2010-12-13 18:53:09.000000000 +0100 +++ new/include/p2os_driver/p2os.h 2010-12-13 18:52:40.000000000 +0100 @@ -143,6 +143,11 @@ int direct_wheel_vel_control; int radio_modemp; + + int revcount ; //#ticks per 180 degree, resolution of the robot + int ticksmm ; //encoder ticks per millimeter tire motion + int driftfactor; //working drift, to correct rotational offset + int motor_max_speed; int motor_max_turnspeed; short motor_max_trans_accel, motor_max_trans_decel; diff -Naur old/include/p2os_driver/robot_params.h new/include/p2os_driver/robot_params.h --- old/include/p2os_driver/robot_params.h 2010-12-13 18:53:09.000000000 +0100 +++ new/include/p2os_driver/robot_params.h 2010-12-13 18:52:40.000000000 +0100 @@ -164,6 +164,14 @@ TRANSKP = 85, // Added in P2OS1.M TRANSKV = 86, // Added in P2OS1.M TRANSKI = 87, // Added in P2OS1.M + + + //ETHZ added + REVCOUNT = 88, + DRIFTFACTOR = 89, + TICKSMM = 93, + + SOUND = 90, PLAYLIST = 91, SOUNDTOG = 92, ///< int, AmigoBot (old H8 model) specific, enable(1) or @@ -222,7 +230,7 @@ #define CMUCAM_MESSAGE_LEN 10 /* conection stuff */ -#define DEFAULT_P2OS_PORT "/dev/ttyS0" +#define DEFAULT_P2OS_PORT "/dev/ttyUSB0" #define DEFAULT_P2OS_TCP_REMOTE_HOST "localhost" #define DEFAULT_P2OS_TCP_REMOTE_PORT 8101 diff -Naur old/src/p2os.cc new/src/p2os.cc --- old/src/p2os.cc 2010-12-13 18:53:01.000000000 +0100 +++ new/src/p2os.cc 2010-12-13 18:52:30.000000000 +0100 @@ -92,6 +92,18 @@ n_private.param( "max_yawdecel", spd, 0.0); motor_max_rot_decel = (short)rint(RTOD(spd)); + //odom calibration: revcount + int odomparam; + //essential: + n_private.param( "revcount", odomparam, 38000); + revcount = odomparam; //#ticks per 180 degree, resolution of the robot + //these two parameters are not set by default: + n_private.param( "ticksmm", odomparam, -1); + ticksmm = odomparam; //encoder ticks per millimeter tire motion + n_private.param( "revcount", odomparam, -1); + driftfactor = odomparam; //working drift, to correct rotational offset + + desired_freq = 10; // advertise services @@ -560,6 +572,37 @@ this->SendReceive(&accel_packet,false); } + ///////////////////Odometry///////////////////////////////// + //ETHZ Dec 8 2010 + P2OSPacket odom_packet; + unsigned char odom_command[4]; + if(this->revcount > 0) + { + odom_command[0] = REVCOUNT; + odom_command[1] = ARGINT; + odom_command[2] = this->revcount & 0x00FF; + odom_command[3] = (this->revcount & 0xFF00) >> 8; + odom_packet.Build(odom_command, 4); + this->SendReceive(&odom_packet); + } + if(this->ticksmm > 0) + { + odom_command[0] = TICKSMM; + odom_command[1] = ARGINT; + odom_command[2] = this->ticksmm & 0x00FF; + odom_command[3] = (this->ticksmm & 0xFF00) >> 8; + odom_packet.Build(odom_command, 4); + this->SendReceive(&odom_packet); + } + if(this->driftfactor > 0) + { + odom_command[0] = DRIFTFACTOR; + odom_command[1] = ARGINT; + odom_command[2] = this->driftfactor & 0x00FF; + odom_command[3] = (this->driftfactor & 0xFF00) >> 8; + odom_packet.Build(odom_command, 4); + this->SendReceive(&odom_packet); + } // if requested, change PID settings P2OSPacket pid_packet; For further information, please refer to the software manual, e.g. http://www.ist.tugraz.at/_attach/Publish/Kmr06/pioneer-robot.pdf#page=56 Good luck! Best regards, Ming Liu -- ___________________________________ Ming Liu Autonomous Systems Laboratory ETH Zurich, CLA E 26 Tannenstrasse 3 8092, Zurich, Switzerland Phone: +41 44 632 92 96 Mobile: +41 76 729 50 85 Fax: +41 44 632 11 81 Liu.Ming.PRC@gmail.com ming.liu@mavt.ethz.ch ___________________________________