Author: openrobots@laas.fr

# uavatt component

openrobots@laas.fr
1.3

## Ports

### uav_input (in)

Data structure `struct ::or_uav::input` `uav_input` `struct ::or::time::ts` `ts` `long` `sec` `long` `nsec` `boolean` `intrinsic` `optional< struct ::or::rb3d::force >` `thrust` `double` `x` `double` `y` `double` `z` `optional< struct ::or::t3d::att >` `att` `double` `qw` `double` `qx` `double` `qy` `double` `qz` `optional< struct ::or::t3d::avel >` `avel` `double` `wx` `double` `wy` `double` `wz` `optional< struct ::or::t3d::aacc >` `aacc` `double` `awx` `double` `awy` `double` `awz`

Attitude/thrust control input.

### wrench_measure (out)

Data structure `struct ::or_wrench_estimator::state` `wrench_measure` `struct ::or::time::ts` `ts` `long` `sec` `long` `nsec` `boolean` `intrinsic` `optional< struct ::or::rb3d::force >` `force` `double` `x` `double` `y` `double` `z` `optional< struct ::or::rb3d::force_cov >` `force_cov` `double` `cov[6]` `optional< struct ::or::rb3d::torque >` `torque` `double` `x` `double` `y` `double` `z` `optional< struct ::or::rb3d::torque_cov >` `torque_cov` `double` `cov[6]`

Provides current wrench measurements.

This port contains the current wrench exerted by the UAV according to the propeller measurements and the geometric model.

### rotor_input (out)

Data structure `struct ::or_rotorcraft::input` `rotor_input` `struct ::or::time::ts` `ts` `long` `sec` `long` `nsec` `enum ::or_rotorcraft::control_type` `control` ∈ { `velocity`, `throttle` } `sequence< double, 8 >` `desired`

### rotor_measure (in)

Data structure `struct ::or_rotorcraft::output` `rotor_measure` `sequence< struct ::or_rotorcraft::rotor_state, 8 >` `rotor` `struct ::or::time::ts` `ts` `long` `sec` `long` `nsec` `boolean` `emerg` `boolean` `spinning` `boolean` `starting` `boolean` `disabled` `double` `velocity` `double` `throttle` `double` `consumption` `double` `energy_level`

### state (in)

Data structure `struct ::or_pose_estimator::state` `state` `struct ::or::time::ts` `ts` `long` `sec` `long` `nsec` `boolean` `intrinsic` `optional< struct ::or::t3d::pos >` `pos` `double` `x` `double` `y` `double` `z` `optional< struct ::or::t3d::att >` `att` `double` `qw` `double` `qx` `double` `qy` `double` `qz` `optional< struct ::or::t3d::vel >` `vel` `double` `vx` `double` `vy` `double` `vz` `optional< struct ::or::t3d::avel >` `avel` `double` `wx` `double` `wy` `double` `wz` `optional< struct ::or::t3d::acc >` `acc` `double` `ax` `double` `ay` `double` `az` `optional< struct ::or::t3d::aacc >` `aacc` `double` `awx` `double` `awy` `double` `awz` `optional< struct ::or::t3d::pos_cov >` `pos_cov` `double` `cov[6]` `optional< struct ::or::t3d::att_cov >` `att_cov` `double` `cov[10]` `optional< struct ::or::t3d::att_pos_cov >` `att_pos_cov` `double` `cov[12]` `optional< struct ::or::t3d::vel_cov >` `vel_cov` `double` `cov[6]` `optional< struct ::or::t3d::avel_cov >` `avel_cov` `double` `cov[6]` `optional< struct ::or::t3d::acc_cov >` `acc_cov` `double` `cov[6]` `optional< struct ::or::t3d::aacc_cov >` `aacc_cov` `double` `cov[6]`

## Services

### set_mass (attribute)

Inputs `double` `mass`

### set_geom (attribute)

Inputs `double` `mass` Mass (kg) `double` `G[48]` Mapping from propellers velocity² to wrench

Set mass and allocation matrix

This is a generic function for setting the geometric parameters of the controlled robot. See set_gtmrp_geom (function) for a specialized function for tilted multi rotors robots.

### set_gtmrp_geom (function)

Inputs `unsigned short` `rotors` (default `"4"`) Number of rotors `double` `cx` (default `"0"`) X position of center of rotors wrt center of mass (m) `double` `cy` (default `"0"`) Y position of center of rotors wrt center of mass (m) `double` `cz` (default `"0"`) Z position of center of rotors wrt center of mass (m) `double` `armlen` (default `"0.23"`) Distance of rotors to the center (m) `double` `mass` (default `"1"`) Total mass (kg) `double` `rx` (default `"0"`) X rotation of the first rotor thrust vector (deg) `double` `ry` (default `"0"`) Y rotation of the first rotor thrust vector (deg) `short` `rz` (default `"-1"`) Z spin direction of the first rotor (1: ccw, -1: cw) `double` `cf` (default `"0.00065"`) Propeller thrust coefficient (N.s²) `double` `ct` (default `"1e-05"`) Propeller torque coefficient (N.m.s²)
Throws `exception ::uavatt::e_inval` `string<128>` `what`

Compute allocation matrix and inertia tensor for tilt rotors robots.

Generically Tilted Multi-Rotor Platforms (GTMRP) are made of a set of rotors evenly distributed in a horizontal plane. The rotors are tilted around an axis lying in the plane, all by the same angle but with alternating signs on the X axis. The spinning direction is also alternating.

This function is a specialization of the more generic set_geom (attribute).

### set_saturation_weights (attribute)

