39 namespace bacc = boost::accumulators;
42 : last_update_timestamp_(0.0)
50 , steering_track_(0.0)
51 , wheel_steering_y_offset_(0.0)
55 , velocity_rolling_window_size_(velocity_rolling_window_size)
56 , linear_accel_acc_(RollingWindow::window_size = velocity_rolling_window_size)
57 , linear_jerk_acc_(RollingWindow::window_size = velocity_rolling_window_size)
58 , front_steer_vel_acc_(RollingWindow::window_size = velocity_rolling_window_size)
59 , rear_steer_vel_acc_(RollingWindow::window_size = velocity_rolling_window_size)
63 void Odometry::init(
const ros::Time& time)
67 last_update_timestamp_ = time;
70 bool Odometry::update(
const double &fl_speed,
const double &fr_speed,
71 const double &rl_speed,
const double &rr_speed,
72 double front_steering,
double rear_steering,
const ros::Time &time)
74 const double front_tmp = cos(front_steering)*(tan(front_steering)-tan(rear_steering))/wheel_base_;
75 const double front_left_tmp = front_tmp/sqrt(1-steering_track_*front_tmp*cos(front_steering)
76 +pow(steering_track_*front_tmp/2,2));
77 const double front_right_tmp = front_tmp/sqrt(1+steering_track_*front_tmp*cos(front_steering)
78 +pow(steering_track_*front_tmp/2,2));
79 const double fl_speed_tmp = fl_speed * (1/(1-wheel_steering_y_offset_*front_left_tmp));
80 const double fr_speed_tmp = fr_speed * (1/(1-wheel_steering_y_offset_*front_right_tmp));
81 const double front_linear_speed = wheel_radius_ * copysign(1.0, fl_speed_tmp+fr_speed_tmp)*
82 sqrt((pow(fl_speed,2)+pow(fr_speed,2))/(2+pow(steering_track_*front_tmp,2)/2.0));
84 const double rear_tmp = cos(rear_steering)*(tan(front_steering)-tan(rear_steering))/wheel_base_;
85 const double rear_left_tmp = rear_tmp/sqrt(1-steering_track_*rear_tmp*cos(rear_steering)
86 +pow(steering_track_*rear_tmp/2,2));
87 const double rear_right_tmp = rear_tmp/sqrt(1+steering_track_*rear_tmp*cos(rear_steering)
88 +pow(steering_track_*rear_tmp/2,2));
89 const double rl_speed_tmp = rl_speed * (1/(1-wheel_steering_y_offset_*rear_left_tmp));
90 const double rr_speed_tmp = rr_speed * (1/(1-wheel_steering_y_offset_*rear_right_tmp));
91 const double rear_linear_speed = wheel_radius_ * copysign(1.0, rl_speed_tmp+rr_speed_tmp)*
92 sqrt((pow(rl_speed_tmp,2)+pow(rr_speed_tmp,2))/(2+pow(steering_track_*rear_tmp,2)/2.0));
94 angular_ = (front_linear_speed*front_tmp + rear_linear_speed*rear_tmp)/2.0;
96 linear_x_ = (front_linear_speed*cos(front_steering) + rear_linear_speed*cos(rear_steering))/2.0;
97 linear_y_ = (front_linear_speed*sin(front_steering) - wheel_base_*angular_/2.0
98 + rear_linear_speed*sin(rear_steering) + wheel_base_*angular_/2.0)/2.0;
99 linear_ = copysign(1.0, rear_linear_speed)*sqrt(pow(linear_x_,2)+pow(linear_y_,2));
102 const double dt = (time - last_update_timestamp_).toSec();
106 last_update_timestamp_ = time;
108 integrateXY(linear_x_*dt, linear_y_*dt, angular_*dt);
110 linear_accel_acc_((linear_vel_prev_ - linear_)/dt);
111 linear_vel_prev_ = linear_;
112 linear_jerk_acc_((linear_accel_prev_ - bacc::rolling_mean(linear_accel_acc_))/dt);
113 linear_accel_prev_ = bacc::rolling_mean(linear_accel_acc_);
114 front_steer_vel_acc_((front_steer_vel_prev_ - front_steering)/dt);
115 front_steer_vel_prev_ = front_steering;
116 rear_steer_vel_acc_((rear_steer_vel_prev_ - rear_steering)/dt);
117 rear_steer_vel_prev_ = rear_steering;
121 void Odometry::setWheelParams(
double steering_track,
double wheel_steering_y_offset,
double wheel_radius,
double wheel_base)
123 steering_track_ = steering_track;
124 wheel_steering_y_offset_ = wheel_steering_y_offset;
125 wheel_radius_ = wheel_radius;
126 wheel_base_ = wheel_base;
129 void Odometry::setVelocityRollingWindowSize(
size_t velocity_rolling_window_size)
131 velocity_rolling_window_size_ = velocity_rolling_window_size;
136 void Odometry::integrateXY(
double linear_x,
double linear_y,
double angular)
138 const double delta_x = linear_x*cos(heading_) - linear_y*sin(heading_);
139 const double delta_y = linear_x*sin(heading_) + linear_y*cos(heading_);
146 void Odometry::integrateRungeKutta2(
double linear,
double angular)
148 const double direction = heading_ + angular * 0.5;
151 x_ += linear * cos(direction);
152 y_ += linear * sin(direction);
156 void Odometry::integrateExact(
double linear,
double angular)
158 if (fabs(angular) < 1e-6)
159 integrateRungeKutta2(linear, angular);
163 const double heading_old = heading_;
164 const double r = linear/angular;
166 x_ += r * (sin(heading_) - sin(heading_old));
167 y_ += -r * (cos(heading_) - cos(heading_old));
171 void Odometry::resetAccumulators()
173 linear_accel_acc_ = RollingMeanAcc(RollingWindow::window_size = velocity_rolling_window_size_);
174 linear_jerk_acc_ = RollingMeanAcc(RollingWindow::window_size = velocity_rolling_window_size_);
175 front_steer_vel_acc_ = RollingMeanAcc(RollingWindow::window_size = velocity_rolling_window_size_);
176 rear_steer_vel_acc_ = RollingMeanAcc(RollingWindow::window_size = velocity_rolling_window_size_);