Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
141 commits
Select commit Hold shift + click to select a range
ab3bd3a
added Node, publisher, launch file, config file
Henrimha Sep 24, 2025
23fea72
added subscriber with topic in config
Henrimha Sep 24, 2025
1d1cb53
Added hpp file
Henrimha Sep 24, 2025
60dbb72
added subscriber to current velocity and pitch maybe
Henrimha Sep 24, 2025
252ec54
Changed parameter file, topic and subscriber name
Henrimha Oct 1, 2025
58a87f9
Made PI regulator, able to plot the thrust
Henrimha Oct 1, 2025
2760cbe
Implemented the LQR lib from python
Henrimha Oct 7, 2025
fc5d99b
added a PID_controller class
Henrimha Oct 8, 2025
b962ad5
changed datatypes, information flow
Henrimha Oct 8, 2025
5e8e77a
New get_paramters function, changed topics in test_node
Henrimha Oct 12, 2025
2fb9d91
nye versjonen av guidance
Oct 19, 2025
40eb88f
fixed code so that it likely could compile if I had Drake. Made a Uti…
Henrimha Oct 19, 2025
9141eca
Removed Drake, Changed from std::vector to Eigen in LQR
Henrimha Oct 22, 2025
064adef
los test
Oct 26, 2025
7019787
Implemented LQR solver, SLICOT call and some dimension mistakes
Henrimha Oct 26, 2025
bbd8564
merging origin/main into anbit/guidance
Oct 28, 2025
e6ae145
Resolve stash conflicts: keep my YAML; keep main's joystick node
Oct 28, 2025
4d22267
fixing my error
Oct 28, 2025
3f3e671
maths behind proportional LOS
Oct 29, 2025
2688e27
refactor: change los structure
Nov 2, 2025
798542a
refactor: remove unused los package
Nov 2, 2025
3bb8926
fix: fix ignore lib
Nov 2, 2025
3afca97
Fixed LQR_solve_k_p
Henrimha Nov 2, 2025
2f6c253
Changed LQR test file, it works
Henrimha Nov 5, 2025
9ec7fd4
Changed launch file, fixed QoS problem and changed ouput topic
Henrimha Nov 5, 2025
b7f63a9
Test: add test files for ALos and Plos
Nov 5, 2025
ee303e7
complete the restructuring of ros node
Nov 9, 2025
c687343
Complete los switchin
Nov 12, 2025
314a60b
All changes until christmas
Henrimha Nov 12, 2025
03560cf
[pre-commit.ci] auto fixes from pre-commit.com hooks
pre-commit-ci[bot] Nov 12, 2025
66b252e
ci: trigger Industrial CI on PRs and main branch pushes
kluge7 Nov 12, 2025
a36297a
Add C++ and CMake pre-commit hooks (#568)
kluge7 Nov 12, 2025
a10e639
docs: add pre-commit CI badge to README
kluge7 Nov 12, 2025
b2e632b
refactor: merge the two pre-commit files to replace the pre-commit-ci…
kluge7 Nov 16, 2025
ef96e1e
Feat/waypoint manager (#645)
jorgenfj Dec 19, 2025
8f15552
Refactor/type rename (#647)
jorgenfj Dec 22, 2025
84ae150
refactor to new utils ros packages (#648)
jorgenfj Dec 25, 2025
76da1d9
Added support for vortex utils and changed to using their ssa
Henrimha Jan 5, 2026
cb4156b
Fix: Issues from feedback on PR draft
Jan 6, 2026
5ce96ef
New parameters for water resistance
Henrimha Jan 6, 2026
1305ea7
removed unneccessary features, added euler angle publisher
Henrimha Jan 6, 2026
f5d698a
fixed dumb bugs
Henrimha Jan 6, 2026
524a97e
fix git
Jan 6, 2026
b7805ea
Fixed bugs so that it works
Henrimha Jan 6, 2026
8c61007
Start vector Feild LOS & Clean code
Jan 7, 2026
294ab77
Adda vector field LOS & Test
Jan 7, 2026
edc7185
Start quto-euler for graphing
Jan 8, 2026
763f784
Fix emailaddress error for git
anbit-adhi Jan 15, 2026
f073936
Fix building error
anbit-adhi Jan 16, 2026
70d0bb3
Clean the code
anbit-adhi Jan 23, 2026
65a37c2
reworked the LQR
Henrimha Jan 24, 2026
7273d43
minor changes to PID
Henrimha Jan 24, 2026
ab5a067
added framework for tests
Henrimha Jan 24, 2026
98d4faa
Finished tests for PID, and changed PID
Henrimha Jan 25, 2026
47b5121
Fix build error
anbit-adhi Jan 25, 2026
a55e636
added framework for LQR_tests, changed CMake into 2 files(test and no…
Henrimha Jan 25, 2026
c79cee8
Fixed integrator, unstability and LQR tests, added repository, other …
Henrimha Jan 31, 2026
5099e51
fixed bug and crash in LQR test
Henrimha Jan 31, 2026
6a13ca1
Fix surge error
anbit-adhi Feb 4, 2026
2baeae8
0;9uMerge branch 'main' into anbit/guidance
anbit-adhi Feb 4, 2026
5d31409
Added NMPC, functioning. Sinus references
Henrimha Feb 9, 2026
2bd2c4e
Add stoping msg publishes when goal reached
anbit-adhi Feb 11, 2026
52c919f
Add a square test script
anbit-adhi Feb 16, 2026
11e8d60
Fix Cmake problome for squaretest
anbit-adhi Feb 16, 2026
30568ab
Fix adaptive param lag
anbit-adhi Feb 16, 2026
73b460c
Add tuning parameters
anbit-adhi Feb 22, 2026
bb54545
Merge branch 'main' into anbit/guidance
anbit-adhi Feb 22, 2026
29a5709
merge main updates into this branch
anbit-adhi Feb 22, 2026
76f803e
Add tuned parameters
anbit-adhi Feb 24, 2026
6ecdc9f
Fix vector feild simulation issues
anbit-adhi Feb 24, 2026
4c59e21
Added acados NMPC, ill conditioned needs fixing
Henrimha Feb 25, 2026
b71f62c
Merge remote-tracking branch 'origin' into anbit/guidance
anbit-adhi Feb 25, 2026
3a10402
no longer numericly unstable, just numericly wrong
Henrimha Mar 1, 2026
17d89c9
Clean code and readMe draft
anbit-adhi Mar 8, 2026
374230a
ReadMe draft
anbit-adhi Mar 8, 2026
853741d
add changes to readMe file
anbit-adhi Mar 8, 2026
2476ace
Add more stuff in readme-file
anbit-adhi Mar 8, 2026
0f4094a
fix pre-commit issues
anbit-adhi Mar 8, 2026
a8bf5b4
Fix pre-commit header issues
anbit-adhi Mar 8, 2026
820694d
Merge remote-tracking branch 'origin' into anbit/guidance
anbit-adhi Mar 8, 2026
bdb00db
fix build error
anbit-adhi Mar 8, 2026
1d8df3a
Fixed LQR controller, signs, refactored into scripts folder, tried to…
Henrimha Mar 9, 2026
4beeab0
Changed how one verifies the control output from LQR
Henrimha Mar 9, 2026
c8a1da7
Fix issues with new operation_manager
anbit-adhi Mar 9, 2026
a2927ad
Add clamp for pitch
anbit-adhi Mar 9, 2026
7f7fdde
Fix some duplicate issues
anbit-adhi Mar 9, 2026
f64e566
Fix max_pitch to 55 degres
anbit-adhi Mar 9, 2026
4509286
Merge branch 'main' into anbit/guidance
anbit-adhi Mar 12, 2026
7a39ece
Fix: merge issiue
anbit-adhi Mar 12, 2026
3841172
Merge remote-tracking branch 'origin' into anbit/guidance
anbit-adhi Mar 15, 2026
0431417
Start: Test libraary for los
anbit-adhi Mar 16, 2026
ae31273
Merge remote-tracking branch 'origin/Henrik/velocity_control' into au…
anbit-adhi Mar 16, 2026
f495f8b
Initial fixes
Henrimha Mar 16, 2026
2e73cff
changed to lifecycle node
Henrimha Mar 19, 2026
b6f144b
changed to global parameter file
Henrimha Mar 19, 2026
c6a2047
Changed more to global paramter file
Henrimha Mar 19, 2026
4818dae
removed unneccessary parameters
Henrimha Mar 19, 2026
ef4517e
Add: Diffrent test scenraios for autopilot test
anbit-adhi Mar 23, 2026
1a9af09
changed State overload with msg_ptr, added reset function, changed re…
Henrimha Mar 23, 2026
c4e0770
changed the PID class, better interface and more checks
Henrimha Mar 23, 2026
44de4c7
set new controller in launch file
Henrimha Mar 23, 2026
77c69e2
Merge remote-tracking branch 'origin' into Henrik/velocity_control
Henrimha Mar 23, 2026
17b261c
changed autopilot global launch file to Composable Node
Henrimha Mar 23, 2026
94b1d70
changed launch files, works now
Henrimha Mar 24, 2026
5b68001
minor bug fixes
Henrimha Mar 24, 2026
b29e76d
untracked som files
Henrimha Mar 24, 2026
ff2cdc5
added autostart and odometry dropout checks
Henrimha Mar 24, 2026
07b3737
seperate config files for seperate drones, and PID parameters from co…
Henrimha Mar 24, 2026
0acc8cb
preparing to merge changes to autopilot branch and branch for pushing…
Henrimha Mar 24, 2026
32a51d2
more changes to prepare for merges
Henrimha Mar 24, 2026
a06855f
more changes to prepare for merges
Henrimha Mar 24, 2026
7ec9873
Add: Slowing down while reaching the goal
anbit-adhi Mar 24, 2026
52b958b
idk what this is
Henrimha Mar 24, 2026
b9e2d8a
Autopilot new start
anbit-adhi Mar 24, 2026
b61a37a
new fixes
Henrimha Mar 24, 2026
3e6f6f1
fixed error calculation, and NED to body calculation
Henrimha Mar 24, 2026
df6aab0
Some cleanup in LQR, ros, and added PID external error
Henrimha Mar 25, 2026
182688f
changed the file system so that test files is only built when testing
Henrimha Mar 25, 2026
e7a3eaa
cleaned up the program for push
Henrimha Mar 25, 2026
f4d9c57
Cleaned up a bit more, removed comments, Guidance_values class and LQ…
Henrimha Mar 25, 2026
c018821
Added ReadMe file
Henrimha Mar 25, 2026
31a3a0e
updated autopilot.launch.py
Henrimha Mar 29, 2026
cb88a38
updated to be on point with easter testing branch
Henrimha Mar 29, 2026
e02dc47
Removed .cache file from tracking
Henrimha Mar 29, 2026
de375d3
removed the changes in los_guidance
Henrimha Mar 29, 2026
bbe0eaf
Merge branch 'main' of github.com:vortexntnu/vortex-auv into Henrik/v…
Henrimha Mar 29, 2026
0c11cff
Minor changes here and there
Henrimha Mar 29, 2026
92a43c3
some pre commit hooks auto changes
Henrimha Mar 29, 2026
e198b16
updated guidance repositry from main
Henrimha Mar 29, 2026
6a90ce7
no move contructor and no move assignment
Henrimha Mar 29, 2026
a42b6c3
fixed some pre commit hooks
Henrimha Mar 29, 2026
6968952
more precommit hooks fixes
Henrimha Mar 29, 2026
6eb2d7e
final pre commit hooks
Henrimha Mar 29, 2026
786b98e
reverted guidance to main
Henrimha Mar 29, 2026
c106bbb
new try at reverting guidance to version from main
Henrimha Mar 29, 2026
edf1e1b
thougts and prayers
Henrimha Mar 29, 2026
c1ae0ac
first draft of fixing PR comments, and added control manager and gene…
Henrimha Apr 1, 2026
e438f33
minor tuning
Henrimha Apr 2, 2026
f080525
Changed initialization of controllers
Henrimha Apr 10, 2026
6b5e9ce
Merge branch 'main' of github.com:vortexntnu/vortex-auv into Henrik/v…
Henrimha Apr 10, 2026
e29606d
removed changes to config files
Henrimha Apr 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 43 additions & 35 deletions auv_setup/launch/autopilot.launch.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
from launch.actions import (
OpaqueFunction,
)
from launch_ros.actions import Node
from launch_ros.actions import ComposableNodeContainer
from launch_ros.descriptions import ComposableNode

from auv_setup.launch_arg_common import (
declare_drone_and_namespace_args,
Expand All @@ -15,45 +16,52 @@

def launch_setup(context, *args, **kwargs):
drone, namespace = resolve_drone_and_namespace(context)

velocity_lqr_config = os.path.join(
get_package_share_directory("velocity_controller_lqr"),
"config",
"param_velocity_controller_lqr.yaml",
)

los_config = os.path.join(
get_package_share_directory("los_guidance"),
"config",
"guidance_params.yaml",
)

drone_params = os.path.join(
get_package_share_directory("auv_setup"),
"config",
"robots",
f"{drone}.yaml",
get_package_share_directory('auv_setup'),
'config',
'robots',
f'{drone}.yaml',
)

los_node = Node(
package="los_guidance",
executable="los_guidance_node",
name="los_guidance_node",
namespace=namespace,
parameters=[drone_params, los_config],
output="screen",
velocity_control_params = os.path.join(
get_package_share_directory('velocity_controller'),
'config',
f'{drone}_params.yaml',
)

lqr_node = Node(
package="velocity_controller_lqr",
executable="velocity_controller_lqr_node.py",
name="velocity_controller_lqr_node",
los_config = os.path.join(
get_package_share_directory('los_guidance'),
'config',
'guidance_params.yaml',
)
container = ComposableNodeContainer(
name='autopilot_container',
namespace=namespace,
output="screen",
parameters=[drone_params, velocity_lqr_config],
package='rclcpp_components',
executable='component_container_mt',
composable_node_descriptions=[
ComposableNode(
package='velocity_controller',
plugin='velocity_node',
name='velocity_controller_node',
namespace=namespace,
parameters=[velocity_control_params, drone_params],
extra_arguments=[{"use_intra_process_comms": True}],
),
ComposableNode(
package='los_guidance',
plugin='vortex::guidance::los::LosGuidanceNode',
name='los_guidance_node',
namespace=namespace,
parameters=[
drone_params,
{"los_config_file": los_config, "time_step": 0.1},
],
extra_arguments=[{"use_intra_process_comms": True}],
),
],
output='screen',
arguments=['--ros-args', '--log-level', 'error'],
)

return [los_node, lqr_node]
return [container]


def generate_launch_description():
Expand Down
77 changes: 77 additions & 0 deletions control/velocity_controller/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
cmake_minimum_required(VERSION 3.8)
project(velocity_controller)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()


find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_lifecycle REQUIRED)
find_package(rclcpp_components REQUIRED)
find_package(lifecycle_msgs REQUIRED)
find_package(std_msgs REQUIRED)
find_package(vortex_msgs REQUIRED)
find_package(vortex_utils REQUIRED)
find_package(Eigen3 REQUIRED)
find_package(geometry_msgs REQUIRED)
find_package(nav_msgs REQUIRED)
find_package(ct_optcon REQUIRED)
find_package(ct_core REQUIRED)
find_package(casadi REQUIRED)

include_directories(
include
)


set(LIB_NAME velocity_controller_component)
add_library(${LIB_NAME} SHARED
src/velocity_controller_ros.cpp
src/PID_controller.cpp
src/LQR_setup.cpp
src/utilities.cpp
src/ct_instantiations.cpp
src/control_manager.cpp
src/3DOF_PID.cpp
)
rclcpp_components_register_nodes(${LIB_NAME} "Velocity_node")
ament_target_dependencies(${LIB_NAME}
rclcpp
rclcpp_components
rclcpp_lifecycle
lifecycle_msgs
std_msgs
vortex_msgs
geometry_msgs
nav_msgs
vortex_utils
)
target_link_libraries(${LIB_NAME} Eigen3::Eigen casadi::casadi ct_optcon ct_core)
install(TARGETS
${LIB_NAME}
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)

install(
DIRECTORY include/
DESTINATION include
)

install(DIRECTORY
launch
config
DESTINATION share/${PROJECT_NAME}/
)

if(BUILD_TESTING)
add_subdirectory(tests)
endif()

ament_package()
201 changes: 201 additions & 0 deletions control/velocity_controller/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
# velocity_controller

ROS2 lifecycle node for velocity control of an AUV (autonomous underwater vehicle). Supports two control strategies — a PID controller and an LQR controller.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

clear chat text, remove — and AUV explanation


---

## Overview

The package implements a `Velocity_node` that subscribes to odometry and guidance inputs, computes thrust commands, and publishes them as `WrenchStamped` messages. The node is managed as a ROS2 lifecycle node, meaning it can be managed by a lifecycle manager, however if you do not want to use a lifecycle manager you can change the parameter autostart in the parameter file so that it automatically goes into active state.

The LQR controller linearizes the vehicle dynamics around the current state at each timestep (gain-scheduled LQR), using a body-frame model that includes linear hydrodynamic damping, Coriolis effects, and integral action for steady-state error rejection. The PID controller serves as a simpler backup.

---

## Dependencies
//TODO(henrimha): fix the dependencies
| Dependency | Purpose |
|---|---|
| `rclcpp` / `rclcpp_lifecycle` | ROS2 node and lifecycle management |
| `Eigen3` | Matrix math for LQR |
| `control_toolbox` (`ct::optcon`) | Riccati equation solver for LQR gain |
| `CasADi` | Used in utilities (NMPC-related) |
| `vortex_msgs` | Custom guidance message (`LOSGuidance`) |
| `nav_msgs` | Odometry input |
| `geometry_msgs` | Thrust output (`WrenchStamped`) |
Comment on lines +19 to +25
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i see more dependencies here, something isnt right:

rclcpp
std_msgs
vortex_msgs
geometry_msgs
nav_msgs
vortex_utils
rclcpp_lifecycle
rclcpp_components
lifecycle_msgs
auv_setup


---

## Topics

| Topic | Type | Direction | Description |
|---|---|---|---|
| `topic_thrust` | `geometry_msgs/WrenchStamped` | Published | Force and torque commands to thruster allocator |
| `topic_guidance` | `vortex_msgs/LOSGuidance` | Subscribed | Desired surge, pitch, yaw from guidance system |
| `topic_odometry` | `nav_msgs/Odometry` | Subscribed | Current vehicle state from state estimator |

Topic names are configurable via ROS2 global parameter file.

---

## Parameters

All parameters are loaded in the constructor via `get_new_parameters()`.

### Controller selection

| Parameter | Type | Description |
|---|---|---|
| `controller_type` | `int` | `1` = PID, `2` = LQR |
| `publish_rate` | `int` | Control loop frequency in Hz |
| `max_force` | `double` | Saturation limit applied to all outputs (N / Nm) |

### LQR parameters

| Parameter | Type | Dimension | Description |
|---|---|---|---|
| `Q` | `double[]` | 8 | Diagonal of state weight matrix. States: `[surge_err, pitch_err, yaw_err, pitch_rate_err, yaw_rate_err, ∫surge, ∫pitch, ∫yaw]` |
| `R` | `double[]` | 3 | Diagonal of input weight matrix. Inputs: `[Fx, Ty, Tz]` |
| `inertia_matrix` | `double[]` | 36 | Row-major 6x6 rigid body inertia matrix |
| `dampening_matrix_low` | `double[]` | 36 | Row-major 6x6 hydrodynamic damping matrix at low speed |
Comment on lines +59 to +60
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

give dimention, size is eh


### PID parameters

Each axis (surge, pitch, yaw) takes a parameter vector of the form `[Kp, Ki, Kd]`.

| Parameter | Description |
|---|---|
| `surge_params` | PID gains for surge |
| `pitch_params` | PID gains for pitch |
| `yaw_params` | PID gains for yaw |

### Behaviour flags

| Parameter | Type | Description |
|---|---|---|
| `reset_on_new_ref` | `bool` | Reset integrators when a new guidance reference arrives |
| `anti_overshoot` | `bool` | Enable anti-overshoot logic |
| `odometry_dropout_guard` | `bool` | Stop publishing if odometry stops arriving |
| `auto_start` | `bool` | If true, node self-transitions to active on startup |


---

## Lifecycle states

The node uses the standard ROS2 managed lifecycle:

```
Unconfigured → [configure] → Inactive → [activate] → Active
← [deactivate] ←
```

If `auto_start` is set to `true` in the parameters, the node will automatically call configure and activate itself after startup without needing an external lifecycle manager.

To manually manage the node:

```bash
# Configure
ros2 lifecycle set /velocity_controller configure

# Activate
ros2 lifecycle set /velocity_controller activate

# Deactivate
ros2 lifecycle set /velocity_controller deactivate

# Cleanup
ros2 lifecycle set /velocity_controller cleanup

# Shutdown
ros2 lifecycle set /velocity_controller shutdown

```

---

## Controller details

### LQR

The LQR controller uses an 8-state augmented model in the body frame:

```
x = [surge_err, pitch_err, yaw_err, pitch_rate_err, yaw_rate_err, ∫surge, ∫pitch, ∫yaw]
u = [Fx, Ty, Tz]
```

The system matrix `A` is re-linearized around the current state every control timestep. Guidance references in NED are converted to body-frame errors using the rotation matrix method before being passed to the controller — not by angle subtraction.

The gain `K` is computed by solving the continuous-time algebraic Riccati equation via `ct::optcon::LQR`. The control law is:
Comment on lines +128 to +130
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

perhaps give me the DLQR equation here


```
u = K * x_error
```
//TODO(henrimha): give the riccatti equation
where `ct::optcon` produces `K` such that this is equivalent to `u = -K * (x - x_ref)`.

If the Riccati solver fails (e.g. due to an unstabilizable operating point), the node automatically falls back to PID and logs an error.

### PID

Three independent PID controllers run on surge, pitch, and yaw. Each supports anti-windup via integrator clamping. The derivative term can be computed either from the error signal or from a separately provided error derivative, depending on which `calculate_thrust` overload is called.

---

## Building

```bash
colcon build --packages-select velocity_controller --symlink-install
source install/setup.bash
```
or with

```bash
colcon build --packages-up-to velocity_controller --symlink-install
source install/setup.bash
```
Done in root of workspace
---

## Running

Via a launch file with a parameter file:

```bash
ros2 launch velocity_controller velocity_controller.launch.py
```

---

## Tests
There are system tests and a helper node that generates a reference for the controller to follow.
Tests are build like this:
```bash
colcon build --packages-select velocity_controller --symlink-install --cmake-args -DBUILD_TESTING=ON
source install/setup.bash
```
System tests are run with the command

```bash
colcon test
```

Helper node is run with

```bash
ros2 launch velocity_controller VCnTest.launch.py
```

## Notes for new team members

- The guidance input is expected in NED frame (north-east-down). The controller handles the NED-to-body conversion internally.
- All angle errors are wrapped to `[-π, π]` using `ssa()` (smallest signed angle) before being fed to the controller.
- The LQR Q matrix ordering matters — the 8 diagonal values correspond exactly to `[surge_err, pitch_err, yaw_err, pitch_rate_err, yaw_rate_err, ∫surge, ∫pitch, ∫yaw]` in that order.
- If the vehicle behaves oddly, check that `interval_` (the control timestep) is being set correctly — a value of `0` disables integral action silently.

## Adding new controllers
After adding the hpp file, add the calculation to calc_thrust function in a new switch case, add to the reset_controller function, with options to reset only one integral, lastly update documentation. Remember to initialize correctly, either in 'on_configure' or in constructor, add the appropriate parameters, and update all the {drone}_params.yaml files.

## Adding new drones
Copy a {drone}_params.yaml file and change the name to the new name of the drone. Add the appropriate matrices, and tune to satisfying behaviour.
Loading
Loading