1 #ifndef CONTROLS_VEHICLE_VEHICLE_H
2 #define CONTROLS_VEHICLE_VEHICLE_H
11 #include <utils/concurrentqueue.h>
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>
23 #include <shared_mutex>
42 static constexpr
double SATURATION_THRESHOLD = 1e-3;
75 std::shared_ptr<SystemDynamicsBase>
system;
98 std::shared_ptr<VehicleControllerInterface> vehicle_controller,
144 std::unique_ptr<TrajectoryBase> trajectory);
175 void process_pending(
double t,
const State& current_state, moodycamel::ConcurrentQueue<DebugMessage>& debug_queue);
195 std::tuple<bb_controls_msgs::msg::Thrusters, bb_controls_msgs::msg::ThrusterForces, Vector6d>
allocate_force(
214 std::tuple<State, double>
get_state()
const;
276 std::unique_ptr<TrajectoryBase> trajectory_;
281 double state_time_ = 0.0;
283 mutable std::shared_mutex state_mutex_;
285 float battery_voltage_ = std::numeric_limits<float>::max();
286 mutable std::mutex battery_voltage_mutex_;
288 ControllerStatus controller_status_{};
289 mutable std::shared_mutex controller_status_mutex_;
291 mutable std::mutex pending_request_mutex_;
292 std::vector<request::Request<request::RequestState::PENDING>> request_queue_;
293 boost::uuids::random_generator uuid_generator_;
295 double saturation_cost_yaw_xy_ = 0.0;
296 double saturation_cost_z_rp_ = 0.0;
307 void update_model_to_state(
const State& current_state,
bool preserve_twist_acceleration);
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 ¤t_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 ¤t_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
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