39 std::lock_guard<std::mutex> lock(m_cs);
41 m_last_loc_time.reset();
42 m_last_odo_time.reset();
45 m_loc_odo_ref =
TPose2D(0, 0, 0);
48 m_robot_vel_local =
TTwist2D(.0, .0, .0);
55 std::lock_guard<std::mutex> lock(m_cs);
58 m_last_loc_time = cur_tim;
64 const double dT =
timeDifference(m_last_odo_time.value(), cur_tim);
65 extrapolateRobotPose(m_last_odo, m_robot_vel_local, dT, m_loc_odo_ref);
76 std::lock_guard<std::mutex> lock(m_cs);
80 const double dT =
timeDifference(m_last_odo_time.value(), cur_tim);
82 std::cerr <<
"[CRobot2DPoseEstimator::processUpdateNewOdometry] " 83 "WARNING: Diff. in timestamps between odometry should " 91 m_robot_vel_local = velLocal;
99 m_robot_vel_local =
TTwist2D(.0, .0, .0);
103 m_last_odo_time = cur_tim;
104 m_last_odo = newGlobalOdometry;
113 if (!m_last_odo_time || !m_last_loc_time)
return false;
115 const double dTimeLoc =
timeDifference(m_last_loc_time.value(), tim_query);
116 if (dTimeLoc >
params.max_localiz_age)
return false;
125 const double dTimeOdo =
timeDifference(m_last_odo_time.value(), tim_query);
126 if (dTimeOdo >
params.max_odometry_age)
return false;
128 extrapolateRobotPose(
p, m_robot_vel_local, dTimeOdo, pose);
131 velLocal = m_robot_vel_local;
132 velGlobal = velLocal;
144 if (!m_last_odo_time && !m_last_loc_time)
151 if (m_last_odo_time && m_last_loc_time)
152 ret_odo = (m_last_odo_time.value() > m_last_loc_time.value());
153 else if (m_last_odo_time)
172 const double delta_time,
TPose2D& new_p)
174 if (velLocal.
vx == 0 && velLocal.
vy == 0 && velLocal.
omega == 0)
178 else if (std::abs(velLocal.
vy) > 1e-2)
181 TPoint2D(delta_time * velLocal.
vx, delta_time * velLocal.
vy);
186 new_p.
phi =
p.phi + delta_time * velLocal.
omega;
192 const double R = velLocal.
vx / velLocal.
omega;
193 const double theta = velLocal.
omega * delta_time;
194 const double cc = cos(
p.phi);
195 const double ss = sin(
p.phi);
197 const double arc_x =
R * sin(theta);
198 const double arc_y =
R * (1 - cos(theta));
200 new_p.
x =
p.x + cc * arc_x - ss * arc_y;
201 new_p.
y =
p.y + ss * arc_x + cc * arc_y;
202 new_p.
phi =
p.phi + theta;
209 bool v = getLatestRobotPose(
p);
void rotate(const double ang)
Transform the (vx,vy) components for a counterclockwise rotation of ang radians.
CRobot2DPoseEstimator()
Default constructor.
std::chrono::time_point< Clock > time_point
bool getLatestRobotPose(mrpt::math::TPose2D &pose) const
Get the latest known robot pose, either from odometry or localization.
void composePoint(double lx, double ly, double &gx, double &gy) const
An alternative, slightly more efficient way of doing with G and L being 2D points and P this 2D pose...
void reset()
Resets all internal state.
2D twist: 2D velocity vector (vx,vy) + planar angular velocity (omega)
This base provides a set of functions for maths stuff.
void processUpdateNewOdometry(const mrpt::math::TPose2D &newGlobalOdometry, mrpt::Clock::time_point cur_tim, bool hasVelocities=false, const mrpt::math::TTwist2D &newRobotVelLocal=mrpt::math::TTwist2D())
Updates the filter with new odometry readings.
double vx
Velocity components: X,Y (m/s)
double x() const
Common members of all points & poses classes.
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
bool getCurrentEstimate(mrpt::math::TPose2D &pose, mrpt::math::TTwist2D &velLocal, mrpt::math::TTwist2D &velGlobal, mrpt::Clock::time_point tim_query=mrpt::Clock::now()) const
Get the estimate for a given timestamp (defaults to now()), obtained as:
A class used to store a 2D pose, including the 2D coordinate point and a heading (phi) angle...
virtual ~CRobot2DPoseEstimator()
Destructor.
const double & phi() const
Get the phi angle of the 2D pose (in radians)
double timeDifference(const mrpt::system::TTimeStamp t_first, const mrpt::system::TTimeStamp t_later)
Returns the time difference from t1 to t2 (positive if t2 is posterior to t1), in seconds...
static void extrapolateRobotPose(const mrpt::math::TPose2D &p, const mrpt::math::TTwist2D &robot_vel_local, const double delta_time, mrpt::math::TPose2D &new_p)
An auxiliary method to extrapolate the pose of a robot located at "p" with velocities (v...
void processUpdateNewPoseLocalization(const mrpt::math::TPose2D &newPose, mrpt::Clock::time_point tim)
Updates the filter with new global-coordinates localization data from a localization or SLAM source...
GLenum const GLfloat * params
double phi
Orientation (rads)
double omega
Angular velocity (rad/s)