mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-05-22 19:17:36 +08:00
position_estimator_inav - first working version
This commit is contained in:
@@ -42,7 +42,6 @@ STACKSIZE = 4096
|
||||
CSRCS = position_estimator_inav_main.c \
|
||||
position_estimator_inav_params.c \
|
||||
kalman_filter_inertial.c \
|
||||
acceleration_transform.c \
|
||||
sounds.c
|
||||
acceleration_transform.c
|
||||
|
||||
include $(APPDIR)/mk/app.mk
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* acceleration_transform.c
|
||||
*
|
||||
* Created on: 30.03.2013
|
||||
* Author: Anton Babushkin
|
||||
* Copyright (C) 2013 Anton Babushkin. All rights reserved.
|
||||
* Author: Anton Babushkin <rk3dov@gmail.com>
|
||||
*
|
||||
* Transform acceleration vector to true orientation and scale
|
||||
*
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* acceleration_transform.h
|
||||
*
|
||||
* Created on: 30.03.2013
|
||||
* Author: ton
|
||||
* Copyright (C) 2013 Anton Babushkin. All rights reserved.
|
||||
* Author: Anton Babushkin <rk3dov@gmail.com>
|
||||
*/
|
||||
|
||||
#ifndef ACCELERATION_TRANSFORM_H_
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
/*
|
||||
* kalman_filter_inertial.c
|
||||
*
|
||||
* Copyright (C) 2013 Anton Babushkin. All rights reserved.
|
||||
* Author: Anton Babushkin <rk3dov@gmail.com>
|
||||
*/
|
||||
|
||||
#include "kalman_filter_inertial.h"
|
||||
|
||||
void kalman_filter_inertial_predict(float dt, float x[3]) {
|
||||
@@ -7,10 +14,9 @@ void kalman_filter_inertial_predict(float dt, float x[3]) {
|
||||
|
||||
void kalman_filter_inertial_update(float x[3], float z[2], float k[3][2], bool use[2]) {
|
||||
float y[2];
|
||||
// y = z - x
|
||||
for (int i = 0; i < 2; i++) {
|
||||
y[i] = z[i] - x[i];
|
||||
}
|
||||
// y = z - H x
|
||||
y[0] = z[0] - x[0];
|
||||
y[1] = z[1] - x[2];
|
||||
// x = x + K * y
|
||||
for (int i = 0; i < 3; i++) { // Row
|
||||
for (int j = 0; j < 2; j++) { // Column
|
||||
|
||||
@@ -1,3 +1,10 @@
|
||||
/*
|
||||
* kalman_filter_inertial.h
|
||||
*
|
||||
* Copyright (C) 2013 Anton Babushkin. All rights reserved.
|
||||
* Author: Anton Babushkin <rk3dov@gmail.com>
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
void kalman_filter_inertial_predict(float dt, float x[3]);
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
/****************************************************************************
|
||||
*
|
||||
* Copyright (C) 2008-2012 PX4 Development Team. All rights reserved.
|
||||
* Author: Damian Aregger <daregger@student.ethz.ch>
|
||||
* Tobias Naegeli <naegelit@student.ethz.ch>
|
||||
* Lorenz Meier <lm@inf.ethz.ch>
|
||||
* Copyright (C) 2013 Anton Babushkin. All rights reserved.
|
||||
* Author: Anton Babushkin <rk3dov@gmail.com>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -67,15 +65,13 @@
|
||||
#include <drivers/drv_hrt.h>
|
||||
|
||||
#include "position_estimator_inav_params.h"
|
||||
//#include <uORB/topics/debug_key_value.h>
|
||||
#include "sounds.h"
|
||||
#include <drivers/drv_tone_alarm.h>
|
||||
#include "kalman_filter_inertial.h"
|
||||
#include "acceleration_transform.h"
|
||||
|
||||
static bool thread_should_exit = false; /**< Deamon exit flag */
|
||||
static bool thread_running = false; /**< Deamon status flag */
|
||||
static int position_estimator_inav_task; /**< Handle of deamon task / thread */
|
||||
static bool verbose_mode = false;
|
||||
|
||||
__EXPORT int position_estimator_inav_main(int argc, char *argv[]);
|
||||
|
||||
@@ -89,7 +85,7 @@ static void usage(const char *reason) {
|
||||
if (reason)
|
||||
fprintf(stderr, "%s\n", reason);
|
||||
fprintf(stderr,
|
||||
"usage: position_estimator_inav {start|stop|status} [-p <additional params>]\n\n");
|
||||
"usage: position_estimator_inav {start|stop|status} [-v]\n\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -106,12 +102,14 @@ int position_estimator_inav_main(int argc, char *argv[]) {
|
||||
usage("missing command");
|
||||
|
||||
if (!strcmp(argv[1], "start")) {
|
||||
|
||||
if (thread_running) {
|
||||
printf("position_estimator_inav already running\n");
|
||||
/* this is not an error */
|
||||
exit(0);
|
||||
}
|
||||
if (argc > 1)
|
||||
if (!strcmp(argv[2], "-v"))
|
||||
verbose_mode = true;
|
||||
|
||||
thread_should_exit = false;
|
||||
position_estimator_inav_task = task_spawn("position_estimator_inav",
|
||||
@@ -148,17 +146,6 @@ int position_estimator_inav_thread_main(int argc, char *argv[]) {
|
||||
mavlink_fd = open(MAVLINK_LOG_DEVICE, 0);
|
||||
mavlink_log_info(mavlink_fd, "[position_estimator_inav] started");
|
||||
|
||||
/* kalman filter K for simulation parameters:
|
||||
* rate_accel = 200 Hz
|
||||
* rate_baro = 100 Hz
|
||||
* err_accel = 1.0 m/s^2
|
||||
* err_baro = 0.2 m
|
||||
*/
|
||||
static float k[3][2] = {
|
||||
{ 0.0262f, 0.00001f },
|
||||
{ 0.0349f, 0.00191f },
|
||||
{ 0.000259f, 0.618f }
|
||||
};
|
||||
/* initialize values */
|
||||
static float x_est[3] = { 0.0f, 0.0f, 0.0f };
|
||||
static float y_est[3] = { 0.0f, 0.0f, 0.0f };
|
||||
@@ -213,14 +200,6 @@ int position_estimator_inav_thread_main(int argc, char *argv[]) {
|
||||
parameters_update(&pos_inav_param_handles, &pos_inav_params);
|
||||
/* END FIRST PARAMETER UPDATE */
|
||||
|
||||
// TODO implement calibration procedure, now put dummy values
|
||||
int16_t accel_offs[3] = { 0, 0, 0 };
|
||||
float accel_T[3][3] = {
|
||||
{ 1.0f, 0.0f, 0.0f },
|
||||
{ 0.0f, 1.0f, 0.0f },
|
||||
{ 0.0f, 0.0f, 1.0f }
|
||||
};
|
||||
|
||||
/* wait until gps signal turns valid, only then can we initialize the projection */
|
||||
if (use_gps) {
|
||||
struct pollfd fds_init[1] = { { .fd = vehicle_gps_position_sub,
|
||||
@@ -270,11 +249,11 @@ int position_estimator_inav_thread_main(int argc, char *argv[]) {
|
||||
uint16_t baro_updates = 0;
|
||||
hrt_abstime updates_counter_start = hrt_absolute_time();
|
||||
uint32_t updates_counter_len = 1000000;
|
||||
hrt_abstime pub_last = 0;
|
||||
hrt_abstime pub_last = hrt_absolute_time();
|
||||
uint32_t pub_interval = 5000; // limit publish rate to 200 Hz
|
||||
|
||||
/* main loop */
|
||||
struct pollfd fds[3] = {
|
||||
struct pollfd fds[5] = {
|
||||
{ .fd = parameter_update_sub, .events = POLLIN },
|
||||
{ .fd = vehicle_status_sub, .events = POLLIN },
|
||||
{ .fd = vehicle_attitude_sub, .events = POLLIN },
|
||||
@@ -288,7 +267,8 @@ int position_estimator_inav_thread_main(int argc, char *argv[]) {
|
||||
int ret = poll(fds, 5, 10); // wait maximal this 10 ms = 100 Hz minimum rate
|
||||
if (ret < 0) {
|
||||
/* poll error */
|
||||
printf("[position_estimator_inav] subscriptions poll error\n", ret);
|
||||
if (verbose_mode)
|
||||
printf("[position_estimator_inav] subscriptions poll error\n");
|
||||
} else if (ret > 0) {
|
||||
/* parameter update */
|
||||
if (fds[0].revents & POLLIN) {
|
||||
@@ -359,7 +339,7 @@ int position_estimator_inav_thread_main(int argc, char *argv[]) {
|
||||
last_time = t;
|
||||
/* calculate corrected acceleration vector in UAV frame */
|
||||
float accel_corr[3];
|
||||
acceleration_correct(accel_corr, sensor.accelerometer_raw, accel_T, accel_offs);
|
||||
acceleration_correct(accel_corr, sensor.accelerometer_raw, pos_inav_params.acc_T, pos_inav_params.acc_offs);
|
||||
/* transform acceleration vector from UAV frame to NED frame */
|
||||
float accel_NED[3];
|
||||
for (int i = 0; i < 3; i++) {
|
||||
@@ -384,34 +364,24 @@ int position_estimator_inav_thread_main(int argc, char *argv[]) {
|
||||
}
|
||||
if (use_z[0] || use_z[1]) {
|
||||
/* correction */
|
||||
kalman_filter_inertial_update(z_est, z_meas, k, use_z);
|
||||
kalman_filter_inertial_update(z_est, z_meas, pos_inav_params.k, use_z);
|
||||
}
|
||||
if (t - updates_counter_start > updates_counter_len) {
|
||||
float updates_dt = (t - updates_counter_start) * 0.000001f;
|
||||
printf("[position_estimator_inav] accelerometer_updates_rate = %.1/s, baro_updates_rate = %.1f/s\n", accelerometer_updates / updates_dt, baro_updates / updates_dt);
|
||||
updates_counter_start = t;
|
||||
if (verbose_mode) {
|
||||
/* print updates rate */
|
||||
if (t - updates_counter_start > updates_counter_len) {
|
||||
float updates_dt = (t - updates_counter_start) * 0.000001f;
|
||||
printf("[position_estimator_inav] accelerometer_updates_rate = %.1/s, baro_updates_rate = %.1f/s\n", accelerometer_updates / updates_dt, baro_updates / updates_dt);
|
||||
updates_counter_start = t;
|
||||
accelerometer_updates = 0;
|
||||
baro_updates = 0;
|
||||
}
|
||||
}
|
||||
if (printatt_counter == 100) {
|
||||
printatt_counter = 0;
|
||||
printf("[position_estimator_inav] dt = %.6f\n", dt);
|
||||
printf("[position_estimator_inav] pitch = %.3f, roll = %.3f, yaw = %.3f\n",
|
||||
att.pitch, att.roll, att.yaw);
|
||||
printf("[position_estimator_inav] accel_UAV = %.3f, %.3f, %.3f\n",
|
||||
sensor.accelerometer_m_s2[0],
|
||||
sensor.accelerometer_m_s2[1],
|
||||
sensor.accelerometer_m_s2[2]);
|
||||
printf("[position_estimator_inav] accel_NED = %.3f, %.3f, %.3f\n",
|
||||
accel_NED[0], accel_NED[1], accel_NED[2]);
|
||||
printf("[position_estimator_inav] z = %.2f, vz = %.2f, az = %.2f\n",
|
||||
z_est[0], z_est[1], z_est[2]);
|
||||
}
|
||||
printatt_counter++;
|
||||
if (t - pub_last > pub_interval) {
|
||||
pub_last = t;
|
||||
local_pos_est.x = 0.0;
|
||||
local_pos_est.vx = 0.0;
|
||||
local_pos_est.y = 0.0;
|
||||
local_pos_est.vy = 0.0;
|
||||
local_pos_est.x = 0.0f;
|
||||
local_pos_est.vx = 0.0f;
|
||||
local_pos_est.y = 0.0f;
|
||||
local_pos_est.vy = 0.0f;
|
||||
local_pos_est.z = z_est[0];
|
||||
local_pos_est.vz = z_est[1];
|
||||
local_pos_est.timestamp = hrt_absolute_time();
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
/****************************************************************************
|
||||
*
|
||||
* Copyright (C) 2012 PX4 Development Team. All rights reserved.
|
||||
* Author: Damian Aregger <daregger@student.ethz.ch>
|
||||
* Tobias Naegeli <naegelit@student.ethz.ch>
|
||||
* Lorenz Meier <lm@inf.ethz.ch>
|
||||
* Copyright (C) 2013 Anton Babushkin. All rights reserved.
|
||||
* Author: Anton Babushkin <rk3dov@gmail.com>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -44,16 +42,73 @@
|
||||
|
||||
/* Kalman Filter covariances */
|
||||
/* gps measurement noise standard deviation */
|
||||
PARAM_DEFINE_FLOAT(POS_EST_R, 1.0f);
|
||||
PARAM_DEFINE_FLOAT(INAV_K_ALT_00, 0.0f);
|
||||
PARAM_DEFINE_FLOAT(INAV_K_ALT_01, 0.0f);
|
||||
PARAM_DEFINE_FLOAT(INAV_K_ALT_10, 0.0f);
|
||||
PARAM_DEFINE_FLOAT(INAV_K_ALT_11, 0.0f);
|
||||
PARAM_DEFINE_FLOAT(INAV_K_ALT_20, 0.0f);
|
||||
PARAM_DEFINE_FLOAT(INAV_K_ALT_21, 0.0f);
|
||||
|
||||
PARAM_DEFINE_INT32(INAV_ACC_OFFS_0, 0);
|
||||
PARAM_DEFINE_INT32(INAV_ACC_OFFS_1, 0);
|
||||
PARAM_DEFINE_INT32(INAV_ACC_OFFS_2, 0);
|
||||
|
||||
PARAM_DEFINE_FLOAT(INAV_ACC_T_00, 0.0021f);
|
||||
PARAM_DEFINE_FLOAT(INAV_ACC_T_01, 0.0f);
|
||||
PARAM_DEFINE_FLOAT(INAV_ACC_T_02, 0.0f);
|
||||
PARAM_DEFINE_FLOAT(INAV_ACC_T_10, 0.0f);
|
||||
PARAM_DEFINE_FLOAT(INAV_ACC_T_11, 0.0021f);
|
||||
PARAM_DEFINE_FLOAT(INAV_ACC_T_12, 0.0f);
|
||||
PARAM_DEFINE_FLOAT(INAV_ACC_T_20, 0.0f);
|
||||
PARAM_DEFINE_FLOAT(INAV_ACC_T_21, 0.0f);
|
||||
PARAM_DEFINE_FLOAT(INAV_ACC_T_22, 0.0021f);
|
||||
|
||||
int parameters_init(struct position_estimator_inav_param_handles *h)
|
||||
{
|
||||
h->r = param_find("POS_EST_R");
|
||||
h->k_alt_00 = param_find("INAV_K_ALT_00");
|
||||
h->k_alt_01 = param_find("INAV_K_ALT_01");
|
||||
h->k_alt_10 = param_find("INAV_K_ALT_10");
|
||||
h->k_alt_11 = param_find("INAV_K_ALT_11");
|
||||
h->k_alt_20 = param_find("INAV_K_ALT_20");
|
||||
h->k_alt_21 = param_find("INAV_K_ALT_21");
|
||||
|
||||
h->acc_offs_0 = param_find("INAV_ACC_OFFS_0");
|
||||
h->acc_offs_1 = param_find("INAV_ACC_OFFS_1");
|
||||
h->acc_offs_2 = param_find("INAV_ACC_OFFS_2");
|
||||
|
||||
h->acc_t_00 = param_find("INAV_ACC_T_00");
|
||||
h->acc_t_01 = param_find("INAV_ACC_T_01");
|
||||
h->acc_t_02 = param_find("INAV_ACC_T_02");
|
||||
h->acc_t_10 = param_find("INAV_ACC_T_10");
|
||||
h->acc_t_11 = param_find("INAV_ACC_T_11");
|
||||
h->acc_t_12 = param_find("INAV_ACC_T_12");
|
||||
h->acc_t_20 = param_find("INAV_ACC_T_20");
|
||||
h->acc_t_21 = param_find("INAV_ACC_T_21");
|
||||
h->acc_t_22 = param_find("INAV_ACC_T_22");
|
||||
return OK;
|
||||
}
|
||||
|
||||
int parameters_update(const struct position_estimator_inav_param_handles *h, struct position_estimator_inav_params *p)
|
||||
{
|
||||
param_get(h->r, &(p->r));
|
||||
param_get(h->k_alt_00, &(p->k[0][0]));
|
||||
param_get(h->k_alt_01, &(p->k[0][1]));
|
||||
param_get(h->k_alt_10, &(p->k[1][0]));
|
||||
param_get(h->k_alt_11, &(p->k[1][1]));
|
||||
param_get(h->k_alt_20, &(p->k[2][0]));
|
||||
param_get(h->k_alt_21, &(p->k[2][1]));
|
||||
|
||||
param_get(h->acc_offs_0, &(p->acc_offs[0]));
|
||||
param_get(h->acc_offs_1, &(p->acc_offs[1]));
|
||||
param_get(h->acc_offs_2, &(p->acc_offs[2]));
|
||||
|
||||
param_get(h->acc_t_00, &(p->acc_T[0][0]));
|
||||
param_get(h->acc_t_01, &(p->acc_T[0][1]));
|
||||
param_get(h->acc_t_02, &(p->acc_T[0][2]));
|
||||
param_get(h->acc_t_10, &(p->acc_T[1][0]));
|
||||
param_get(h->acc_t_11, &(p->acc_T[1][1]));
|
||||
param_get(h->acc_t_12, &(p->acc_T[1][2]));
|
||||
param_get(h->acc_t_20, &(p->acc_T[2][0]));
|
||||
param_get(h->acc_t_21, &(p->acc_T[2][1]));
|
||||
param_get(h->acc_t_22, &(p->acc_T[2][2]));
|
||||
return OK;
|
||||
}
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
/****************************************************************************
|
||||
*
|
||||
* Copyright (C) 2012 PX4 Development Team. All rights reserved.
|
||||
* Author: Damian Aregger <daregger@student.ethz.ch>
|
||||
* Tobias Naegeli <naegelit@student.ethz.ch>
|
||||
* Lorenz Meier <lm@inf.ethz.ch>
|
||||
* Copyright (C) 2013 Anton Babushkin. All rights reserved.
|
||||
* Author: Anton Babushkin <rk3dov@gmail.com>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@@ -43,11 +41,32 @@
|
||||
#include <systemlib/param/param.h>
|
||||
|
||||
struct position_estimator_inav_params {
|
||||
float r;
|
||||
float k[3][2];
|
||||
int16_t acc_offs[3];
|
||||
float acc_T[3][3];
|
||||
};
|
||||
|
||||
struct position_estimator_inav_param_handles {
|
||||
param_t r;
|
||||
param_t k_alt_00;
|
||||
param_t k_alt_01;
|
||||
param_t k_alt_10;
|
||||
param_t k_alt_11;
|
||||
param_t k_alt_20;
|
||||
param_t k_alt_21;
|
||||
|
||||
param_t acc_offs_0;
|
||||
param_t acc_offs_1;
|
||||
param_t acc_offs_2;
|
||||
|
||||
param_t acc_t_00;
|
||||
param_t acc_t_01;
|
||||
param_t acc_t_02;
|
||||
param_t acc_t_10;
|
||||
param_t acc_t_11;
|
||||
param_t acc_t_12;
|
||||
param_t acc_t_20;
|
||||
param_t acc_t_21;
|
||||
param_t acc_t_22;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
/*
|
||||
* sounds.c
|
||||
*
|
||||
* Created on: Feb 26, 2013
|
||||
* Author: samuezih
|
||||
*/
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <fcntl.h>
|
||||
#include <drivers/drv_tone_alarm.h>
|
||||
|
||||
|
||||
static int buzzer;
|
||||
|
||||
int sounds_init(void)
|
||||
{
|
||||
buzzer = open("/dev/tone_alarm", O_WRONLY);
|
||||
|
||||
if (buzzer < 0) {
|
||||
warnx("Buzzer: open fail\n");
|
||||
return ERROR;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sounds_deinit(void)
|
||||
{
|
||||
close(buzzer);
|
||||
}
|
||||
|
||||
void tune_tetris(void)
|
||||
{
|
||||
ioctl(buzzer, TONE_SET_ALARM, 6);
|
||||
}
|
||||
|
||||
void tune_sonar(void)
|
||||
{
|
||||
ioctl(buzzer, TONE_SET_ALARM, 7);
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
/*
|
||||
* sounds.h
|
||||
*
|
||||
* Created on: Feb 26, 2013
|
||||
* Author: samuezih
|
||||
*/
|
||||
|
||||
#ifndef SOUNDS_H_
|
||||
#define SOUNDS_H_
|
||||
|
||||
int sounds_init(void);
|
||||
void sounds_deinit(void);
|
||||
void tune_tetris(void);
|
||||
void tune_sonar(void);
|
||||
|
||||
#endif /* SOUNDS_H_ */
|
||||
Reference in New Issue
Block a user