4#include "TinyRobotics/motors/Motors.h"
7namespace tinyrobotics {
10enum QuadrotorMotorNo {
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
40template <
typename T=
float,
typename DriverT =
BrushedMotor<T>>
43 Quadrotor() =
default;
46
47
48
49 void setPins(QuadrotorMotorNo motor,
int in1,
int in2) {
50 motors_[motor].setPins(in1, in2);
51 motors_[motor].setID((uint8_t)motor);
56 throttle_ = constrain(percent, 0.0f, 100.0f);
62 roll_ = constrain(percent, -100.0f, 100.0f);
68 pitch_ = constrain(percent, -100.0f, 100.0f);
73 void setYaw(
float percent) {
74 yaw_ = constrain(percent, -100.0f, 100.0f);
85 for (
auto& motor : getMotors()) {
91
92
93
94
96 motorGain_[motor] = gain;
100 for (
int i = 0; i < 4; ++i) {
101 if (!motors_[i].isPinsSet())
return false;
108 switch (msg.content) {
109 case MessageContent::Throttle:
110 if (msg.unit != Unit::Percent)
return false;
111 setThrottle(
static_cast<
int>(msg.value));
113 case MessageContent::Pitch:
115 if (!toAngleDegree(angle, msg.unit, angle))
119 case MessageContent::Roll:
121 if (!toAngleDegree(angle, msg.unit, angle))
125 case MessageContent::Yaw:
127 if (!toAngleDegree(angle, msg.unit, angle))
136 std::vector<MessageContent> getControls()
const override {
137 return {MessageContent::Throttle, MessageContent::Pitch,
138 MessageContent::Roll, MessageContent::Yaw};
141 DriverT& getMotor(QuadrotorMotorNo motor) {
return motors_[motor]; }
143 std::vector<IMotor<T>*> getMotors()
override {
144 std::vector<IMotor<T>*> motors;
145 for (
int i = 0; i < 4; ++i) {
146 motors.push_back(&motors_[i]);
153 float motorGain_[4] = {1.0f, 1.0f, 1.0f, 1.0f};
160
161
162
163
164
165
166
167
168
169
173 m[0] = throttle_ + pitch_ + roll_ - yaw_;
174 m[1] = throttle_ + pitch_ - roll_ + yaw_;
175 m[2] = throttle_ - pitch_ + roll_ + yaw_;
176 m[3] = throttle_ - pitch_ - roll_ - yaw_;
177 for (
int i = 0; i < 4; ++i) {
178 int calibrated =
static_cast<
int>(m[i] * motorGain_[i]);
179 motors_[i].setSpeed(constrain(calibrated, 0, 100));
182 for (
int i = 0; i < 4; ++i) {
183 Message<
float> msg(MessageContent::MotorSpeed, m[i], Unit::Percent);
184 msg.origin = MessageOrigin::Motor;
186 Vehicle<T>::sendMessage(msg);
High-level H-Bridge motor driver class for bidirectional DC motor control.
Definition: BrushedMotor.h:36
Simple quadrotor (quadcopter) model with 4-motor control.
Definition: Quadrotor.h:41
void setPitch(float percent)
Definition: Quadrotor.h:67
void setMotorGain(QuadrotorMotorNo motor, float gain)
Set a calibration gain for a specific motor (default 1.0).
Definition: Quadrotor.h:95
void setRoll(float percent)
Definition: Quadrotor.h:61
void setThrottle(float percent)
Definition: Quadrotor.h:55
void end() override
Definition: Quadrotor.h:79
void updateMotors()
Update all motors based on throttle, roll, pitch, and yaw.
Definition: Quadrotor.h:170
void setYaw(float percent)
Definition: Quadrotor.h:73
bool isPinsSet() const
Check if the necessary pins for the vehicle's actuators have been set (pure virtual).
Definition: Quadrotor.h:99
bool onMessage(const Message< float > &msg) override
Handle an incoming message (pure virtual).
Definition: Quadrotor.h:106
void setPins(QuadrotorMotorNo motor, int in1, int in2)
Set the pins for a specific motor (0=front left, 1=front right, 2=rear left, 3=rear right)
Definition: Quadrotor.h:49
Abstract base class for all vehicle types.
Definition: Vehicle.h:26
Generic message structure for communication, parameterized by value type.
Definition: Message.h:72