ported land detector

This commit is contained in:
tumbili 2015-06-26 15:01:17 +02:00
parent 3defabfbea
commit 40cc11a5ed
2 changed files with 25 additions and 18 deletions

View File

@ -87,12 +87,12 @@ bool FixedwingLandDetector::update()
if (hrt_elapsed_time(&_vehicleLocalPosition.timestamp) < 500 * 1000) { if (hrt_elapsed_time(&_vehicleLocalPosition.timestamp) < 500 * 1000) {
float val = 0.95f * _velocity_xy_filtered + 0.05f * sqrtf(_vehicleLocalPosition.vx * float val = 0.95f * _velocity_xy_filtered + 0.05f * sqrtf(_vehicleLocalPosition.vx *
_vehicleLocalPosition.vx + _vehicleLocalPosition.vy * _vehicleLocalPosition.vy); _vehicleLocalPosition.vx + _vehicleLocalPosition.vy * _vehicleLocalPosition.vy);
if (isfinite(val)) { if (PX4_ISFINITE(val)) {
_velocity_xy_filtered = val; _velocity_xy_filtered = val;
} }
val = 0.95f * _velocity_z_filtered + 0.05f * fabsf(_vehicleLocalPosition.vz); val = 0.95f * _velocity_z_filtered + 0.05f * fabsf(_vehicleLocalPosition.vz);
if (isfinite(val)) { if (PX4_ISFINITE(val)) {
_velocity_z_filtered = val; _velocity_z_filtered = val;
} }
} }

View File

@ -38,6 +38,10 @@
* @author Johan Jansen <jnsn.johan@gmail.com> * @author Johan Jansen <jnsn.johan@gmail.com>
*/ */
#include <px4_config.h>
#include <px4_defines.h>
#include <px4_tasks.h>
#include <px4_posix.h>
#include <unistd.h> //usleep #include <unistd.h> //usleep
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -80,7 +84,7 @@ static void land_detector_deamon_thread(int argc, char *argv[])
static void land_detector_stop() static void land_detector_stop()
{ {
if (land_detector_task == nullptr || _landDetectorTaskID == -1) { if (land_detector_task == nullptr || _landDetectorTaskID == -1) {
errx(1, "not running"); warnx("not running");
return; return;
} }
@ -95,7 +99,7 @@ static void land_detector_stop()
/* if we have given up, kill it */ /* if we have given up, kill it */
if (++i > 50) { if (++i > 50) {
task_delete(_landDetectorTaskID); px4_task_delete(_landDetectorTaskID);
break; break;
} }
} while (land_detector_task->isRunning()); } while (land_detector_task->isRunning());
@ -104,7 +108,7 @@ static void land_detector_stop()
delete land_detector_task; delete land_detector_task;
land_detector_task = nullptr; land_detector_task = nullptr;
_landDetectorTaskID = -1; _landDetectorTaskID = -1;
errx(0, "land_detector has been stopped"); warnx("land_detector has been stopped");
} }
/** /**
@ -113,7 +117,7 @@ static void land_detector_stop()
static int land_detector_start(const char *mode) static int land_detector_start(const char *mode)
{ {
if (land_detector_task != nullptr || _landDetectorTaskID != -1) { if (land_detector_task != nullptr || _landDetectorTaskID != -1) {
errx(1, "already running"); warnx("already running");
return -1; return -1;
} }
@ -125,13 +129,13 @@ static int land_detector_start(const char *mode)
land_detector_task = new MulticopterLandDetector(); land_detector_task = new MulticopterLandDetector();
} else { } else {
errx(1, "[mode] must be either 'fixedwing' or 'multicopter'"); warnx("[mode] must be either 'fixedwing' or 'multicopter'");
return -1; return -1;
} }
//Check if alloc worked //Check if alloc worked
if (land_detector_task == nullptr) { if (land_detector_task == nullptr) {
errx(1, "alloc failed"); warnx("alloc failed");
return -1; return -1;
} }
@ -140,11 +144,11 @@ static int land_detector_start(const char *mode)
SCHED_DEFAULT, SCHED_DEFAULT,
SCHED_PRIORITY_DEFAULT, SCHED_PRIORITY_DEFAULT,
1000, 1000,
(main_t)&land_detector_deamon_thread, (px4_main_t)&land_detector_deamon_thread,
nullptr); nullptr);
if (_landDetectorTaskID < 0) { if (_landDetectorTaskID < 0) {
errx(1, "task start failed: %d", -errno); warnx("task start failed: %d", -errno);
return -1; return -1;
} }
@ -163,9 +167,9 @@ static int land_detector_start(const char *mode)
usleep(50000); usleep(50000);
if (hrt_absolute_time() > timeout) { if (hrt_absolute_time() > timeout) {
err(1, "start failed - timeout"); warnx("start failed - timeout");
land_detector_stop(); land_detector_stop();
exit(1); return 1;
} }
} }
printf("\n"); printf("\n");
@ -174,7 +178,6 @@ static int land_detector_start(const char *mode)
//Remember current active mode //Remember current active mode
strncpy(_currentMode, mode, 12); strncpy(_currentMode, mode, 12);
exit(0);
return 0; return 0;
} }
@ -189,12 +192,15 @@ int land_detector_main(int argc, char *argv[])
} }
if (argc >= 2 && !strcmp(argv[1], "start")) { if (argc >= 2 && !strcmp(argv[1], "start")) {
land_detector_start(argv[2]); if (land_detector_start(argv[2]) != 0) {
warnx("land_detector start failed");
return 1;
}
} }
if (!strcmp(argv[1], "stop")) { if (!strcmp(argv[1], "stop")) {
land_detector_stop(); land_detector_stop();
exit(0); return 0;
} }
if (!strcmp(argv[1], "status")) { if (!strcmp(argv[1], "status")) {
@ -204,13 +210,14 @@ int land_detector_main(int argc, char *argv[])
warnx("running (%s): %s", _currentMode, (land_detector_task->isLanded()) ? "LANDED" : "IN AIR"); warnx("running (%s): %s", _currentMode, (land_detector_task->isLanded()) ? "LANDED" : "IN AIR");
} else { } else {
errx(1, "exists, but not running (%s)", _currentMode); warnx("exists, but not running (%s)", _currentMode);
} }
exit(0); return 0;
} else { } else {
errx(1, "not running"); warnx("not running");
return 1;
} }
} }