4#include "TinyRobotics/odometry/IOdometryModel2D.h"
5#include "TinyRobotics/odometry/ISpeedSource.h"
6#include "TinyRobotics/units/Units.h"
8namespace tinyrobotics {
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
36 void registerCallback(
void (*callback)(
void*),
void* userData)
override {}
39 OdometryModel2D(
Distance wheelBase) : wheelBase(wheelBase) {}
42 p_speedSource = &speedSource;
45 void setSteeringAngle(
Angle angle) {
46 this->steeringAngle = angle;
51 void setSpeed(
Speed speed) {
59 assert(p_speedSource !=
nullptr);
60 speed = p_speedSource->updateSpeed(deltaTimeMs);
64
65
66
67
68
69
72 float speedMps = speed.getValue(
SpeedUnit::MPS);
73 float steeringAngleRad = steeringAngle.getValue(
AngleUnit::RAD);
74 float omega = (wb > 0.0f) ? speedMps * std::tan(steeringAngleRad) / wb
76 return omega *
static_cast<
float>(deltaTimeMs) / 1000.0f;
79 void computeDeltaXY(
float theta, uint32_t deltaTimeMs,
float& deltaX,
80 float& deltaY)
const override {
81 float speedMps = speed.getValue(
SpeedUnit::MPS);
82 float dt = deltaTimeMs / 1000.0f;
83 deltaX = speedMps * std::cos(theta) * dt;
84 deltaY = speedMps * std::sin(theta) * dt;
87 bool onMessage(
const Message<
float>& msg) {
88 if (msg.origin != MessageOrigin::Vehicle)
return false;
90 switch (msg.content) {
91 case MessageContent::MotorSpeed:
92 if (msg.unit != Unit::Percent)
return false;
93 p_speedSource->setThrottlePercent(msg.value);
95 p_speedSource->getSpeed());
97 case MessageContent::SteeringAngle:
98 steeringAngle = Angle(msg.value, msg.unit == Unit::AngleRadian ? AngleUnit::RAD : AngleUnit::DEG);
105 void setCallback(
void (*callback)(
void*),
void* userData) {
106 this->callback = callback;
107 this->userData = userData;
118 void (*callback)(
void*) =
nullptr;
119 void* userData =
nullptr;
Represents an angle with unit conversion and wrap-around support.
Definition: Angle.h:42
Represents a distance measurement with unit conversion support.
Definition: Distance.h:40
Abstract interface for 2D odometry models.
Definition: IOdometryModel2D.h:9
Interface for speed sources.
Definition: ISpeedSource.h:9
Odometry model for Ackermann, differential drive, and boat kinematics.
Definition: OdometryModel2D.h:35
void computeDeltaXY(float theta, uint32_t deltaTimeMs, float &deltaX, float &deltaY) const override
Compute position change (deltaX, deltaY) for odometry kinematics.
Definition: OdometryModel2D.h:79
Speed getSpeed() const override
Get the current speed of the vehicle.
Definition: OdometryModel2D.h:110
bool onMessage(const Message< float > &msg)
Handle an incoming message (pure virtual).
Definition: OdometryModel2D.h:87
float computeDeltaTheta(uint16_t deltaTimeMs) const override
Compute heading change (deltaTheta) for Ackermann kinematics.
Definition: OdometryModel2D.h:70
void setSpeedSource(ISpeedSource &speedSource) override
Set the speed source (e.g., encoder, estimator) for this model.
Definition: OdometryModel2D.h:41
Angle getSteeringAngle() const override
Get the current steering angle of the vehicle.
Definition: OdometryModel2D.h:111
virtual void updateSpeed(uint32_t deltaTimeMs)
Update the speed estimate based on elapsed time.
Definition: OdometryModel2D.h:58
Represents a speed measurement with unit conversion support.
Definition: Speed.h:40
DistanceUnit
Supported distance units for conversion and representation.
Definition: Distance.h:10
AngleUnit
Supported angle units for conversion and representation.
Definition: Angle.h:11
SpeedUnit
Supported speed units for conversion and representation.
Definition: Speed.h:10