@@ -11,28 +11,28 @@ fn normalize_angle(angle: f64) -> f64 {
1111/// Odometry for a diff drive mobile robot.
1212pub struct DiffDriveOdometry {
1313 /// The distance between the wheels.
14- wheel_separation : f64 , // [m]
14+ wheel_separation : f64 , // [m]
1515 /// The radius of the wheels.
16- wheel_radius : f64 , // [m]
16+ wheel_radius : f64 , // [m]
1717
1818 /// Current pose:
1919 current_pose : Pose2D ,
2020
2121 /// Current velocity:
22- linear : f64 , // [m/s]
23- angular : f64 , // [rad/s]
22+ linear : f64 , // [m/s]
23+ angular : f64 , // [rad/s]
2424
2525 /// Previous data for odometry calculations.
26- previous_time : f64 , // [s]
26+ previous_time : f64 , // [s]
2727 previous_left_wheel_position : f64 , // [rad]
2828 previous_right_wheel_position : f64 , // [rad]
2929}
3030
3131impl DiffDriveOdometry {
3232 pub fn new ( wheel_separation : f64 , wheel_radius : f64 ) -> Self {
3333 DiffDriveOdometry {
34- wheel_separation : wheel_separation ,
35- wheel_radius : wheel_radius ,
34+ wheel_separation,
35+ wheel_radius,
3636 current_pose : Pose2D {
3737 x : 0.0 ,
3838 y : 0.0 ,
@@ -56,15 +56,15 @@ impl DiffDriveOdometry {
5656 }
5757
5858 let dt = timestamp - self . previous_time ;
59- if dt < 0.01 {
59+ if dt < 0.01 {
6060 return ; // Ignore updates that are too close together
6161 }
6262
6363 // Calculate the change in position of each wheel
6464 let left_wheel_diff = left_wheel_position - self . previous_left_wheel_position ;
6565 let right_wheel_diff = right_wheel_position - self . previous_right_wheel_position ;
6666
67- // Obtain velocity.
67+ // Obtain velocity.
6868 // Note that there is no division by dt as it would be canceled out by the multiplication by dt when updating the pose.
6969 self . linear = ( left_wheel_diff + right_wheel_diff) * self . wheel_radius / 2.0 ;
7070 self . angular = ( right_wheel_diff - left_wheel_diff) * self . wheel_radius / self . wheel_separation ;
@@ -81,32 +81,39 @@ impl DiffDriveOdometry {
8181 self . previous_time = timestamp;
8282 self . previous_left_wheel_position = left_wheel_position;
8383 self . previous_right_wheel_position = right_wheel_position;
84-
8584 }
8685}
8786
8887#[ cfg( test) ]
8988mod tests {
90- use std:: thread:: sleep;
91-
9289 use super :: * ;
90+ use std:: f64:: consts:: PI ;
91+
92+ fn assert_f64_eq ( a : f64 , b : f64 , epsilon : f64 ) {
93+ assert ! (
94+ ( a - b) . abs( ) < epsilon,
95+ "Values {} and {} are not within epsilon {}" ,
96+ a,
97+ b,
98+ epsilon
99+ ) ;
100+ }
93101
94102 #[ test]
95103 fn test_update_wheels_position_linear ( ) {
96104 let wheel_separation = 1.0 ; // [m]
97105 let wheel_radius = 0.5 ; // [m]
98106 let mut odometry = DiffDriveOdometry :: new ( wheel_separation, wheel_radius) ;
107+ odometry. update ( 0.0 , 0.0 , 0.0 ) ;
99108 // Test with both wheels moving forward
100- sleep ( Duration :: from_millis ( 1000 ) ) ;
101-
102- let wheels_new_position = 6.28 ; // [rad]
103- odometry. update ( wheels_new_position, wheels_new_position) ;
109+ let wheels_new_position = 2.0 * PI ; // [rad]
110+ odometry. update ( wheels_new_position, wheels_new_position, 1.0 ) ;
104111
105112 assert_eq ! ( odometry. current_pose. x, wheel_radius * wheels_new_position) ;
106113 assert_eq ! ( odometry. current_pose. y, 0.0 ) ;
107114 assert_eq ! ( odometry. current_pose. heading, 0.0 ) ;
108115
109- assert_eq ! ( odometry. linear, 3.14 ) ;
116+ assert_eq ! ( odometry. linear, PI ) ;
110117 assert_eq ! ( odometry. angular, 0.0 ) ;
111118 }
112119
@@ -115,19 +122,17 @@ mod tests {
115122 let wheel_separation = 1.0 ; // [m]
116123 let wheel_radius = 0.5 ; // [m]
117124 let mut odometry = DiffDriveOdometry :: new ( wheel_separation, wheel_radius) ;
125+ odometry. update ( 0.0 , 0.0 , 0.0 ) ;
118126 // Test with both wheels moving forward
119- sleep ( Duration :: from_millis ( 1000 ) ) ;
120-
121- let left_wheel_new_position = -3.14 ; // [rad]
122- let right_wheel_new_position = 3.14 ; // [rad]
123- odometry. update ( left_wheel_new_position, right_wheel_new_position) ;
127+ let left_wheel_new_position = -PI ; // [rad]
128+ let right_wheel_new_position = PI ; // [rad]
129+ odometry. update ( left_wheel_new_position, right_wheel_new_position, 1.0 ) ;
124130
125131 assert_eq ! ( odometry. current_pose. x, 0.0 ) ;
126132 assert_eq ! ( odometry. current_pose. y, 0.0 ) ;
127- assert_eq ! ( odometry. current_pose. heading, 3.14 ) ;
133+ assert_f64_eq ( odometry. current_pose . heading , PI , 1e-10 ) ;
128134
129135 assert_eq ! ( odometry. linear, 0.0 ) ;
130- assert_eq ! ( odometry. angular, 3.14 ) ;
136+ assert_f64_eq ( odometry. angular , PI , 1e-10 ) ;
131137 }
132-
133138}
0 commit comments