Inputs `struct ::uavatt::ids::servo_s::satweight_s` `satweight` `boolean` `enable` (default `"1"`) Enable wrench saturation `double` `thrust` (default `"10"`) Relative weight for thrust saturation `double` `lateral` (default `"1"`) Relative weight for lateral forces saturation `double` `tilt` (default `"100"`) Relative weight for roll and pitch saturation `double` `head` (default `"1"`) Relative weight for heading saturation
Throws `exception ::uavatt::e_inval` `string<128>` `what`

Select relative priority for thrust, titlting and heading.

When the controller reaches the physical wrench limits of the platform (see set_wlimit (attribute)), an optimisation algorithm finds the closest feasible wrench that keeps the same thurst direction as well as the same roll and pitch torque direction.

The weights specified here allow to give higher priority to certain components of the wrench and let them be less affected by the optimization algorithm. Higher weight means that the corresponding component is less likely to change in intensity.

### set_control_mode (attribute)

Inputs `enum ::uavatt::attitude_control_mode` `att_mode` (default `"::uavatt::tilt_prioritized"`) Attitude tracking control law ∈ { `full_attitude`, `tilt_prioritized` }

Select attitude tracking control law.

With `tilt_prioritized`, attitude error is split into a reduced attitude error, which describes the misalignment of the thrust direction, and a yaw error, which describes the heading orientation error. This is the default.

With `full_attitude`, a conventional controller, based on the full attitude error, is used.

### set_wlimit (attribute)

Inputs `double` `wmin` Minimum propeller velocity `double` `wmax` Maximum propeller velocity

### set_servo_gain (attribute)

Inputs `struct ::uavatt::ids::servo_s::gain_s` `gain` `double` `Kqxy` `double` `Kqz` `double` `Kwxy` `double` `Kwz`

### set_emerg (attribute)

Inputs `struct ::uavatt::ids::servo_s::emerg_s` `emerg` `double` `dq` (default `"5"`) Attitude uncertainty threshold (deg) `double` `dw` (default `"20"`) Angular velocity uncertainty threshold (deg/s)

Set thresholds for emergency hovering.

`dq` and `dw` represent the maximum uncertainty tolerated in the input state (in) for attitude (`dq`) and angular velocity (`dw`), measured as 3 times the standard deviation. By default, `dq` is 5⁰ and `dw` 20⁰/s. Beyond that threshold, an emergency hovering is started.

The emergency hovering uses no feedback, as the state is considered invalid. Thus, stability is not guaranteed …​

### get_servo_parameters (attribute)

Outputs `struct ::uavatt::ids::servo_s` `servo` `struct ::uavatt::ids::servo_s::satweight_s` `satweight` `boolean` `enable` `double` `thrust` `double` `lateral` `double` `tilt` `double` `head` `struct ::uavatt::ids::servo_s::gain_s` `gain` `double` `Kqxy` `double` `Kqz` `double` `Kwxy` `double` `Kwz` `enum ::uavatt::attitude_control_mode` `att_mode` ∈ { `full_attitude`, `tilt_prioritized` } `double` `ramp` `double` `scale` `struct ::uavatt::ids::servo_s::emerg_s` `emerg` `double` `dq` `double` `dw`

### get_geom_parameters (attribute)

Outputs `struct ::uavatt::ids::body_s` `body` `double` `G[48]` `double` `iG[48]` `double` `mass` `unsigned short` `rotors` `double` `wmin` `double` `wmax` `double` `wrench_min[6]` `double` `wrench_max[6]` `boolean` `init`

### get_reference (attribute)

Outputs `struct ::or_uav::input` `reference` `struct ::or::time::ts` `ts` `long` `sec` `long` `nsec` `boolean` `intrinsic` `optional< struct ::or::rb3d::force >` `thrust` `double` `x` `double` `y` `double` `z` `optional< struct ::or::t3d::att >` `att` `double` `qw` `double` `qx` `double` `qy` `double` `qz` `optional< struct ::or::t3d::avel >` `avel` `double` `wx` `double` `wy` `double` `wz` `optional< struct ::or::t3d::aacc >` `aacc` `double` `awx` `double` `awy` `double` `awz`

### servo (activity)

Throws `exception ::uavatt::e_input` `exception ::uavatt::e_geom`
Context In task `main` (frequency 1000.0 Hz) Reads port `uav_input (in)`

Track a desired attitude

### set_state (function)

Inputs `struct ::or::rb3d::force` `thrust`: Thrust `double` `x` `double` `y` `double` `z` `struct ::or::t3d::att` `att`: Orientation `double` `qw` `double` `qx` `double` `qy` `double` `qz` `struct ::or::t3d::avel` `avel`: Angular velocity `double` `wx` `double` `wy` `double` `wz` `struct ::or::t3d::aacc` `aacc`: Angular acceleration `double` `awx` `double` `awy` `double` `awz`
Throws `exception ::uavatt::e_geom`
Context Interrupts `servo (activity)`

Set the desired state

### coast (function)

Context Interrupts `servo (activity)`

Stop tracking a desired attitude

This sets the reference thrust to a purely vertical gravity-compensation vector with 0 angular velocity and acceleration, resulting in a coasting state. Any dynamic reference tracking is cancelled (see servo (activity)).

### log (function)

Inputs `string<64>` `path` (default `"/tmp/uavatt.log"`) Log file name `unsigned long` `decimation` (default `"1"`) Reduced logging frequency
Throws `exception ::uavatt::e_sys` `short` `code` `string<128>` `what`

Log controller data

### log_stop (function)

Stop logging

### log_info (function)

Outputs `unsigned long` `miss` Missed log entries `unsigned long` `total` Total log entries

Show missed log entries

## Tasks

### main

Context Frequency 1000.0 Hz Updates port `wrench_measure (out)` Updates port `rotor_input (out)` Reads port `rotor_measure (in)` Reads port `state (in)`