Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Move compass logging into library, remove scheduler wrapper functions #10900

Merged
merged 15 commits into from Apr 23, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion APMrover2/APMrover2.cpp
Expand Up @@ -85,7 +85,7 @@ const AP_Scheduler::Task Rover::scheduler_tasks[] = {
SCHED_TASK_CLASS(AP_Notify, &rover.notify, update, 50, 300),
SCHED_TASK(one_second_loop, 1, 1500),
SCHED_TASK_CLASS(AC_Sprayer, &rover.g2.sprayer, update, 3, 90),
SCHED_TASK(compass_cal_update, 50, 200),
SCHED_TASK_CLASS(Compass, &rover.compass, cal_update, 50, 200),
SCHED_TASK(compass_save, 0.1, 200),
SCHED_TASK(accel_cal_update, 10, 200),
#if LOGGING_ENABLED == ENABLED
Expand Down
1 change: 0 additions & 1 deletion APMrover2/Rover.h
Expand Up @@ -463,7 +463,6 @@ class Rover : public AP_HAL::HAL::Callbacks {
// sensors.cpp
void init_compass_location(void);
void update_compass(void);
void compass_cal_update(void);
void compass_save(void);
void init_beacon();
void init_visual_odom();
Expand Down
11 changes: 0 additions & 11 deletions APMrover2/sensors.cpp
Expand Up @@ -23,17 +23,6 @@ void Rover::update_compass(void)
{
if (AP::compass().enabled() && compass.read()) {
ahrs.set_compass(&compass);
// update offsets
if (should_log(MASK_LOG_COMPASS)) {
logger.Write_Compass();
}
}
}

// Calibrate compass
void Rover::compass_cal_update() {
if (!hal.util->get_soft_armed()) {
compass.compass_cal_update();
}
}

Expand Down
1 change: 1 addition & 0 deletions APMrover2/system.cpp
Expand Up @@ -90,6 +90,7 @@ void Rover::init_ardupilot()
#endif

// initialise compass
AP::compass().set_log_bit(MASK_LOG_COMPASS);
AP::compass().init();

// initialise rangefinder
Expand Down
2 changes: 1 addition & 1 deletion AntennaTracker/AntennaTracker.cpp
Expand Up @@ -49,7 +49,7 @@ const AP_Scheduler::Task Tracker::scheduler_tasks[] = {
SCHED_TASK_CLASS(AP_InertialSensor, &tracker.ins, periodic, 50, 50),
SCHED_TASK_CLASS(AP_Notify, &tracker.notify, update, 50, 100),
SCHED_TASK(one_second_loop, 1, 3900),
SCHED_TASK(compass_cal_update, 50, 100),
SCHED_TASK_CLASS(Compass, &tracker.compass, cal_update, 50, 100),
SCHED_TASK(accel_cal_update, 10, 100)
};

Expand Down
1 change: 0 additions & 1 deletion AntennaTracker/Tracker.h
Expand Up @@ -247,7 +247,6 @@ class Tracker : public AP_HAL::HAL::Callbacks {
void compass_save();
void init_compass_location();
void update_compass(void);
void compass_cal_update();
void accel_cal_update(void);
void update_GPS(void);
void handle_battery_failsafe(const char* type_str, const int8_t action);
Expand Down
12 changes: 0 additions & 12 deletions AntennaTracker/sensors.cpp
Expand Up @@ -30,18 +30,6 @@ void Tracker::update_compass(void)
{
if (AP::compass().enabled() && compass.read()) {
ahrs.set_compass(&compass);
if (should_log(MASK_LOG_COMPASS)) {
logger.Write_Compass();
}
}
}

/*
calibrate compass
*/
void Tracker::compass_cal_update() {
if (!hal.util->get_soft_armed()) {
compass.compass_cal_update();
}
}

Expand Down
1 change: 1 addition & 0 deletions AntennaTracker/system.cpp
Expand Up @@ -60,6 +60,7 @@ void Tracker::init_tracker()
#endif // ENABLE_SCRIPTING

// initialise compass
AP::compass().set_log_bit(MASK_LOG_COMPASS);
AP::compass().init();

// GPS Initialization
Expand Down
4 changes: 0 additions & 4 deletions ArduCopter/ArduCopter.cpp
Expand Up @@ -310,10 +310,6 @@ void Copter::update_batt_compass(void)
compass.set_throttle(motors->get_throttle());
compass.set_voltage(battery.voltage());
compass.read();
// log compass information
if (should_log(MASK_LOG_COMPASS) && !ahrs.have_ekf_logging()) {
logger.Write_Compass();
}
}
}

Expand Down
8 changes: 5 additions & 3 deletions ArduCopter/sensors.cpp
Expand Up @@ -107,12 +107,14 @@ void Copter::init_optflow()

void Copter::compass_cal_update()
{
static uint32_t compass_cal_stick_gesture_begin = 0;
compass.cal_update();

if (!hal.util->get_soft_armed()) {
compass.compass_cal_update();
if (hal.util->get_soft_armed()) {
return;
}

static uint32_t compass_cal_stick_gesture_begin = 0;

if (compass.is_calibrating()) {
if (channel_yaw->get_control_in() < -4000 && channel_throttle->get_control_in() > 900) {
compass.cancel_calibration_all();
Expand Down
1 change: 1 addition & 0 deletions ArduCopter/system.cpp
Expand Up @@ -137,6 +137,7 @@ void Copter::init_ardupilot()
gps.set_log_gps_bit(MASK_LOG_GPS);
gps.init(serial_manager);

AP::compass().set_log_bit(MASK_LOG_COMPASS);
AP::compass().init();

#if OPTFLOW == ENABLED
Expand Down
5 changes: 1 addition & 4 deletions ArduPlane/ArduPlane.cpp
Expand Up @@ -59,7 +59,7 @@ const AP_Scheduler::Task Plane::scheduler_tasks[] = {
SCHED_TASK_CLASS(AP_Notify, &plane.notify, update, 50, 300),
SCHED_TASK(read_rangefinder, 50, 100),
SCHED_TASK_CLASS(AP_ICEngine, &plane.g2.ice_control, update, 10, 100),
SCHED_TASK(compass_cal_update, 50, 50),
SCHED_TASK_CLASS(Compass, &plane.compass, cal_update, 50, 50),
SCHED_TASK(accel_cal_update, 10, 50),
#if OPTFLOW == ENABLED
SCHED_TASK_CLASS(OpticalFlow, &plane.optflow, update, 50, 50),
Expand Down Expand Up @@ -202,9 +202,6 @@ void Plane::update_compass(void)
{
if (AP::compass().enabled() && compass.read()) {
ahrs.set_compass(&compass);
if (should_log(MASK_LOG_COMPASS) && !ahrs.have_ekf_logging()) {
logger.Write_Compass();
}
}
}

Expand Down
1 change: 0 additions & 1 deletion ArduPlane/Plane.h
Expand Up @@ -966,7 +966,6 @@ class Plane : public AP_HAL::HAL::Callbacks {
#if ADVANCED_FAILSAFE == ENABLED
void afs_fs_check(void);
#endif
void compass_cal_update();
void update_optical_flow(void);
void one_second_loop(void);
void airspeed_ratio_update(void);
Expand Down
9 changes: 0 additions & 9 deletions ArduPlane/sensors.cpp
Expand Up @@ -38,15 +38,6 @@ void Plane::read_rangefinder(void)
rangefinder_height_update();
}

/*
calibrate compass
*/
void Plane::compass_cal_update() {
if (!hal.util->get_soft_armed()) {
compass.compass_cal_update();
}
}

/*
Accel calibration
*/
Expand Down
1 change: 1 addition & 0 deletions ArduPlane/system.cpp
Expand Up @@ -109,6 +109,7 @@ void Plane::init_ardupilot()
// initialise airspeed sensor
airspeed.init();

AP::compass().set_log_bit(MASK_LOG_COMPASS);
AP::compass().init();

#if OPTFLOW == ENABLED
Expand Down
6 changes: 1 addition & 5 deletions ArduSub/ArduSub.cpp
Expand Up @@ -55,7 +55,7 @@ const AP_Scheduler::Task Sub::scheduler_tasks[] = {
#if RPM_ENABLED == ENABLED
SCHED_TASK(rpm_update, 10, 200),
#endif
SCHED_TASK(compass_cal_update, 100, 100),
SCHED_TASK_CLASS(Compass, &sub.compass, cal_update, 100, 100),
SCHED_TASK(accel_cal_update, 10, 100),
SCHED_TASK(terrain_update, 10, 100),
#if GRIPPER_ENABLED == ENABLED
Expand Down Expand Up @@ -171,10 +171,6 @@ void Sub::update_batt_compass()
// update compass with throttle value - used for compassmot
compass.set_throttle(motors.get_throttle());
compass.read();
// log compass information
if (should_log(MASK_LOG_COMPASS) && !ahrs.have_ekf_logging()) {
logger.Write_Compass();
}
}
}

Expand Down
1 change: 0 additions & 1 deletion ArduSub/Sub.h
Expand Up @@ -455,7 +455,6 @@ class Sub : public AP_HAL::HAL::Callbacks {
static const struct LogStructure log_structure[];

void init_compass_location();
void compass_cal_update(void);
void fast_loop();
void fifty_hz_loop();
void update_batt_compass(void);
Expand Down
7 changes: 0 additions & 7 deletions ArduSub/sensors.cpp
Expand Up @@ -104,13 +104,6 @@ void Sub::init_optflow()
}
#endif // OPTFLOW == ENABLED

void Sub::compass_cal_update()
{
if (!hal.util->get_soft_armed()) {
compass.compass_cal_update();
}
}

void Sub::accel_cal_update()
{
if (hal.util->get_soft_armed()) {
Expand Down
1 change: 1 addition & 0 deletions ArduSub/system.cpp
Expand Up @@ -104,6 +104,7 @@ void Sub::init_ardupilot()
gps.set_log_gps_bit(MASK_LOG_GPS);
gps.init(serial_manager);

AP::compass().set_log_bit(MASK_LOG_COMPASS);
AP::compass().init();

#if OPTFLOW == ENABLED
Expand Down
74 changes: 74 additions & 0 deletions Tools/autotest/arducopter.py
Expand Up @@ -2846,6 +2846,76 @@ def fly_throw_mode(self):
(tdelta, max_good_tdelta))
self.progress("Vehicle returned")

def test_onboard_compass_calibration(self, timeout=240):
twist_x = 2.1
twist_y = 2.2
twist_z = 2.3
ex = None
self.context_push()
try:
self.set_parameter("SIM_GND_BEHAV", 0)
self.set_parameter("AHRS_EKF_TYPE", 10)
self.reboot_sitl()

report = self.mav.messages.get("MAG_CAL_REPORT", None)
if report is not None:
raise PreconditionFailedException("MAG_CAL_REPORT found")

self.run_cmd(mavutil.mavlink.MAV_CMD_DO_START_MAG_CAL,
1, # bitmask of compasses to calibrate
0,
0,
0,
0,
0,
0,
timeout=1)
tstart = self.get_sim_time()
last_twist_time = 0
while True:
now = self.get_sim_time_cached()
if now - tstart > timeout:
raise NotAchievedException("timeout before cal complete")
report = self.mav.messages.get("MAG_CAL_REPORT", None)
if report is not None:
print("Report: %s" % str(report))
break
if now - last_twist_time > 5:
last_twist_time = now
twist_x *= 1.1
twist_y *= 1.2
twist_z *= 1.3
if abs(twist_x) > 10:
twist_x /= -2
if abs(twist_y) > 10:
twist_y /= -2
if abs(twist_z) > 10:
twist_z /= -2
self.set_parameter("SIM_TWIST_X", twist_x)
self.set_parameter("SIM_TWIST_Y", twist_y)
self.set_parameter("SIM_TWIST_Z", twist_z)
try:
self.set_parameter("SIM_TWIST_TIME", 100)
except ValueError as e:
# the shove resets this to zero
pass

m = self.mav.recv_match(type="MAG_CAL_PROGRESS", timeout=1)
self.progress("progress: %s" % str(m))
if m is None:
continue
att = self.mav.messages.get("ATTITUDE", None)
self.progress("Attitude: %f %f %f" %
(math.degrees(att.roll), math.degrees(att.pitch), math.degrees(att.yaw)))
except Exception as e:
print("Exception caught: %s" % str(e))
ex = e

self.context_pop()
self.reboot_sitl()
if ex is not None:
raise ex

def fly_brake_mode(self):
# test brake mode
self.progress("Testing brake mode")
Expand Down Expand Up @@ -3237,6 +3307,10 @@ def tests(self):
"Fly POSHOLD takeoff",
self.fly_poshold_takeoff),

("OnboardCompassCalibration",
"Test onboard compass calibration",
self.test_onboard_compass_calibration),

("LogDownLoad",
"Log download",
lambda: self.log_download(
Expand Down
2 changes: 1 addition & 1 deletion Tools/autotest/common.py
Expand Up @@ -998,7 +998,7 @@ def should_fetch_all_for_parameter_change(param_name):
return True
return False

def set_parameter(self, name, value, add_to_context=True, epsilon=0.00001):
def set_parameter(self, name, value, add_to_context=True, epsilon=0.0002):
"""Set parameters from vehicle."""
self.progress("Setting %s to %f" % (name, value))
old_value = self.get_parameter(name, retry=2)
Expand Down
6 changes: 5 additions & 1 deletion libraries/AP_Compass/AP_Compass.cpp
Expand Up @@ -981,7 +981,11 @@ Compass::read(void)
if (_learn == LEARN_INFLIGHT && learn != nullptr) {
learn->update();
}
return healthy();
bool ret = healthy();
if (ret && _log_bit != (uint32_t)-1 && AP::logger().should_log(_log_bit) && !AP::ahrs().have_ekf_logging()) {
AP::logger().Write_Compass();
}
return ret;
}

uint8_t
Expand Down
8 changes: 7 additions & 1 deletion libraries/AP_Compass/AP_Compass.h
Expand Up @@ -123,7 +123,7 @@ friend class AP_Compass_Backend;
const Vector3f &get_field(void) const { return get_field(get_primary()); }

// compass calibrator interface
void compass_cal_update();
void cal_update();

// per-motor calibration access
void per_motor_calibration_start(void) {
Expand All @@ -143,6 +143,9 @@ friend class AP_Compass_Backend;
bool compass_cal_requires_reboot() const { return _cal_complete_requires_reboot; }
bool is_calibrating() const;

// indicate which bit in LOG_BITMASK indicates we should log compass readings
void set_log_bit(uint32_t log_bit) { _log_bit = log_bit; }
peterbarker marked this conversation as resolved.
Show resolved Hide resolved

/*
handle an incoming MAG_CAL command
*/
Expand Down Expand Up @@ -404,6 +407,9 @@ friend class AP_Compass_Backend;
// first-time-around flag used by offset nulling
bool _null_init_done;

// stores which bit is used to indicate we should log compass readings
uint32_t _log_bit = -1;

// used by offset correction
static const uint8_t _mag_history_size = 20;

Expand Down
6 changes: 5 additions & 1 deletion libraries/AP_Compass/AP_Compass_Calibration.cpp
Expand Up @@ -7,8 +7,12 @@
extern AP_HAL::HAL& hal;

void
Compass::compass_cal_update()
Compass::cal_update()
{
if (hal.util->get_soft_armed()) {
return;
}

bool running = false;

for (uint8_t i=0; i<COMPASS_MAX_INSTANCES; i++) {
Expand Down