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