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_;
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);
144 std::unique_ptr<TrajectoryBase> trajectory);
177 bool process_pending(
double t,
const State& current_state, moodycamel::ConcurrentQueue<DebugMessage>& debug_queue);
198 std::tuple<bb_controls_msgs::msg::Thrusters, bb_controls_msgs::msg::ThrusterForces, Vector6d>
allocate_force(
217 std::tuple<State, double>
get_state()
const;
298 std::unique_ptr<TrajectoryBase> trajectory_;
303 double state_time_ = 0.0;
305 Vector3d setpoint_offset_ = Vector3d::Zero();
306 mutable std::shared_mutex state_mutex_;
308 float battery_voltage_ = std::numeric_limits<float>::max();
309 mutable std::mutex battery_voltage_mutex_;
311 ControllerStatus controller_status_{};
312 mutable std::shared_mutex controller_status_mutex_;
314 mutable std::mutex pending_request_mutex_;
315 std::vector<request::Request<request::RequestState::PENDING>> request_queue_;
316 boost::uuids::random_generator uuid_generator_;
318 double saturation_cost_yaw_xy_ = 0.0;
319 double saturation_cost_z_rp_ = 0.0;
330 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
std::shared_ptr< SystemDynamicsBase > system_
Shared vehicle dynamics model (set once in ctor, mutated via setters only)
Definition: Vehicle.h:75
float get_battery_voltage() const
Returns the most recently stored battery voltage.
Definition: Vehicle.cpp:258
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:293
ControllerStatus get_controller_status() const
Returns a thread-safe snapshot of the current controller status.
Definition: Vehicle.cpp:283
void set_state(const State &state, double t)
Stores a new vehicle state with its timestamp.
Definition: Vehicle.cpp:251
Vehicle & operator=(Vehicle &&)=delete
void update_controller_status(const ControllerStatus &status)
Writes a new controller status snapshot.
Definition: Vehicle.cpp:288
std::shared_ptr< VehicleControllerInterface > controller_
Active vehicle controller implementation (set once in ctor, called from control loop only)
Definition: Vehicle.h:81
Vehicle & operator=(const Vehicle &)=delete
Vehicle(const Vehicle &)=delete
void set_battery_voltage(float battery_voltage)
Stores the current battery voltage.
Definition: Vehicle.cpp:263
~Vehicle()
Drains the pending request queue, fulfilling all unfulfilled promises.
Definition: Vehicle.cpp:22
bool is_stationkeeping() const
Definition: Vehicle.cpp:69
ControllerState
Possible operational states of the controller.
Definition: Vehicle.h:46
bool 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
void reset_setpoint_offset()
Resets the setpoint offset to zero.
Definition: Vehicle.cpp:246
void add_setpoint_offset(const Vector3d &delta)
Accumulates a world-frame position offset onto the setpoint offset.
Definition: Vehicle.cpp:241
std::shared_ptr< Trajectory6DOFLimits > vehicle_limits_
Velocity and acceleration limits (set once in ctor, fields mutated by param callback)
Definition: Vehicle.h:87
Vector3d get_setpoint_offset() const
Returns the setpoint offset accumulated from rejected odometry jumps.
Definition: Vehicle.cpp:236
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:309
std::tuple< State, double > get_state() const
Returns the most recently stored vehicle state and its timestamp.
Definition: Vehicle.cpp:231
Vector6d get_force(double t, double dt, const State ¤t_state, const Vector3d &setpoint_offset)
Samples the active trajectory and runs the controller to compute a body force.
Definition: Vehicle.cpp:203
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< ControllerConfig > controller_config_
Shared controller tuning parameters (set once in ctor, fields mutated by param callback)
Definition: Vehicle.h:78
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:223
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:305
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