TinyRobotics
Loading...
Searching...
No Matches
MotorBoat.h
1#pragma once
2
3#include "TinyRobotics/motors/Motors.h"
4#include "Vehicle.h"
5
6namespace tinyrobotics {
7
8/**
9 * @class MotorBoat
10 * @ingroup vehicles
11 * @brief Motor boat with 1 drive motor and 1 rudder servo.
12 *
13 * This class abstracts a simple motor boat:
14 * - 1 drive motor (HBridge)
15 * - 1 rudder servo (ServoMotor)
16 *
17 * Usage Example:
18 * @code
19 * MotorBoat boat;
20 * boat.setPins(5, 6, 9); // in1, in2, rudderPin
21 * boat.setThrottle(70); // 70% throttle
22 * boat.setRudder(20); // 20 degrees left
23 * boat.stop(); // brake
24 * @endcode
25 */
26
27template <typename T=float, typename MotorMT = BrushedMotor<T>, typename ServoMT = ServoMotor<T>>
28class MotorBoat : public Vehicle<T> {
29 public:
30 MotorBoat() = default;
31
32 /**
33 * @brief Set the pins for the drive motor and rudder servo.
34 * @param in1 HBridge IN1
35 * @param in2 HBridge IN2
36 * @param pwm HBridge PWM
37 * @param rudderPin Servo pin for rudder
38 */
39 void setPins(int in1, int in2, int rudderPin) {
40 motor_.setPins(in1, in2);
41 rudder_.attach(rudderPin);
42 }
43
44 /**
45 * @brief Set the speed as a percentage (-100 to 100). Positive = forward.
46 * This applies the speed scaling factor (speedFactor) before setting throttle.
47 * @param percent Speed percentage (-100 to 100)
48 */
49 void setSpeed(float percent) {
50 setThrottle(percent*Vehicle<T>::getSpeedFactor());
51 }
52
53 /**
54 * @brief Set throttle (percent, -100 to 100). Positive = forward.
55 */
56 void setThrottle(float percent) {
57 motor_.setSpeedPercent(percent);
58 // publish throttle as message for telemetry
59 Message<float> msg(MessageContent::MotorSpeed, percent, Unit::Percent);
60 msg.origin = MessageOrigin::Vehicle;
61 Vehicle<T>::sendMessage(msg);
62 }
63
64 /**
65 * @brief Set rudder angle (degrees, left positive, right negative).
66 */
67 void setRudder(float angle) {
68 rudder_.setAngle(angle);
69 // publish rudder angle as message for telemetry
70 Message<float> msg(MessageContent::SteeringAngle, angle, Unit::AngleDegree);
71 msg.origin = MessageOrigin::Vehicle;
72 Vehicle<T>::sendMessage(msg);
73 }
74
75 void setRudder(Angle angle){
76 setRudder(static_cast<int>(angle.getValue(AngleUnit::DEG)));
77 }
78
79 void end() {
80 motor_.setSpeedPercent(0); // stop motor
81 rudder_.setAngle(0); // center rudder
82 // stop all motors
83 for (auto& motor : getMotors()) {
84 motor.end();
85 }
86
87 }
88
89 bool isPinsSet() const { return motor_.isPinsSet() && rudder_.isPinsSet(); }
90
91 bool onMessage(const Message<float>& msg) override {
92 float angle;
93 switch (msg.content) {
94 case MessageContent::Throttle:
95 if (msg.unit != Unit::Percent) return false;
96 setThrottle(static_cast<int>(msg.value));
97 return true;
98 case MessageContent::SteeringAngle:
99 angle = msg.value;
100 if (!toAngleDegree(angle, msg.unit, angle))
101 return false; // Invalid unit
102 setRudder(static_cast<int>(msg.value));
103 return true;
104 case MessageContent::Obstacle:
105 Vehicle<T>::setSpeedFactor(0);
106 return true;
107 default:
108 return false; // Unhandled message content
109 }
110 }
111
112 std::vector<MessageContent> getControls() const override {
113 return {MessageContent::Throttle, MessageContent::SteeringAngle};
114 }
115
116 MotorMT& getMotor() { return motor_; }
117
118 ServoMT& getServo() { return rudder_; }
119
120 std::vector<IMotor<T>*> getMotors() override {
121 std::vector<IMotor<T>*> motors;
122 motors.push_back(&motor_);
123 motors.push_back(&rudder_);
124 return motors;
125 }
126
127 protected:
128 MotorMT motor_;
129 ServoMT rudder_;
130};
131
132} // namespace tinyrobotics
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
Motor boat with 1 drive motor and 1 rudder servo.
Definition: MotorBoat.h:28
void setSpeed(float percent)
Set the speed as a percentage (-100 to 100). Positive = forward. This applies the speed scaling facto...
Definition: MotorBoat.h:49
void setThrottle(float percent)
Set throttle (percent, -100 to 100). Positive = forward.
Definition: MotorBoat.h:56
void setRudder(float angle)
Set rudder angle (degrees, left positive, right negative).
Definition: MotorBoat.h:67
void setPins(int in1, int in2, int rudderPin)
Set the pins for the drive motor and rudder servo.
Definition: MotorBoat.h:39
bool isPinsSet() const
Check if the necessary pins for the vehicle's actuators have been set (pure virtual).
Definition: MotorBoat.h:89
void end()
Reset the vehicle to a safe or neutral state (pure virtual).
Definition: MotorBoat.h:79
bool onMessage(const Message< float > &msg) override
Handle an incoming message (pure virtual).
Definition: MotorBoat.h:91
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