controls  3.0.0
Vehicle.h
Go to the documentation of this file.
1 #ifndef CONTROLS_VEHICLE_VEHICLE_H
2 #define CONTROLS_VEHICLE_VEHICLE_H
3 
10 #include <utils/Transforms.h>
11 #include <utils/concurrentqueue.h>
12 #include <vehicle/Request.h>
13 
14 #include <atomic>
15 #include <boost/uuid/name_generator.hpp>
16 #include <boost/uuid/random_generator.hpp>
17 #include <boost/uuid/uuid.hpp>
18 #include <boost/uuid/uuid_generators.hpp>
19 #include <future>
20 #include <limits>
21 #include <memory>
22 #include <mutex>
23 #include <shared_mutex>
24 
40 class Vehicle {
42  static constexpr double SATURATION_THRESHOLD = 1e-3;
43 
44 public:
47 
54 
56  boost::uuids::uuid request_uuid;
57 
59  double timestamp;
60 
62  double progress;
63 
65  uint8_t risk_factor;
66 
69 
72  };
73 
75  std::shared_ptr<SystemDynamicsBase> system;
76 
78  std::shared_ptr<ControllerConfig> controller_config;
79 
81  std::shared_ptr<VehicleControllerInterface> controller;
82 
84  std::unique_ptr<ThrustAllocator> thrust_allocator;
85 
87  std::shared_ptr<Trajectory6DOFLimits> vehicle_limits;
88 
97  Vehicle(std::shared_ptr<SystemDynamicsBase> system_dynamics, std::shared_ptr<ControllerConfig> controller_config,
98  std::shared_ptr<VehicleControllerInterface> vehicle_controller,
99  std::unique_ptr<ThrustAllocator> thrust_allocator);
100 
107  ~Vehicle();
108 
109  // Non-copyable and non-movable: mutex and unique_ptr members present
110  Vehicle(const Vehicle&) = delete;
111  Vehicle& operator=(const Vehicle&) = delete;
112  Vehicle(Vehicle&&) = delete;
113  Vehicle& operator=(Vehicle&&) = delete;
114 
115  /* ------------------------------------------------------------------ */
116  /* Producer API (called from service/action callbacks) */
117  /* ------------------------------------------------------------------ */
118 
125 
132 
144  std::unique_ptr<TrajectoryBase> trajectory);
145 
152 
153  /* ------------------------------------------------------------------ */
154  /* Consumer API (called from control_loop only) */
155  /* ------------------------------------------------------------------ */
156 
162  bool is_disabled() const;
163  bool is_stationkeeping() const;
164 
175  void process_pending(double t, const State& current_state, moodycamel::ConcurrentQueue<DebugMessage>& debug_queue);
176 
186  Vector6d get_force(double t, double dt, const State& current_state);
187 
195  std::tuple<bb_controls_msgs::msg::Thrusters, bb_controls_msgs::msg::ThrusterForces, Vector6d> allocate_force(
196  const Vector6d& force) const;
197 
203  void update_controller_status(const ControllerStatus& status);
204 
205  /* ------------------------------------------------------------------ */
206  /* Robot state (thread-safe) */
207  /* ------------------------------------------------------------------ */
208 
214  std::tuple<State, double> get_state() const;
215 
222  void set_state(const State& state, double t);
223 
224  /* ------------------------------------------------------------------ */
225  /* Battery voltage (thread-safe) */
226  /* ------------------------------------------------------------------ */
227 
233  float get_battery_voltage() const;
234 
240  void set_battery_voltage(float battery_voltage);
241 
242  /* ------------------------------------------------------------------ */
243  /* Trajectory queries */
244  /* ------------------------------------------------------------------ */
245 
253  double get_trajectory_progress(double t) const;
254 
255  /* ------------------------------------------------------------------ */
256  /* Controller */
257  /* ------------------------------------------------------------------ */
258 
265 
272  void update_saturation_cost(double yaw_xy, double z_rp);
273 
274 private:
275  std::atomic<ControllerState> controller_state_{ControllerState::DISABLED};
276  std::unique_ptr<TrajectoryBase> trajectory_;
279  State model_{};
280 
281  double state_time_ = 0.0;
282  State state_{};
283  mutable std::shared_mutex state_mutex_;
284 
285  float battery_voltage_ = std::numeric_limits<float>::max();
286  mutable std::mutex battery_voltage_mutex_;
287 
288  ControllerStatus controller_status_{};
289  mutable std::shared_mutex controller_status_mutex_;
290 
291  mutable std::mutex pending_request_mutex_;
292  std::vector<request::Request<request::RequestState::PENDING>> request_queue_;
293  boost::uuids::random_generator uuid_generator_;
294 
295  double saturation_cost_yaw_xy_ = 0.0;
296  double saturation_cost_z_rp_ = 0.0;
297 
307  void update_model_to_state(const State& current_state, bool preserve_twist_acceleration);
308 
310  request::RequestType type, std::unique_ptr<TrajectoryBase> trajectory = nullptr);
311 };
312 
313 #endif // CONTROLS_VEHICLE_VEHICLE_H
Eigen::Matrix< double, 6, 1 > Vector6d
Definition: Types.h:29
Central vehicle abstraction managing the controller state machine, trajectory execution,...
Definition: Vehicle.h:40
float get_battery_voltage() const
Returns the most recently stored battery voltage.
Definition: Vehicle.cpp:235
Vehicle(std::shared_ptr< SystemDynamicsBase > system_dynamics, std::shared_ptr< ControllerConfig > controller_config, std::shared_ptr< VehicleControllerInterface > vehicle_controller, std::unique_ptr< ThrustAllocator > thrust_allocator)
Constructs the vehicle with all required subsystems.
Definition: Vehicle.cpp:11
double get_trajectory_progress(double t) const
Returns fractional trajectory progress for the active trajectory.
Definition: Vehicle.cpp:270
ControllerStatus get_controller_status() const
Returns a thread-safe snapshot of the current controller status.
Definition: Vehicle.cpp:260
void set_state(const State &state, double t)
Stores a new vehicle state with its timestamp.
Definition: Vehicle.cpp:228
Vehicle & operator=(Vehicle &&)=delete
void update_controller_status(const ControllerStatus &status)
Writes a new controller status snapshot.
Definition: Vehicle.cpp:265
Vehicle & operator=(const Vehicle &)=delete
Vehicle(const Vehicle &)=delete
void set_battery_voltage(float battery_voltage)
Stores the current battery voltage.
Definition: Vehicle.cpp:240
~Vehicle()
Drains the pending request queue, fulfilling all unfulfilled promises.
Definition: Vehicle.cpp:22
bool is_stationkeeping() const
Definition: Vehicle.cpp:69
void process_pending(double t, const State &current_state, moodycamel::ConcurrentQueue< DebugMessage > &debug_queue)
Drains the pending request queue and performs state transitions.
Definition: Vehicle.cpp:73
ControllerState
Possible operational states of the controller.
Definition: Vehicle.h:46
std::shared_ptr< ControllerConfig > controller_config
Shared controller tuning parameters (set once in ctor, fields mutated by param callback)
Definition: Vehicle.h:78
Vector6d get_force(double t, double dt, const State &current_state)
Samples the active trajectory and runs the controller to compute a body force.
Definition: Vehicle.cpp:198
std::unique_ptr< ThrustAllocator > thrust_allocator
Thrust allocator (set once in ctor, called from control loop and teleop callback)
Definition: Vehicle.h:84
std::shared_ptr< VehicleControllerInterface > controller
Active vehicle controller implementation (set once in ctor, called from control loop only)
Definition: Vehicle.h:81
std::shared_ptr< Trajectory6DOFLimits > vehicle_limits
Velocity and acceleration limits (set once in ctor, fields mutated by param callback)
Definition: Vehicle.h:87
void update_saturation_cost(double yaw_xy, double z_rp)
Updates the per-axis thruster saturation cost used for integral anti-windup.
Definition: Vehicle.cpp:286
std::tuple< State, double > get_state() const
Returns the most recently stored vehicle state and its timestamp.
Definition: Vehicle.cpp:223
std::shared_ptr< SystemDynamicsBase > system
Shared vehicle dynamics model (set once in ctor, mutated via setters only)
Definition: Vehicle.h:75
std::tuple< bb_controls_msgs::msg::Thrusters, bb_controls_msgs::msg::ThrusterForces, Vector6d > allocate_force(const Vector6d &force) const
Allocates a body force vector to per-thruster PWM commands.
Definition: Vehicle.cpp:215
bool is_disabled() const
Returns true if the controller is currently in the DISABLED state.
Definition: Vehicle.cpp:65
Vector6d get_body_pose_error() const
Returns the most recent body-frame pose error from the active controller.
Definition: Vehicle.cpp:282
request::RequestHandle< request::RequestHandleState::PENDING > request_trajectory(std::unique_ptr< TrajectoryBase > trajectory)
Enqueues a request to execute a trajectory.
Definition: Vehicle.cpp:58
request::RequestHandle< request::RequestHandleState::PENDING > request_stationkeep()
Enqueues a request to enter the STATIONKEEP state.
Definition: Vehicle.cpp:54
Vehicle(Vehicle &&)=delete
request::RequestHandle< request::RequestHandleState::PENDING > request_disable()
Enqueues a request to enter the DISABLED state.
Definition: Vehicle.cpp:50
Definition: Request.h:29
RequestType
Definition: Request.h:25
6DOF rigid-body pose as a 3D position and unit quaternion orientation
Definition: Types.h:49
Full kinematic state of the vehicle.
Definition: Types.h:63
Snapshot of controller status exposed to external callers.
Definition: Vehicle.h:51
double timestamp
ROS time at which this status was last updated.
Definition: Vehicle.h:59
Pose current_pose
Most recent vehicle pose.
Definition: Vehicle.h:68
ControllerState state
Current controller state.
Definition: Vehicle.h:53
Vector6d body_pose_error
Most recent body-frame pose error [Δx, Δy, Δz, Δroll, Δpitch, Δyaw].
Definition: Vehicle.h:71
double progress
Fractional trajectory progress in [0, 1], or -1 if not running.
Definition: Vehicle.h:62
uint8_t risk_factor
Thruster slowdown scale factor.
Definition: Vehicle.h:65
boost::uuids::uuid request_uuid
UUID of the most recently activated request.
Definition: Vehicle.h:56