Navigator: cleanup and getting rid of unnecessary subscriptions

This commit is contained in:
Julian Oes
2013-11-19 10:05:38 +01:00
parent bc583838b7
commit b33634bae4
+27 -101
View File
@@ -1,7 +1,7 @@
/**************************************************************************** /****************************************************************************
* *
* Copyright (c) 2013 PX4 Development Team. All rights reserved. * Copyright (c) 2013 PX4 Development Team. All rights reserved.
* Author: Lorenz Meier * Authors: Lorenz Meier
* Jean Cyr * Jean Cyr
* Julian Oes * Julian Oes
* *
@@ -55,14 +55,8 @@
#include <drivers/drv_hrt.h> #include <drivers/drv_hrt.h>
#include <arch/board/board.h> #include <arch/board/board.h>
#include <uORB/uORB.h> #include <uORB/uORB.h>
#include <uORB/topics/airspeed.h>
#include <uORB/topics/vehicle_global_position.h> #include <uORB/topics/vehicle_global_position.h>
#include <uORB/topics/vehicle_global_position_set_triplet.h> #include <uORB/topics/vehicle_global_position_set_triplet.h>
#include <uORB/topics/vehicle_attitude_setpoint.h>
#include <uORB/topics/manual_control_setpoint.h>
#include <uORB/topics/actuator_controls.h>
#include <uORB/topics/vehicle_rates_setpoint.h>
#include <uORB/topics/vehicle_attitude.h>
#include <uORB/topics/vehicle_status.h> #include <uORB/topics/vehicle_status.h>
#include <uORB/topics/parameter_update.h> #include <uORB/topics/parameter_update.h>
#include <uORB/topics/mission.h> #include <uORB/topics/mission.h>
@@ -75,6 +69,7 @@
#include <mathlib/mathlib.h> #include <mathlib/mathlib.h>
#include <dataman/dataman.h> #include <dataman/dataman.h>
/** /**
* navigator app start / stop handling function * navigator app start / stop handling function
* *
@@ -120,26 +115,17 @@ public:
private: private:
bool _task_should_exit; /**< if true, sensor task should exit */ bool _task_should_exit; /**< if true, sensor task should exit */
int _navigator_task; /**< task handle for sensor task */ int _navigator_task; /**< task handle for sensor task */
int _global_pos_sub; int _global_pos_sub;
int _att_sub; /**< vehicle attitude subscription */
int _attitude_sub; /**< raw rc channels data subscription */
int _airspeed_sub; /**< airspeed subscription */
int _vstatus_sub; /**< vehicle status subscription */ int _vstatus_sub; /**< vehicle status subscription */
int _params_sub; /**< notification of parameter updates */ int _params_sub; /**< notification of parameter updates */
int _manual_control_sub; /**< notification of manual control updates */ int _mission_sub; /**< notification of mission updates */
int _mission_sub; int _capabilities_sub; /**< notification of vehicle capabilities updates */
int _capabilities_sub;
int _fence_sub;
int _fence_pub;
orb_advert_t _triplet_pub; /**< position setpoint */ orb_advert_t _triplet_pub; /**< publish position setpoint triplet */
orb_advert_t _fence_pub; /**< publish fence topic */
struct vehicle_attitude_s _att; /**< vehicle attitude */
struct vehicle_attitude_setpoint_s _att_sp; /**< vehicle attitude setpoint */
struct manual_control_setpoint_s _manual; /**< r/c channel data */
struct airspeed_s _airspeed; /**< airspeed */
struct vehicle_status_s _vstatus; /**< vehicle status */ struct vehicle_status_s _vstatus; /**< vehicle status */
struct vehicle_global_position_s _global_pos; /**< global vehicle position */ struct vehicle_global_position_s _global_pos; /**< global vehicle position */
struct vehicle_global_position_set_triplet_s _global_triplet; /**< triplet of global setpoints */ struct vehicle_global_position_set_triplet_s _global_triplet; /**< triplet of global setpoints */
@@ -215,10 +201,6 @@ private:
*/ */
float control_pitch(float altitude_error); float control_pitch(float altitude_error);
void calculate_airspeed_errors();
void calculate_gndspeed_undershoot();
void calculate_altitude_error();
/** /**
* Shim for calling task_main from task_create. * Shim for calling task_main from task_create.
*/ */
@@ -231,8 +213,6 @@ private:
void publish_fence(unsigned vertices); void publish_fence(unsigned vertices);
void publish_mission(unsigned points);
void publish_safepoints(unsigned points); void publish_safepoints(unsigned points);
bool fence_valid(const struct fence_s &fence); bool fence_valid(const struct fence_s &fence);
@@ -257,27 +237,23 @@ Navigator::Navigator() :
/* subscriptions */ /* subscriptions */
_global_pos_sub(-1), _global_pos_sub(-1),
_att_sub(-1),
_airspeed_sub(-1),
_vstatus_sub(-1), _vstatus_sub(-1),
_params_sub(-1), _params_sub(-1),
_manual_control_sub(-1),
_fence_sub(-1),
_fence_pub(-1),
_mission_sub(-1), _mission_sub(-1),
_capabilities_sub(-1), _capabilities_sub(-1),
/* publications */ /* publications */
_triplet_pub(-1), _triplet_pub(-1),
_fence_pub(-1),
/* performance counters */ /* performance counters */
_loop_perf(perf_alloc(PC_ELAPSED, "navigator")), _loop_perf(perf_alloc(PC_ELAPSED, "navigator")),
/* states */ /* states */
_mission_items_maxcount(20), _mission_items_maxcount(20),
_mission_valid(false), _mission_valid(false),
_loiter_hold(false),
_fence_valid(false), _fence_valid(false),
_inside_fence(true) _inside_fence(true),
_loiter_hold(false)
{ {
_global_pos.valid = false; _global_pos.valid = false;
memset(&_fence, 0, sizeof(_fence)); memset(&_fence, 0, sizeof(_fence));
@@ -321,40 +297,6 @@ Navigator::parameters_update()
return OK; return OK;
} }
void
Navigator::vehicle_status_poll()
{
bool vstatus_updated;
/* Check HIL state if vehicle status has changed */
orb_check(_vstatus_sub, &vstatus_updated);
if (vstatus_updated)
orb_copy(ORB_ID(vehicle_status), _vstatus_sub, &_vstatus);
}
void
Navigator::vehicle_attitude_poll()
{
/* check if there is a new position */
bool att_updated;
orb_check(_att_sub, &att_updated);
if (att_updated)
orb_copy(ORB_ID(vehicle_attitude), _att_sub, &_att);
}
void
Navigator::mission_poll()
{
/* check if there is a new setpoint */
bool mission_updated;
orb_check(_mission_sub, &mission_updated);
if (mission_updated)
mission_update();
}
void void
Navigator::mission_update() Navigator::mission_update()
{ {
@@ -399,19 +341,14 @@ Navigator::task_main()
_global_pos_sub = orb_subscribe(ORB_ID(vehicle_global_position)); _global_pos_sub = orb_subscribe(ORB_ID(vehicle_global_position));
_mission_sub = orb_subscribe(ORB_ID(mission)); _mission_sub = orb_subscribe(ORB_ID(mission));
_capabilities_sub = orb_subscribe(ORB_ID(navigation_capabilities)); _capabilities_sub = orb_subscribe(ORB_ID(navigation_capabilities));
_fence_sub = orb_subscribe(ORB_ID(fence));
_att_sub = orb_subscribe(ORB_ID(vehicle_attitude));
_airspeed_sub = orb_subscribe(ORB_ID(airspeed));
_vstatus_sub = orb_subscribe(ORB_ID(vehicle_status)); _vstatus_sub = orb_subscribe(ORB_ID(vehicle_status));
_params_sub = orb_subscribe(ORB_ID(parameter_update)); _params_sub = orb_subscribe(ORB_ID(parameter_update));
_manual_control_sub = orb_subscribe(ORB_ID(manual_control_setpoint));
// Load initial states // Load initial states
if (orb_copy(ORB_ID(vehicle_status), _vstatus_sub, &_vstatus) != OK) { if (orb_copy(ORB_ID(vehicle_status), _vstatus_sub, &_vstatus) != OK) {
_vstatus.arming_state = ARMING_STATE_STANDBY; // for testing... commander may not be running _vstatus.arming_state = ARMING_STATE_STANDBY; // for testing... commander may not be running
} }
orb_copy(ORB_ID(vehicle_attitude), _att_sub, &_att);
mission_update(); mission_update();
/* rate limit vehicle status updates to 5Hz */ /* rate limit vehicle status updates to 5Hz */
@@ -434,11 +371,11 @@ Navigator::task_main()
fds[0].events = POLLIN; fds[0].events = POLLIN;
fds[1].fd = _global_pos_sub; fds[1].fd = _global_pos_sub;
fds[1].events = POLLIN; fds[1].events = POLLIN;
fds[2].fd = _fence_sub; fds[2].fd = _capabilities_sub;
fds[2].events = POLLIN; fds[2].events = POLLIN;
fds[3].fd = _capabilities_sub; fds[3].fd = _mission_sub;
fds[3].events = POLLIN; fds[3].events = POLLIN;
fds[4].fd = _mission_sub; fds[4].fd = _vstatus_sub;
fds[4].events = POLLIN; fds[4].events = POLLIN;
while (!_task_should_exit) { while (!_task_should_exit) {
@@ -459,10 +396,13 @@ Navigator::task_main()
perf_begin(_loop_perf); perf_begin(_loop_perf);
/* check vehicle status for changes to publication state */
vehicle_status_poll();
/* only update parameters if they changed */ /* only update parameters if they changed */
if (fds[4].revents & POLLIN) {
/* read from param to clear updated flag */
orb_copy(ORB_ID(vehicle_status), _vstatus_sub, &_vstatus);
}
/* only update vehicle status if it changed */
if (fds[0].revents & POLLIN) { if (fds[0].revents & POLLIN) {
/* read from param to clear updated flag */ /* read from param to clear updated flag */
struct parameter_update_s update; struct parameter_update_s update;
@@ -472,26 +412,21 @@ Navigator::task_main()
parameters_update(); parameters_update();
} }
/* only update fence if it has changed */
if (fds[2].revents & POLLIN) {
/* read from fence to clear updated flag */
unsigned vertices;
orb_copy(ORB_ID(fence), _fence_sub, &vertices);
_fence_valid = load_fence(vertices);
}
/* only update craft capabilities if they have changed */ /* only update craft capabilities if they have changed */
if (fds[3].revents & POLLIN) { if (fds[2].revents & POLLIN) {
orb_copy(ORB_ID(navigation_capabilities), _capabilities_sub, &_nav_caps); orb_copy(ORB_ID(navigation_capabilities), _capabilities_sub, &_nav_caps);
} }
if (fds[4].revents & POLLIN) { if (fds[3].revents & POLLIN) {
mission_update(); mission_update();
} }
/* only run controller if position changed */ /* only run controller if position changed */
if (fds[1].revents & POLLIN) { if (fds[1].revents & POLLIN) {
/* load local copies */
orb_copy(ORB_ID(vehicle_global_position), _global_pos_sub, &_global_pos);
static uint64_t last_run = 0; static uint64_t last_run = 0;
float deltaT = (hrt_absolute_time() - last_run) / 1000000.0f; float deltaT = (hrt_absolute_time() - last_run) / 1000000.0f;
last_run = hrt_absolute_time(); last_run = hrt_absolute_time();
@@ -501,13 +436,6 @@ Navigator::task_main()
deltaT = 0.01f; deltaT = 0.01f;
} }
/* load local copies */
orb_copy(ORB_ID(vehicle_global_position), _global_pos_sub, &_global_pos);
vehicle_attitude_poll();
mission_poll();
if (_fence_valid && _global_pos.valid) { if (_fence_valid && _global_pos.valid) {
_inside_fence = inside_geofence(&_global_pos, &_fence); _inside_fence = inside_geofence(&_global_pos, &_fence);
} }
@@ -600,9 +528,9 @@ Navigator::task_main()
} else if (_global_triplet.current.nav_cmd == NAV_CMD_TAKEOFF) { } else if (_global_triplet.current.nav_cmd == NAV_CMD_TAKEOFF) {
/* apply minimum pitch if altitude has not yet been reached */ /* apply minimum pitch if altitude has not yet been reached */
if (_global_pos.alt < _global_triplet.current.altitude) { // if (_global_pos.alt < _global_triplet.current.altitude) {
_att_sp.pitch_body = math::max(_att_sp.pitch_body, _global_triplet.current.param1); // _att_sp.pitch_body = math::max(_att_sp.pitch_body, _global_triplet.current.param1);
} // }
} }
/* lazily publish the setpoint only once available */ /* lazily publish the setpoint only once available */
@@ -681,8 +609,6 @@ Navigator::publish_fence(unsigned vertices)
bool bool
Navigator::fence_valid(const struct fence_s &fence) Navigator::fence_valid(const struct fence_s &fence)
{ {
struct vehicle_global_position_s pos;
// NULL fence is valid // NULL fence is valid
if (fence.count == 0) { if (fence.count == 0) {
return true; return true;