From bde89fd4e207dd110f14bb07be5a29d57239f505 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 9 Dec 2013 17:33:54 +1100 Subject: [PATCH] AP_Compass: added compass offsets for 2nd compass --- libraries/AP_Compass/AP_Compass_HIL.cpp | 2 +- libraries/AP_Compass/AP_Compass_HMC5843.cpp | 2 +- libraries/AP_Compass/AP_Compass_PX4.cpp | 2 +- libraries/AP_Compass/Compass.cpp | 124 ++++++++++---------- libraries/AP_Compass/Compass.h | 9 +- 5 files changed, 73 insertions(+), 66 deletions(-) diff --git a/libraries/AP_Compass/AP_Compass_HIL.cpp b/libraries/AP_Compass/AP_Compass_HIL.cpp index 69673ab1fa..efc797137c 100644 --- a/libraries/AP_Compass/AP_Compass_HIL.cpp +++ b/libraries/AP_Compass/AP_Compass_HIL.cpp @@ -51,7 +51,7 @@ void AP_Compass_HIL::_setup_earth_field(void) bool AP_Compass_HIL::read() { // get offsets - Vector3f ofs = _offset.get(); + Vector3f ofs = _offset[0].get(); // apply motor compensation if(_motor_comp_type != AP_COMPASS_MOT_COMP_DISABLED && _thr_or_curr != 0.0f) { diff --git a/libraries/AP_Compass/AP_Compass_HMC5843.cpp b/libraries/AP_Compass/AP_Compass_HMC5843.cpp index 93c77f98d7..c482369c4d 100644 --- a/libraries/AP_Compass/AP_Compass_HMC5843.cpp +++ b/libraries/AP_Compass/AP_Compass_HMC5843.cpp @@ -341,7 +341,7 @@ bool AP_Compass_HMC5843::read() _field[0].rotate(_board_orientation); } - _field[0] += _offset.get(); + _field[0] += _offset[0].get(); // apply motor compensation if(_motor_comp_type != AP_COMPASS_MOT_COMP_DISABLED && _thr_or_curr != 0.0f) { diff --git a/libraries/AP_Compass/AP_Compass_PX4.cpp b/libraries/AP_Compass/AP_Compass_PX4.cpp index d7b56d8451..ea29c243af 100644 --- a/libraries/AP_Compass/AP_Compass_PX4.cpp +++ b/libraries/AP_Compass/AP_Compass_PX4.cpp @@ -118,7 +118,7 @@ bool AP_Compass_PX4::read(void) _sum[i].rotate(_board_orientation); } - _sum[i] += _offset.get(); + _sum[i] += _offset[i].get(); // apply motor compensation if (_motor_comp_type != AP_COMPASS_MOT_COMP_DISABLED && _thr_or_curr != 0.0f) { diff --git a/libraries/AP_Compass/Compass.cpp b/libraries/AP_Compass/Compass.cpp index 3b76a4fa97..6eb3130eef 100644 --- a/libraries/AP_Compass/Compass.cpp +++ b/libraries/AP_Compass/Compass.cpp @@ -22,7 +22,7 @@ const AP_Param::GroupInfo Compass::var_info[] PROGMEM = { // @Description: Offset to be added to the compass z-axis values to compensate for metal in the frame // @Range: -400 400 // @Increment: 1 - AP_GROUPINFO("OFS", 1, Compass, _offset, 0), + AP_GROUPINFO("OFS", 1, Compass, _offset[0], 0), // @Param: DEC // @DisplayName: Compass declination @@ -98,6 +98,10 @@ const AP_Param::GroupInfo Compass::var_info[] PROGMEM = { // @User: Advanced AP_GROUPINFO("EXTERNAL", 9, Compass, _external, 0), +#if COMPASS_MAX_INSTANCES > 1 + AP_GROUPINFO("OFS2", 10, Compass, _offset[1], 0), +#endif + AP_GROUPEND }; @@ -123,19 +127,15 @@ Compass::init() void Compass::set_offsets(const Vector3f &offsets) { - _offset.set(offsets); + _offset[0].set(offsets); } void Compass::save_offsets() { - _offset.save(); -} - -const Vector3f & -Compass::get_offsets() const -{ - return _offset; + for (uint8_t k=0; k max_change) { + diff *= max_change / length; + } - // limit the change from any one reading. This is to prevent - // single crazy readings from throwing off the offsets for a long - // time - length = diff.length(); - if (length > max_change) { - diff *= max_change / length; + // set the new offsets + _offset[k].set(_offset[k].get() - diff); } - - // set the new offsets - _offset.set(_offset.get() - diff); } diff --git a/libraries/AP_Compass/Compass.h b/libraries/AP_Compass/Compass.h index 4677c35370..f7ff66bd6c 100644 --- a/libraries/AP_Compass/Compass.h +++ b/libraries/AP_Compass/Compass.h @@ -110,7 +110,8 @@ public: /// /// @returns The current compass offsets. /// - const Vector3f &get_offsets() const; + const Vector3f &get_offsets(uint8_t i) const { return _offset[i]; } + const Vector3f &get_offsets(void) const { return get_offsets(0); } /// Sets the initial location used to get declination /// @@ -216,7 +217,7 @@ protected: Vector3f _field[COMPASS_MAX_INSTANCES]; ///< magnetic field strength AP_Int8 _orientation; - AP_Vector3f _offset; + AP_Vector3f _offset[COMPASS_MAX_INSTANCES]; AP_Float _declination; AP_Int8 _use_for_yaw; ///