forked from Archive/PX4-Autopilot
ported land detector
This commit is contained in:
parent
3defabfbea
commit
40cc11a5ed
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue