5#include "TinyRobotics/communication/Message.h"
6#include "TinyRobotics/communication/MessageHandler.h"
7#include "TinyRobotics/communication/MessageSource.h"
8#include "TinyRobotics/control/MotionState2D.h"
9#include "TinyRobotics/control/MotionState3D.h"
10#include "TinyRobotics/coordinates/Coordinate.h"
11#include "TinyRobotics/coordinates/Orientation3D.h"
12#include "TinyRobotics/units/Speed.h"
13#include "TinyRobotics/units/Distance.h"
14#include "TinyRobotics/units/AngularVelocity.h"
16namespace tinyrobotics {
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39template <
typename T =
float>
44 bool begin(
const Coordinate<T>& initialPosition = {0, 0, 0},
46 position = initialPosition;
47 orientation
.yaw = initialOrientation
.yaw;
50 speed = Speed3D(0.0f, 0.0f, 0.0f,
SpeedUnit::MPS);
56 void end() { is_active =
false; }
61 void update(T accelX, T accelY, T accelZ, T gyroX, T gyroY, T gyroZ,
62 unsigned long nowMillis) {
63 if (!is_active)
return;
64 if (lastUpdateMillis == 0) {
65 lastUpdateMillis = nowMillis;
68 T dt = (nowMillis - lastUpdateMillis) / (T)1000;
69 lastUpdateMillis = nowMillis;
73 orientation
.roll += gyroX * dt;
74 orientation
.pitch += gyroY * dt;
75 orientation
.yaw += gyroZ * dt;
80 T cr = cos(orientation
.roll), sr = sin(orientation
.roll);
81 T cp = cos(orientation
.pitch), sp = sin(orientation
.pitch);
82 T cy = cos(orientation
.yaw), sy = sin(orientation
.yaw);
84 T ax_world = cy * cp * accelX + (cy * sp * sr - sy * cr) * accelY +
85 (cy * sp * cr + sy * sr) * accelZ;
86 T ay_world = sy * cp * accelX + (sy * sp * sr + cy * cr) * accelY +
87 (sy * sp * cr - cy * sr) * accelZ;
88 T az_world = -sp * accelX + cp * sr * accelY + cp * cr * accelZ;
92 speed.getX(
SpeedUnit::MPS) + ax_world * dt,
93 speed.getY(
SpeedUnit::MPS) + ay_world * dt,
94 speed.getZ(
SpeedUnit::MPS) + az_world * dt,
98 float dx = speed.getX(
SpeedUnit::MPS) * dt;
99 float dy = speed.getY(
SpeedUnit::MPS) * dt;
100 float dz = speed.getZ(
SpeedUnit::MPS) * dt;
114 return lastAngularVelocity;
120 return Coordinate<DistanceM>(
static_cast<
float>(position.x),
static_cast<
float>(position.y),
static_cast<
float>(position.z));
126 Speed3D getSpeed()
const override {
130 return lastAngularVelocity;
134 bool is_active =
false;
136 Speed3D speed = Speed3D(0.0f, 0.0f, 0.0f,
SpeedUnit::MPS);
138 unsigned long lastUpdateMillis = 0;
146 msgPos.origin = MessageOrigin::IMU;
Represents a 3D angular velocity vector with unit support.
Definition: AngularVelocity.h:134
A generic 3D coordinate class for robotics, navigation, and spatial calculations.
Definition: Coordinate.h:57
Represents a 3D distance or position vector with unit support.
Definition: Distance.h:164
Basic 3D IMU dead-reckoning class.
Definition: IMU3D.h:40
Distance3D getLastDelta() const
Get the last delta update (dx, dy, dz)
Definition: IMU3D.h:111
Speed3D getLinearVelocity() const
Get the current linear velocity (m/s)
Definition: IMU3D.h:117
void update(T accelX, T accelY, T accelZ, T gyroX, T gyroY, T gyroZ, unsigned long nowMillis)
Definition: IMU3D.h:61
Orientation3D getOrientation() const override
Get the current orientation (IMotionState3D)
Definition: IMU3D.h:123
AngularVelocity3D getLastAngularVelocity() const
Get the last angular velocity (rad/s)
Definition: IMU3D.h:113
Coordinate< DistanceM > getPosition() const override
Get the current position (IMotionState3D)
Definition: IMU3D.h:119
Interface for representing the motion state of a robot in 3D space.
Definition: MotionState3D.h:34
Base class for message sources in the TinyRobotics communication framework.
Definition: MessageSource.h:35
Simple 3D orientation class (yaw, pitch, roll in radians)
Definition: Orientation3D.h:13
float roll
Roll angle (radians)
Definition: Orientation3D.h:22
float pitch
Pitch angle (radians)
Definition: Orientation3D.h:21
float yaw
Yaw angle (radians)
Definition: Orientation3D.h:20
AngularVelocityUnit
Supported angular velocity units for conversion and representation.
Definition: AngularVelocity.h:11
DistanceUnit
Supported distance units for conversion and representation.
Definition: Distance.h:10
SpeedUnit
Supported speed units for conversion and representation.
Definition: Speed.h:10
Unit
Units for message values.
Definition: Common.h:45
@ Meters
Distance in meters.
Generic message structure for communication, parameterized by value type.
Definition: Message.h:72