Skip to content

Commit 06ffd27

Browse files
committed
Fix precommit
Signed-off-by: Ari Lowy <arilow@ekumenlabs.com>
1 parent db66b2c commit 06ffd27

3 files changed

Lines changed: 37 additions & 30 deletions

File tree

dora_node_hub/dora_diff_drive_controller/src/dora_node.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ pub fn main() -> eyre::Result<()> {
1919
wheel_radius, wheel_separation
2020
);
2121

22-
let diff_drive_controller: crate::controller::DiffDriveController = crate::controller::DiffDriveController::new(wheel_separation, wheel_radius);
23-
let mut diff_drive_odometry: crate::odometry::DiffDriveOdometry = crate::odometry::DiffDriveOdometry::new(wheel_separation, wheel_radius);
22+
let diff_drive_controller: crate::controller::DiffDriveController =
23+
crate::controller::DiffDriveController::new(wheel_separation, wheel_radius);
24+
let mut diff_drive_odometry: crate::odometry::DiffDriveOdometry =
25+
crate::odometry::DiffDriveOdometry::new(wheel_separation, wheel_radius);
2426

2527
while let Some(event) = events.recv() {
2628
match event {

dora_node_hub/dora_diff_drive_controller/src/odometry.rs

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,28 @@ fn normalize_angle(angle: f64) -> f64 {
1111
/// Odometry for a diff drive mobile robot.
1212
pub 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

3131
impl 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)]
8988
mod 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
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
pub struct Pose2D {
22
/// The x coordinate of the pose.
3-
pub x: f64, // [m]
3+
pub x: f64, // [m]
44
/// The y coordinate of the pose.
5-
pub y: f64, // [m]
5+
pub y: f64, // [m]
66
/// The heading of the pose in radians.
7-
pub heading: f64, // [rad]
7+
pub heading: f64, // [rad]
88
}

0 commit comments

Comments
 (0)