3#include "TinyRobotics/motors/Motors.h"
6namespace tinyrobotics {
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
27template <
typename T=
float,
typename MotorMT =
BrushedMotor<T>,
31 CarAckerman() =
default;
34
35
36
37
38
39
40 void setPins(
int in1,
int in2,
int steeringPin) {
41 motor_.setPins(in1, in2);
42 steering_.setPin(steeringPin);
46
47
49 speed_ = constrain(percent *
Vehicle<T>::getSpeedFactor(), -100.0f, 100.0f);
50 motor_.setValuePercent(speed_);
52 Message<
float> msg(MessageContent::MotorSpeed, percent, Unit::Percent);
53 msg.origin = MessageOrigin::Vehicle;
54 Vehicle<T>::sendMessage(msg);
58
59
62 steering_.setAngle(angle);
64 Message<
float> msg(MessageContent::SteeringAngle, angle, Unit::AngleDegree);
65 msg.origin = MessageOrigin::Vehicle;
66 Vehicle<T>::sendMessage(msg);
69 void setSteeringAngle(
Angle angle) {
70 setSteeringAngle(
static_cast<
int>(angle.getValue(
AngleUnit::DEG)));
75 float getSpeed()
const {
return speed_; }
82 for (
auto* motor : getMotors()) {
83 if (motor) motor->end();
87 bool isPinsSet()
const {
return motor_.isPinsSet() && steering_.isPinsSet(); }
91 switch (msg.content) {
92 case MessageContent::Throttle:
93 if (msg.unit != Unit::Percent)
return false;
94 setSpeed(
static_cast<
int>(msg.value));
96 case MessageContent::SteeringAngle:
98 if (!toAngleDegree(angle, msg.unit, angle))
100 setSteeringAngle(angle);
102 case MessageContent::Obstacle:
103 Vehicle<T>::setSpeedFactor(0);
110 std::vector<MessageContent> getControls()
const override {
111 return {MessageContent::Throttle, MessageContent::SteeringAngle};
114 MotorMT& getMotor() {
return motor_; }
115 ServoMT& getServo() {
return steering_; }
117 std::vector<IMotor<T>*> getMotors()
override {
118 std::vector<IMotor<T>*> motors;
119 motors.push_back(&motor_);
120 motors.push_back(&steering_);
Represents an angle with unit conversion and wrap-around support.
Definition: Angle.h:42
High-level H-Bridge motor driver class for bidirectional DC motor control.
Definition: BrushedMotor.h:36
Car with Ackerman steering and single drive motor.
Definition: CarAckerman.h:29
void setSpeed(float percent)
Set drive speed (percent, -100 to 100). Positive = forward.
Definition: CarAckerman.h:48
void setSteeringAngle(float angle)
Set steering angle (degrees, left positive, right negative).
Definition: CarAckerman.h:60
void setPins(int in1, int in2, int steeringPin)
Set the pins for the drive motor and steering servo.
Definition: CarAckerman.h:40
void end() override
Definition: CarAckerman.h:78
bool isPinsSet() const
Check if the necessary pins for the vehicle's actuators have been set (pure virtual).
Definition: CarAckerman.h:87
bool onMessage(const Message< float > &msg) override
Handle an incoming message (pure virtual).
Definition: CarAckerman.h:89
High-level wrapper for Arduino Servo control (RC servo motors).
Definition: ServoMotor.h:40
Abstract base class for all vehicle types.
Definition: Vehicle.h:26
AngleUnit
Supported angle units for conversion and representation.
Definition: Angle.h:11
Generic message structure for communication, parameterized by value type.
Definition: Message.h:72