From 482641e40313eb1a7e810021c72b0610d3b7882c Mon Sep 17 00:00:00 2001 From: Lorenz Meier Date: Mon, 13 Jul 2015 09:36:14 +0200 Subject: [PATCH 1/5] MAVLink: Crank onboard attitude rate up to 250 Hz --- src/modules/mavlink/mavlink_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/mavlink/mavlink_main.cpp b/src/modules/mavlink/mavlink_main.cpp index 1f43031be2..91c9ce7db3 100644 --- a/src/modules/mavlink/mavlink_main.cpp +++ b/src/modules/mavlink/mavlink_main.cpp @@ -1455,7 +1455,7 @@ Mavlink::task_main(int argc, char *argv[]) case MAVLINK_MODE_ONBOARD: configure_stream("SYS_STATUS", 1.0f); - configure_stream("ATTITUDE", 50.0f); + configure_stream("ATTITUDE", 250.0f); configure_stream("HIGHRES_IMU", 50.0f); configure_stream("GPS_RAW_INT", 5.0f); configure_stream("GLOBAL_POSITION_INT", 50.0f); From 253b8f50ce4df336df49b24df84430456ef7aa0a Mon Sep 17 00:00:00 2001 From: Lorenz Meier Date: Fri, 17 Jul 2015 20:35:07 +0200 Subject: [PATCH 2/5] Load missions correctly after restart. Fixes #2564 --- src/modules/navigator/mission.cpp | 65 ++++++++++++++++++++++--------- src/modules/navigator/mission.h | 8 +++- 2 files changed, 53 insertions(+), 20 deletions(-) diff --git a/src/modules/navigator/mission.cpp b/src/modules/navigator/mission.cpp index 4944ebe789..bedfc35d32 100644 --- a/src/modules/navigator/mission.cpp +++ b/src/modules/navigator/mission.cpp @@ -70,8 +70,8 @@ Mission::Mission(Navigator *navigator, const char *name) : _param_dist_1wp(this, "MIS_DIST_1WP", false), _param_altmode(this, "MIS_ALTMODE", false), _param_yawmode(this, "MIS_YAWMODE", false), - _onboard_mission({0}), - _offboard_mission({0}), + _onboard_mission{}, + _offboard_mission{}, _current_onboard_mission_index(-1), _current_offboard_mission_index(-1), _need_takeoff(true), @@ -110,32 +110,31 @@ Mission::on_inactive() update_offboard_mission(); } - /* check if the home position became valid in the meantime */ - if ((_mission_type == MISSION_TYPE_NONE || _mission_type == MISSION_TYPE_OFFBOARD) && - !_home_inited && _navigator->home_position_valid()) { + } else { - dm_item_t dm_current = DM_KEY_WAYPOINTS_OFFBOARD(_offboard_mission.dataman_id); + /* load missions from storage */ + mission_s mission_state; - _navigator->get_mission_result()->valid = _missionFeasiblityChecker.checkMissionFeasible(_navigator->get_mavlink_fd(), _navigator->get_vstatus()->is_rotary_wing, - dm_current, (size_t) _offboard_mission.count, _navigator->get_geofence(), - _navigator->get_home_position()->alt, _navigator->home_position_valid(), - _navigator->get_global_position()->lat, _navigator->get_global_position()->lon, - _param_dist_1wp.get(), _navigator->get_mission_result()->warning); + dm_lock(DM_KEY_MISSION_STATE); - _navigator->increment_mission_instance_count(); - _navigator->set_mission_result_updated(); + /* read current state */ + int read_res = dm_read(DM_KEY_MISSION_STATE, 0, &mission_state, sizeof(mission_s)); - _home_inited = true; + dm_unlock(DM_KEY_MISSION_STATE); + + if (read_res == sizeof(mission_s)) { + _offboard_mission.dataman_id = mission_state.dataman_id; + _offboard_mission.count = mission_state.count; + _current_offboard_mission_index = mission_state.current_seq; + + warnx("LOADED MISSION STATE FROM STORAGE"); } - } else { - /* read mission topics on initialization */ _inited = true; - - update_onboard_mission(); - update_offboard_mission(); } + check_mission_valid(); + /* require takeoff after non-loiter or landing */ if (!_navigator->get_can_loiter_at_sp() || _navigator->get_vstatus()->condition_landed) { _need_takeoff = true; @@ -151,6 +150,8 @@ Mission::on_activation() void Mission::on_active() { + check_mission_valid(); + /* check if anything has changed */ bool onboard_updated = false; orb_check(_navigator->get_onboard_mission_sub(), &onboard_updated); @@ -272,6 +273,8 @@ Mission::update_offboard_mission() _offboard_mission.count = 0; _offboard_mission.current_seq = 0; _current_offboard_mission_index = 0; + + warnx("mission check failed"); } set_current_offboard_mission_item(); @@ -652,6 +655,7 @@ Mission::read_mission_item(bool onboard, bool is_current, struct mission_item_s if (*mission_index_ptr < 0 || *mission_index_ptr >= (int)mission->count) { /* mission item index out of bounds */ + warnx("err: index: %d, max: %d", *mission_index_ptr, (int)mission->count); return false; } @@ -795,3 +799,26 @@ Mission::set_mission_finished() _navigator->get_mission_result()->finished = true; _navigator->set_mission_result_updated(); } + +bool +Mission::check_mission_valid() +{ + /* check if the home position became valid in the meantime */ + if (!_home_inited && _navigator->home_position_valid()) { + + dm_item_t dm_current = DM_KEY_WAYPOINTS_OFFBOARD(_offboard_mission.dataman_id); + + _navigator->get_mission_result()->valid = _missionFeasiblityChecker.checkMissionFeasible(_navigator->get_mavlink_fd(), _navigator->get_vstatus()->is_rotary_wing, + dm_current, (size_t) _offboard_mission.count, _navigator->get_geofence(), + _navigator->get_home_position()->alt, _navigator->home_position_valid(), + _navigator->get_global_position()->lat, _navigator->get_global_position()->lon, + _param_dist_1wp.get(), _navigator->get_mission_result()->warning); + + _navigator->increment_mission_instance_count(); + _navigator->set_mission_result_updated(); + + _home_inited = true; + } + + return _navigator->get_mission_result()->valid; +} diff --git a/src/modules/navigator/mission.h b/src/modules/navigator/mission.h index d77f461574..f367da1c7d 100644 --- a/src/modules/navigator/mission.h +++ b/src/modules/navigator/mission.h @@ -1,6 +1,6 @@ /**************************************************************************** * - * Copyright (c) 2013-2014 PX4 Development Team. All rights reserved. + * Copyright (c) 2013-2015 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 @@ -39,6 +39,7 @@ * @author Thomas Gubler * @author Anton Babushkin * @author Ban Siesta + * @author Lorenz Meier */ #ifndef NAVIGATOR_MISSION_H @@ -165,6 +166,11 @@ private: */ void set_mission_finished(); + /** + * Check wether a mission is ready to go + */ + bool check_mission_valid(); + control::BlockParamInt _param_onboard_enabled; control::BlockParamFloat _param_takeoff_alt; control::BlockParamFloat _param_dist_1wp; From d8a54f5018d3f282e8e083a637258ece64a69bd5 Mon Sep 17 00:00:00 2001 From: Lorenz Meier Date: Fri, 17 Jul 2015 20:59:39 +0200 Subject: [PATCH 3/5] Navigator: fix feedback on success / fail --- src/modules/navigator/mission.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/modules/navigator/mission.cpp b/src/modules/navigator/mission.cpp index bedfc35d32..b9e6e69439 100644 --- a/src/modules/navigator/mission.cpp +++ b/src/modules/navigator/mission.cpp @@ -126,8 +126,6 @@ Mission::on_inactive() _offboard_mission.dataman_id = mission_state.dataman_id; _offboard_mission.count = mission_state.count; _current_offboard_mission_index = mission_state.current_seq; - - warnx("LOADED MISSION STATE FROM STORAGE"); } _inited = true; @@ -655,7 +653,7 @@ Mission::read_mission_item(bool onboard, bool is_current, struct mission_item_s if (*mission_index_ptr < 0 || *mission_index_ptr >= (int)mission->count) { /* mission item index out of bounds */ - warnx("err: index: %d, max: %d", *mission_index_ptr, (int)mission->count); + mavlink_log_critical(_navigator->get_mavlink_fd(), "[wpm] err: index: %d, max: %d", *mission_index_ptr, (int)mission->count); return false; } From d9f0baf4dcde62a143d2a9b111a30cac14a1382a Mon Sep 17 00:00:00 2001 From: Lorenz Meier Date: Fri, 17 Jul 2015 21:19:32 +0200 Subject: [PATCH 4/5] GPS driver: Only let the driver publish reports if it really found a GPS receiver --- src/drivers/gps/gps.cpp | 48 ++++++++++++++++++++++++++++------------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/src/drivers/gps/gps.cpp b/src/drivers/gps/gps.cpp index 30fbdfd8d2..79719361a6 100644 --- a/src/drivers/gps/gps.cpp +++ b/src/drivers/gps/gps.cpp @@ -310,7 +310,7 @@ GPS::task_main() _report_gps_pos.cog_rad = 0.0f; _report_gps_pos.vel_ned_valid = true; - //no time and satellite information simulated + /* no time and satellite information simulated */ if (!(_pub_blocked)) { @@ -351,28 +351,46 @@ GPS::task_main() unlock(); + /* the Ashtech driver lies about successful configuration and the + * MTK driver is not well tested, so we really only trust the UBX + * driver for an advance publication + */ if (_Helper->configure(_baudrate) == 0) { unlock(); - //Publish initial report that we have access to a GPS - //Make sure to clear any stale data in case driver is reset + /* reset report */ memset(&_report_gps_pos, 0, sizeof(_report_gps_pos)); - _report_gps_pos.timestamp_position = hrt_absolute_time(); - _report_gps_pos.timestamp_variance = hrt_absolute_time(); - _report_gps_pos.timestamp_velocity = hrt_absolute_time(); - _report_gps_pos.timestamp_time = hrt_absolute_time(); - if (!(_pub_blocked)) { - if (_report_gps_pos_pub > 0) { - orb_publish(ORB_ID(vehicle_gps_position), _report_gps_pos_pub, &_report_gps_pos); + if (_mode == GPS_DRIVER_MODE_UBX) { + /* Publish initial report that we have access to a GPS, + * but set all critical state fields to indicate we have + * no valid position lock + */ - } else { - _report_gps_pos_pub = orb_advertise(ORB_ID(vehicle_gps_position), &_report_gps_pos); + _report_gps_pos.timestamp_time = hrt_absolute_time(); + + /* reset the timestamps for data, because we have no data yet */ + _report_gps_pos.timestamp_position = 0; + _report_gps_pos.timestamp_variance = 0; + _report_gps_pos.timestamp_velocity = 0; + + /* set a massive variance */ + _report_gps_pos.eph = 10000.0f; + _report_gps_pos.epv = 10000.0f; + _report_gps_pos.fix_type = 0; + + if (!(_pub_blocked)) { + if (_report_gps_pos_pub > 0) { + orb_publish(ORB_ID(vehicle_gps_position), _report_gps_pos_pub, &_report_gps_pos); + + } else { + _report_gps_pos_pub = orb_advertise(ORB_ID(vehicle_gps_position), &_report_gps_pos); + } } - } - // GPS is obviously detected successfully, reset statistics - _Helper->reset_update_rates(); + /* GPS is obviously detected successfully, reset statistics */ + _Helper->reset_update_rates(); + } int helper_ret; while ((helper_ret = _Helper->receive(TIMEOUT_5HZ)) > 0 && !_task_should_exit) { From ec21a71b369ff609fa74ccb5b71a4d275e9e5068 Mon Sep 17 00:00:00 2001 From: Lorenz Meier Date: Fri, 17 Jul 2015 23:41:00 +0200 Subject: [PATCH 5/5] Commander: increase mag cal timeout --- src/modules/commander/mag_calibration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/commander/mag_calibration.cpp b/src/modules/commander/mag_calibration.cpp index 36cc0cdd5d..7570b8b0f4 100644 --- a/src/modules/commander/mag_calibration.cpp +++ b/src/modules/commander/mag_calibration.cpp @@ -223,7 +223,7 @@ static calibrate_return mag_calibration_worker(detect_orientation_return orienta * for a good result, so we're not constraining the user more than we have to. */ - hrt_abstime detection_deadline = hrt_absolute_time() + worker_data->calibration_interval_perside_useconds; + hrt_abstime detection_deadline = hrt_absolute_time() + worker_data->calibration_interval_perside_useconds * 2; hrt_abstime last_gyro = 0; float gyro_x_integral = 0.0f; float gyro_y_integral = 0.0f;