[ros-users] [PATCH] Odometry calibration of the Pioneer Robo…

Top Page
Attachments:
Message as email
+ (text/plain)
+ (text/html)
+ odom_calibration.patch (text/x-patch)
Delete this message
Reply to this message
Author: User discussions
Date:  
To: ros-users-request, ros-users
Subject: [ros-users] [PATCH] Odometry calibration of the Pioneer Robot, ETHZ
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


___________________________________
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;