From 6038c22174cecf6b84af2bd03be5cf58f86eb7f6 Mon Sep 17 00:00:00 2001 From: Roman <bapstroman@gmail.com> Date: Tue, 4 Sep 2018 17:28:35 +0200 Subject: [PATCH] added a weathervane library - computes a yaw-rate setpoint that tries to rotate the nose of the vehicle into the relative wind. Signed-off-by: Roman <bapstroman@gmail.com> --- src/lib/CMakeLists.txt | 1 + src/lib/WeatherVane/CMakeLists.txt | 34 ++++++++++++ src/lib/WeatherVane/WeatherVane.cpp | 82 +++++++++++++++++++++++++++++ src/lib/WeatherVane/WeatherVane.hpp | 80 ++++++++++++++++++++++++++++ 4 files changed, 197 insertions(+) create mode 100644 src/lib/WeatherVane/CMakeLists.txt create mode 100644 src/lib/WeatherVane/WeatherVane.cpp create mode 100644 src/lib/WeatherVane/WeatherVane.hpp diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 4bce1a28eb..45956ee7f8 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -55,3 +55,4 @@ add_subdirectory(rc) add_subdirectory(terrain_estimation) add_subdirectory(tunes) add_subdirectory(version) +add_subdirectory(WeatherVane) diff --git a/src/lib/WeatherVane/CMakeLists.txt b/src/lib/WeatherVane/CMakeLists.txt new file mode 100644 index 0000000000..53b0d2c1a4 --- /dev/null +++ b/src/lib/WeatherVane/CMakeLists.txt @@ -0,0 +1,34 @@ +############################################################################ +# +# Copyright (c) 2018 PX4 Development Team. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# 3. Neither the name PX4 nor the names of its contributors may be +# used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS +# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE +# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, +# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS +# OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN +# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +# POSSIBILITY OF SUCH DAMAGE. +# +############################################################################ + +px4_add_library(WeatherVane WeatherVane.cpp) \ No newline at end of file diff --git a/src/lib/WeatherVane/WeatherVane.cpp b/src/lib/WeatherVane/WeatherVane.cpp new file mode 100644 index 0000000000..ff7edd0dff --- /dev/null +++ b/src/lib/WeatherVane/WeatherVane.cpp @@ -0,0 +1,82 @@ +/**************************************************************************** + * + * Copyright (c) 2018 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file WeatherVane.cpp + * Weathervane controller. + * + */ + +#include "WeatherVane.hpp" +#include <mathlib/mathlib.h> + + +WeatherVane::WeatherVane() +{ + _q_sp_prev = matrix::Quatf(); +} + +void WeatherVane::update(matrix::Quatf q_sp_prev, float yaw) +{ + _q_sp_prev = q_sp_prev; + _yaw = yaw; +} + +float WeatherVane::get_weathervane_yawrate() +{ + matrix::Dcmf R_sp(_q_sp_prev); + + // direction of desired body z axis represented in earth frame + matrix::Vector3f body_z_sp(R_sp(0, 2), R_sp(1, 2), R_sp(2, 2)); + + // rotate desired body z axis into new frame which is rotated in z by the current + // heading of the vehicle. we refer to this as the heading frame. + matrix::Dcmf R_yaw = matrix::Eulerf(0.0f, 0.0f, -_yaw); + body_z_sp = R_yaw * body_z_sp; + body_z_sp.normalize(); + + float roll_sp = -asinf(body_z_sp(1)); + + float roll_exceeding_treshold = 0; + + if (roll_sp > _wv_min_roll_rad) { + roll_exceeding_treshold = roll_sp - _wv_min_roll_rad; + + } else if (roll_sp < -_wv_min_roll_rad) { + roll_exceeding_treshold = roll_sp + _wv_min_roll_rad; + + } + + return math::constrain(roll_exceeding_treshold * _wv_gain, -_wv_yawrate_max_rad, + _wv_yawrate_max_rad); +} \ No newline at end of file diff --git a/src/lib/WeatherVane/WeatherVane.hpp b/src/lib/WeatherVane/WeatherVane.hpp new file mode 100644 index 0000000000..d9db35f1ef --- /dev/null +++ b/src/lib/WeatherVane/WeatherVane.hpp @@ -0,0 +1,80 @@ +/**************************************************************************** + * + * Copyright (c) 2018 PX4 Development Team. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * 3. Neither the name PX4 nor the names of its contributors may be + * used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN + * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************/ + +/** + * @file WeatherVane.hpp + * @author Ivo Drescher + * @author Roman Bapst <roman@auterion.com> + * + * Weathervane controller. + * + */ + +#pragma once + +#include <matrix/matrix/math.hpp> + +class WeatherVane +{ +public: + WeatherVane(); + + ~WeatherVane() {}; + + void activate() {_is_active = true;} + + void deactivate() {_is_active = false;} + + bool is_active() {return _is_active;} + + void update(matrix::Quatf q_sp_prev, float yaw); + + float get_weathervane_yawrate(); + + void set_weathervane_gain(float gain) {_wv_gain = gain;} + + void set_min_roll_rad(float min_roll_rad) {_wv_min_roll_rad = min_roll_rad;} + + void set_yawrate_max_rad(float yawrate_max_rad) {_wv_yawrate_max_rad = yawrate_max_rad;} + +private: + matrix::Quatf _q_sp_prev; // previous attitude setpoint quaternion + float _yaw = 0.0f; // current yaw angle + + bool _is_active = true; + + float _wv_gain = 1.0f; // gain that maps excessive roll angle setpoint to yawrate setoint [1/s] + float _wv_min_roll_rad = 0.01f; // minimum roll angle setpoint for the controller to output a non-zero yawrate setpoint + float _wv_yawrate_max_rad = 1.0f; // maximum yaw-rate the controller will output + +}; \ No newline at end of file -- GitLab