18 #ifndef STEERING_CONTROLLERS_LIBRARY__STEERING_ODOMETRY_HPP_
19 #define STEERING_CONTROLLERS_LIBRARY__STEERING_ODOMETRY_HPP_
25 #include <rclcpp/time.hpp>
28 #if RCPPUTILS_VERSION_MAJOR >= 2 && RCPPUTILS_VERSION_MINOR >= 6
29 #include "rcpputils/rolling_mean_accumulator.hpp"
31 #include "rcppmath/rolling_mean_accumulator.hpp"
34 namespace steering_odometry
36 const unsigned int BICYCLE_CONFIG = 0;
37 const unsigned int TRICYCLE_CONFIG = 1;
38 const unsigned int ACKERMANN_CONFIG = 2;
40 inline bool is_close_to_zero(
double val) {
return std::fabs(val) < 1e-6; }
62 void init(
const rclcpp::Time & time);
72 const double traction_wheel_pos,
const double steer_pos,
const double dt);
83 const double right_traction_wheel_pos,
const double left_traction_wheel_pos,
84 const double steer_pos,
const double dt);
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);
107 const double traction_wheel_vel,
const double steer_pos,
const double dt);
118 const double right_traction_wheel_vel,
const double left_traction_wheel_vel,
119 const double steer_pos,
const double dt);
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);
140 void update_open_loop(
const double v_bx,
const double omega_bz,
const double dt);
182 const double wheel_radius,
const double wheelbase = 0.0,
const double wheel_track = 0.0);
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);
215 bool update_odometry(
const double v_bx,
const double omega_bz,
const double dt);
223 void integrate_runge_kutta_2(
const double v_bx,
const double omega_bz,
const double dt);
231 void integrate_fk(
const double v_bx,
const double omega_bz,
const double dt);
238 double convert_twist_to_steering_angle(
const double v_bx,
const double omega_bz);
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);
253 void reset_accumulators();
256 #if RCPPUTILS_VERSION_MAJOR >= 2 && RCPPUTILS_VERSION_MINOR >= 6
257 using RollingMeanAccumulator = rcpputils::RollingMeanAccumulator<double>;
259 using RollingMeanAccumulator = rcppmath::RollingMeanAccumulator<double>;
263 rclcpp::Time timestamp_;
278 double wheel_radius_;
281 int config_type_ = -1;
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_;
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