ros2_control - rolling
steering_odometry.hpp
1 // Copyright (c) 2023, Stogl Robotics Consulting UG (haftungsbeschränkt)
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 //
15 // Authors: dr. sc. Tomislav Petkovic, Dr. Ing. Denis Štogl
16 //
17 
18 #ifndef STEERING_CONTROLLERS_LIBRARY__STEERING_ODOMETRY_HPP_
19 #define STEERING_CONTROLLERS_LIBRARY__STEERING_ODOMETRY_HPP_
20 
21 #include <cmath>
22 #include <tuple>
23 #include <vector>
24 
25 #include <rclcpp/time.hpp>
26 
27 // \note The versions conditioning is added here to support the source-compatibility with Humble
28 #if RCPPUTILS_VERSION_MAJOR >= 2 && RCPPUTILS_VERSION_MINOR >= 6
29 #include "rcpputils/rolling_mean_accumulator.hpp"
30 #else
31 #include "rcppmath/rolling_mean_accumulator.hpp"
32 #endif
33 
34 namespace steering_odometry
35 {
36 const unsigned int BICYCLE_CONFIG = 0;
37 const unsigned int TRICYCLE_CONFIG = 1;
38 const unsigned int ACKERMANN_CONFIG = 2;
39 
40 inline bool is_close_to_zero(double val) { return std::fabs(val) < 1e-6; }
41 
47 {
48 public:
56  explicit SteeringOdometry(size_t velocity_rolling_window_size = 10);
57 
62  void init(const rclcpp::Time & time);
63 
72  const double traction_wheel_pos, const double steer_pos, const double dt);
73 
83  const double right_traction_wheel_pos, const double left_traction_wheel_pos,
84  const double steer_pos, const double dt);
85 
96  const double right_traction_wheel_pos, const double left_traction_wheel_pos,
97  const double right_steer_pos, const double left_steer_pos, const double dt);
98 
107  const double traction_wheel_vel, const double steer_pos, const double dt);
108 
118  const double right_traction_wheel_vel, const double left_traction_wheel_vel,
119  const double steer_pos, const double dt);
120 
131  const double right_traction_wheel_vel, const double left_traction_wheel_vel,
132  const double right_steer_pos, const double left_steer_pos, const double dt);
133 
140  void update_open_loop(const double v_bx, const double omega_bz, const double dt);
141 
146  void set_odometry_type(const unsigned int type);
147 
152  double get_heading() const { return heading_; }
153 
158  double get_x() const { return x_; }
159 
164  double get_y() const { return y_; }
165 
170  double get_linear() const { return linear_; }
171 
176  double get_angular() const { return angular_; }
177 
181  void set_wheel_params(
182  const double wheel_radius, const double wheelbase = 0.0, const double wheel_track = 0.0);
183 
188  void set_velocity_rolling_window_size(const size_t velocity_rolling_window_size);
189 
199  std::tuple<std::vector<double>, std::vector<double>> get_commands(
200  const double v_bx, const double omega_bz, const bool open_loop = true,
201  const bool reduce_wheel_speed_until_steering_reached = false);
202 
206  void reset_odometry();
207 
208 private:
215  bool update_odometry(const double v_bx, const double omega_bz, const double dt);
216 
223  void integrate_runge_kutta_2(const double v_bx, const double omega_bz, const double dt);
224 
231  void integrate_fk(const double v_bx, const double omega_bz, const double dt);
232 
238  double convert_twist_to_steering_angle(const double v_bx, const double omega_bz);
239 
246  double get_linear_velocity_double_traction_axle(
247  const double right_traction_wheel_vel, const double left_traction_wheel_vel,
248  const double steer_pos);
249 
253  void reset_accumulators();
254 
255 // \note The versions conditioning is added here to support the source-compatibility with Humble
256 #if RCPPUTILS_VERSION_MAJOR >= 2 && RCPPUTILS_VERSION_MINOR >= 6
257  using RollingMeanAccumulator = rcpputils::RollingMeanAccumulator<double>;
258 #else
259  using RollingMeanAccumulator = rcppmath::RollingMeanAccumulator<double>;
260 #endif
261 
263  rclcpp::Time timestamp_;
264 
266  double x_; // [m]
267  double y_; // [m]
268  double steer_pos_; // [rad]
269  double heading_; // [rad]
270 
272  double linear_; // [m/s]
273  double angular_; // [rad/s]
274 
276  double wheel_track_; // [m]
277  double wheelbase_; // [m]
278  double wheel_radius_; // [m]
279 
281  int config_type_ = -1;
282 
284  double traction_wheel_old_pos_;
285  double traction_right_wheel_old_pos_;
286  double traction_left_wheel_old_pos_;
288  size_t velocity_rolling_window_size_;
289  RollingMeanAccumulator linear_acc_;
290  RollingMeanAccumulator angular_acc_;
291 };
292 } // namespace steering_odometry
293 
294 #endif // STEERING_CONTROLLERS_LIBRARY__STEERING_ODOMETRY_HPP_
The Odometry class handles odometry readings (2D pose and velocity with related timestamp)
Definition: steering_odometry.hpp:47
double get_heading() const
heading getter
Definition: steering_odometry.hpp:152
std::tuple< std::vector< double >, std::vector< double > > get_commands(const double v_bx, const double omega_bz, const bool open_loop=true, const bool reduce_wheel_speed_until_steering_reached=false)
Calculates inverse kinematics for the desired linear and angular velocities.
Definition: steering_odometry.cpp:219
SteeringOdometry(size_t velocity_rolling_window_size=10)
Constructor Timestamp will get the current time value Value will be set to zero.
Definition: steering_odometry.cpp:27
bool update_from_position(const double traction_wheel_pos, const double steer_pos, const double dt)
Updates the odometry class with latest wheels position.
Definition: steering_odometry.cpp:75
void set_wheel_params(const double wheel_radius, const double wheelbase=0.0, const double wheel_track=0.0)
Sets the wheel parameters: radius, separation and wheelbase.
Definition: steering_odometry.cpp:193
double get_linear() const
linear velocity getter
Definition: steering_odometry.hpp:170
double get_angular() const
angular velocity getter
Definition: steering_odometry.hpp:176
double get_x() const
x position getter
Definition: steering_odometry.hpp:158
void set_velocity_rolling_window_size(const size_t velocity_rolling_window_size)
Velocity rolling window size setter.
Definition: steering_odometry.cpp:200
void update_open_loop(const double v_bx, const double omega_bz, const double dt)
Updates the odometry class with latest velocity command.
Definition: steering_odometry.cpp:183
bool update_from_velocity(const double traction_wheel_vel, const double steer_pos, const double dt)
Updates the odometry class with latest wheels position.
Definition: steering_odometry.cpp:121
double get_y() const
y position getter
Definition: steering_odometry.hpp:164
void reset_odometry()
Reset poses, heading, and accumulators.
Definition: steering_odometry.cpp:334
void init(const rclcpp::Time &time)
Initialize the odometry.
Definition: steering_odometry.cpp:46
void set_odometry_type(const unsigned int type)
Set odometry type.
Definition: steering_odometry.cpp:207