mirror of
https://github.com/PX4/PX4-Autopilot.git
synced 2026-05-31 18:47:21 +08:00
Merge branch 'master' into vector_control2
This commit is contained in:
@@ -97,9 +97,9 @@ fi
|
|||||||
#
|
#
|
||||||
if [ $MKBLCTRL_FRAME == x ]
|
if [ $MKBLCTRL_FRAME == x ]
|
||||||
then
|
then
|
||||||
mixer load /dev/pwm_output /etc/mixers/FMU_quad_x.mix
|
mixer load /dev/mkblctrl /etc/mixers/FMU_quad_x.mix
|
||||||
else
|
else
|
||||||
mixer load /dev/pwm_output /etc/mixers/FMU_quad_+.mix
|
mixer load /dev/mkblctrl /etc/mixers/FMU_quad_+.mix
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|||||||
+11
-8
@@ -370,14 +370,17 @@ class uploader(object):
|
|||||||
self.port.close()
|
self.port.close()
|
||||||
|
|
||||||
def send_reboot(self):
|
def send_reboot(self):
|
||||||
# try reboot via NSH first
|
try:
|
||||||
self.__send(uploader.NSH_INIT)
|
# try reboot via NSH first
|
||||||
self.__send(uploader.NSH_REBOOT_BL)
|
self.__send(uploader.NSH_INIT)
|
||||||
self.__send(uploader.NSH_INIT)
|
self.__send(uploader.NSH_REBOOT_BL)
|
||||||
self.__send(uploader.NSH_REBOOT)
|
self.__send(uploader.NSH_INIT)
|
||||||
# then try MAVLINK command
|
self.__send(uploader.NSH_REBOOT)
|
||||||
self.__send(uploader.MAVLINK_REBOOT_ID1)
|
# then try MAVLINK command
|
||||||
self.__send(uploader.MAVLINK_REBOOT_ID0)
|
self.__send(uploader.MAVLINK_REBOOT_ID1)
|
||||||
|
self.__send(uploader.MAVLINK_REBOOT_ID0)
|
||||||
|
except:
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -69,12 +69,13 @@ MODULES += modules/mavlink_onboard
|
|||||||
MODULES += modules/gpio_led
|
MODULES += modules/gpio_led
|
||||||
|
|
||||||
#
|
#
|
||||||
# Estimation modules (EKF / other filters)
|
# Estimation modules (EKF/ SO3 / other filters)
|
||||||
#
|
#
|
||||||
#MODULES += modules/attitude_estimator_ekf
|
#MODULES += modules/attitude_estimator_ekf
|
||||||
MODULES += modules/att_pos_estimator_ekf
|
MODULES += modules/att_pos_estimator_ekf
|
||||||
#MODULES += modules/position_estimator_inav
|
#MODULES += modules/position_estimator_inav
|
||||||
MODULES += examples/flow_position_estimator
|
MODULES += examples/flow_position_estimator
|
||||||
|
MODULES += modules/attitude_estimator_so3
|
||||||
|
|
||||||
#
|
#
|
||||||
# Vehicle Control
|
# Vehicle Control
|
||||||
|
|||||||
@@ -69,9 +69,10 @@ MODULES += modules/mavlink_onboard
|
|||||||
MODULES += modules/gpio_led
|
MODULES += modules/gpio_led
|
||||||
|
|
||||||
#
|
#
|
||||||
# Estimation modules (EKF / other filters)
|
# Estimation modules (EKF/ SO3 / other filters)
|
||||||
#
|
#
|
||||||
MODULES += modules/attitude_estimator_ekf
|
MODULES += modules/attitude_estimator_ekf
|
||||||
|
MODULES += modules/attitude_estimator_so3
|
||||||
MODULES += modules/att_pos_estimator_ekf
|
MODULES += modules/att_pos_estimator_ekf
|
||||||
MODULES += modules/position_estimator_inav
|
MODULES += modules/position_estimator_inav
|
||||||
MODULES += examples/flow_position_estimator
|
MODULES += examples/flow_position_estimator
|
||||||
|
|||||||
@@ -68,9 +68,10 @@ MODULES += modules/mavlink
|
|||||||
MODULES += modules/mavlink_onboard
|
MODULES += modules/mavlink_onboard
|
||||||
|
|
||||||
#
|
#
|
||||||
# Estimation modules (EKF / other filters)
|
# Estimation modules (EKF/ SO3 / other filters)
|
||||||
#
|
#
|
||||||
MODULES += modules/attitude_estimator_ekf
|
MODULES += modules/attitude_estimator_ekf
|
||||||
|
MODULES += modules/attitude_estimator_so3
|
||||||
MODULES += modules/att_pos_estimator_ekf
|
MODULES += modules/att_pos_estimator_ekf
|
||||||
MODULES += modules/position_estimator_inav
|
MODULES += modules/position_estimator_inav
|
||||||
MODULES += examples/flow_position_estimator
|
MODULES += examples/flow_position_estimator
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright (C) 2012,2013 PX4 Development Team. All rights reserved.
|
* Copyright (C) 2012,2013 PX4 Development Team. All rights reserved.
|
||||||
|
* Author: Marco Bauer <marco@wtns.de>
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
@@ -35,7 +36,8 @@
|
|||||||
* @file mkblctrl.cpp
|
* @file mkblctrl.cpp
|
||||||
*
|
*
|
||||||
* Driver/configurator for the Mikrokopter BL-Ctrl.
|
* Driver/configurator for the Mikrokopter BL-Ctrl.
|
||||||
* Marco Bauer
|
*
|
||||||
|
* @author Marco Bauer <marco@wtns.de>
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -88,8 +90,8 @@
|
|||||||
#define BLCTRL_MIN_VALUE -0.920F
|
#define BLCTRL_MIN_VALUE -0.920F
|
||||||
#define MOTOR_STATE_PRESENT_MASK 0x80
|
#define MOTOR_STATE_PRESENT_MASK 0x80
|
||||||
#define MOTOR_STATE_ERROR_MASK 0x7F
|
#define MOTOR_STATE_ERROR_MASK 0x7F
|
||||||
#define MOTOR_SPINUP_COUNTER 2500
|
#define MOTOR_SPINUP_COUNTER 30
|
||||||
#define ESC_UORB_PUBLISH_DELAY 200
|
#define ESC_UORB_PUBLISH_DELAY 500000
|
||||||
|
|
||||||
class MK : public device::I2C
|
class MK : public device::I2C
|
||||||
{
|
{
|
||||||
@@ -111,7 +113,7 @@ public:
|
|||||||
FRAME_X,
|
FRAME_X,
|
||||||
};
|
};
|
||||||
|
|
||||||
MK(int bus);
|
MK(int bus, const char *_device_path);
|
||||||
~MK();
|
~MK();
|
||||||
|
|
||||||
virtual int ioctl(file *filp, int cmd, unsigned long arg);
|
virtual int ioctl(file *filp, int cmd, unsigned long arg);
|
||||||
@@ -125,7 +127,7 @@ public:
|
|||||||
int set_overrideSecurityChecks(bool overrideSecurityChecks);
|
int set_overrideSecurityChecks(bool overrideSecurityChecks);
|
||||||
int set_px4mode(int px4mode);
|
int set_px4mode(int px4mode);
|
||||||
int set_frametype(int frametype);
|
int set_frametype(int frametype);
|
||||||
unsigned int mk_check_for_blctrl(unsigned int count, bool showOutput);
|
unsigned int mk_check_for_blctrl(unsigned int count, bool showOutput, bool initI2C);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static const unsigned _max_actuators = MAX_MOTORS;
|
static const unsigned _max_actuators = MAX_MOTORS;
|
||||||
@@ -140,6 +142,7 @@ private:
|
|||||||
unsigned int _motor;
|
unsigned int _motor;
|
||||||
int _px4mode;
|
int _px4mode;
|
||||||
int _frametype;
|
int _frametype;
|
||||||
|
char _device[20]; ///< device
|
||||||
|
|
||||||
orb_advert_t _t_outputs;
|
orb_advert_t _t_outputs;
|
||||||
orb_advert_t _t_esc_status;
|
orb_advert_t _t_esc_status;
|
||||||
@@ -242,7 +245,7 @@ MK *g_mk;
|
|||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
MK::MK(int bus) :
|
MK::MK(int bus, const char *_device_path) :
|
||||||
I2C("mkblctrl", "/dev/mkblctrl", bus, 0, I2C_BUS_SPEED),
|
I2C("mkblctrl", "/dev/mkblctrl", bus, 0, I2C_BUS_SPEED),
|
||||||
_mode(MODE_NONE),
|
_mode(MODE_NONE),
|
||||||
_update_rate(50),
|
_update_rate(50),
|
||||||
@@ -262,6 +265,10 @@ MK::MK(int bus) :
|
|||||||
_armed(false),
|
_armed(false),
|
||||||
_mixers(nullptr)
|
_mixers(nullptr)
|
||||||
{
|
{
|
||||||
|
strncpy(_device, _device_path, sizeof(_device));
|
||||||
|
/* enforce null termination */
|
||||||
|
_device[sizeof(_device) - 1] = '\0';
|
||||||
|
|
||||||
_debug_enabled = true;
|
_debug_enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -288,7 +295,7 @@ MK::~MK()
|
|||||||
|
|
||||||
/* clean up the alternate device node */
|
/* clean up the alternate device node */
|
||||||
if (_primary_pwm_device)
|
if (_primary_pwm_device)
|
||||||
unregister_driver(PWM_OUTPUT_DEVICE_PATH);
|
unregister_driver(_device);
|
||||||
|
|
||||||
g_mk = nullptr;
|
g_mk = nullptr;
|
||||||
}
|
}
|
||||||
@@ -310,13 +317,15 @@ MK::init(unsigned motors)
|
|||||||
|
|
||||||
usleep(500000);
|
usleep(500000);
|
||||||
|
|
||||||
/* try to claim the generic PWM output device node as well - it's OK if we fail at this */
|
if (sizeof(_device) > 0) {
|
||||||
ret = register_driver(PWM_OUTPUT_DEVICE_PATH, &fops, 0666, (void *)this);
|
ret = register_driver(_device, &fops, 0666, (void *)this);
|
||||||
|
|
||||||
if (ret == OK) {
|
if (ret == OK) {
|
||||||
log("default PWM output device");
|
log("creating alternate output device");
|
||||||
_primary_pwm_device = true;
|
_primary_pwm_device = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* reset GPIOs */
|
/* reset GPIOs */
|
||||||
gpio_reset();
|
gpio_reset();
|
||||||
@@ -620,10 +629,7 @@ MK::task_main()
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* output to BLCtrl's */
|
/* output to BLCtrl's */
|
||||||
if (_motortest == true) {
|
if (_motortest != true) {
|
||||||
mk_servo_test(i);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
//mk_servo_set_value(i, scaling(outputs.output[i], -1.0f, 1.0f, 0, 1024)); // scale the output to 0 - 1024 and sent to output routine
|
//mk_servo_set_value(i, scaling(outputs.output[i], -1.0f, 1.0f, 0, 1024)); // scale the output to 0 - 1024 and sent to output routine
|
||||||
// 11 Bit
|
// 11 Bit
|
||||||
Motor[i].SetPoint_PX4 = outputs.output[i];
|
Motor[i].SetPoint_PX4 = outputs.output[i];
|
||||||
@@ -655,7 +661,7 @@ MK::task_main()
|
|||||||
* Only update esc topic every half second.
|
* Only update esc topic every half second.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (hrt_absolute_time() - esc.timestamp > 500000) {
|
if (hrt_absolute_time() - esc.timestamp > ESC_UORB_PUBLISH_DELAY) {
|
||||||
esc.counter++;
|
esc.counter++;
|
||||||
esc.timestamp = hrt_absolute_time();
|
esc.timestamp = hrt_absolute_time();
|
||||||
esc.esc_count = (uint8_t) _num_outputs;
|
esc.esc_count = (uint8_t) _num_outputs;
|
||||||
@@ -679,14 +685,21 @@ MK::task_main()
|
|||||||
esc.esc[i].esc_temperature = (uint16_t) Motor[i].Temperature;
|
esc.esc[i].esc_temperature = (uint16_t) Motor[i].Temperature;
|
||||||
esc.esc[i].esc_state = (uint16_t) Motor[i].State;
|
esc.esc[i].esc_state = (uint16_t) Motor[i].State;
|
||||||
esc.esc[i].esc_errorcount = (uint16_t) 0;
|
esc.esc[i].esc_errorcount = (uint16_t) 0;
|
||||||
|
|
||||||
|
// if motortest is requested - do it...
|
||||||
|
if (_motortest == true) {
|
||||||
|
mk_servo_test(i);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
orb_publish(ORB_ID(esc_status), _t_esc_status, &esc);
|
orb_publish(ORB_ID(esc_status), _t_esc_status, &esc);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//::close(_t_esc_status);
|
::close(_t_esc_status);
|
||||||
::close(_t_actuators);
|
::close(_t_actuators);
|
||||||
::close(_t_actuator_armed);
|
::close(_t_actuator_armed);
|
||||||
|
|
||||||
@@ -713,8 +726,12 @@ MK::mk_servo_arm(bool status)
|
|||||||
|
|
||||||
|
|
||||||
unsigned int
|
unsigned int
|
||||||
MK::mk_check_for_blctrl(unsigned int count, bool showOutput)
|
MK::mk_check_for_blctrl(unsigned int count, bool showOutput, bool initI2C)
|
||||||
{
|
{
|
||||||
|
if(initI2C) {
|
||||||
|
I2C::init();
|
||||||
|
}
|
||||||
|
|
||||||
_retries = 50;
|
_retries = 50;
|
||||||
uint8_t foundMotorCount = 0;
|
uint8_t foundMotorCount = 0;
|
||||||
|
|
||||||
@@ -938,6 +955,7 @@ MK::mk_servo_test(unsigned int chan)
|
|||||||
if (_motor >= _num_outputs) {
|
if (_motor >= _num_outputs) {
|
||||||
_motor = -1;
|
_motor = -1;
|
||||||
_motortest = false;
|
_motortest = false;
|
||||||
|
fprintf(stderr, "[mkblctrl] Motortest finished...\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1353,7 +1371,7 @@ mk_new_mode(PortMode new_mode, int update_rate, int motorcount, bool motortest,
|
|||||||
|
|
||||||
/* count used motors */
|
/* count used motors */
|
||||||
do {
|
do {
|
||||||
if (g_mk->mk_check_for_blctrl(8, false) != 0) {
|
if (g_mk->mk_check_for_blctrl(8, false, false) != 0) {
|
||||||
shouldStop = 4;
|
shouldStop = 4;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -1363,7 +1381,7 @@ mk_new_mode(PortMode new_mode, int update_rate, int motorcount, bool motortest,
|
|||||||
sleep(1);
|
sleep(1);
|
||||||
} while (shouldStop < 3);
|
} while (shouldStop < 3);
|
||||||
|
|
||||||
g_mk->set_motor_count(g_mk->mk_check_for_blctrl(8, true));
|
g_mk->set_motor_count(g_mk->mk_check_for_blctrl(8, true, false));
|
||||||
|
|
||||||
/* (re)set the PWM output mode */
|
/* (re)set the PWM output mode */
|
||||||
g_mk->set_mode(servo_mode);
|
g_mk->set_mode(servo_mode);
|
||||||
@@ -1376,13 +1394,13 @@ mk_new_mode(PortMode new_mode, int update_rate, int motorcount, bool motortest,
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
mk_start(unsigned bus, unsigned motors)
|
mk_start(unsigned bus, unsigned motors, char *device_path)
|
||||||
{
|
{
|
||||||
int ret = OK;
|
int ret = OK;
|
||||||
|
|
||||||
if (g_mk == nullptr) {
|
if (g_mk == nullptr) {
|
||||||
|
|
||||||
g_mk = new MK(bus);
|
g_mk = new MK(bus, device_path);
|
||||||
|
|
||||||
if (g_mk == nullptr) {
|
if (g_mk == nullptr) {
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
@@ -1401,6 +1419,52 @@ mk_start(unsigned bus, unsigned motors)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
mk_check_for_i2c_esc_bus(char *device_path, int motors)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (g_mk == nullptr) {
|
||||||
|
|
||||||
|
g_mk = new MK(3, device_path);
|
||||||
|
|
||||||
|
if (g_mk == nullptr) {
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ret = g_mk->mk_check_for_blctrl(8, false, true);
|
||||||
|
delete g_mk;
|
||||||
|
g_mk = nullptr;
|
||||||
|
|
||||||
|
if (ret > 0) {
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
g_mk = new MK(1, device_path);
|
||||||
|
|
||||||
|
if (g_mk == nullptr) {
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
ret = g_mk->mk_check_for_blctrl(8, false, true);
|
||||||
|
delete g_mk;
|
||||||
|
g_mk = nullptr;
|
||||||
|
|
||||||
|
if (ret > 0) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
extern "C" __EXPORT int mkblctrl_main(int argc, char *argv[]);
|
extern "C" __EXPORT int mkblctrl_main(int argc, char *argv[]);
|
||||||
@@ -1411,13 +1475,14 @@ mkblctrl_main(int argc, char *argv[])
|
|||||||
PortMode port_mode = PORT_FULL_PWM;
|
PortMode port_mode = PORT_FULL_PWM;
|
||||||
int pwm_update_rate_in_hz = UPDATE_RATE;
|
int pwm_update_rate_in_hz = UPDATE_RATE;
|
||||||
int motorcount = 8;
|
int motorcount = 8;
|
||||||
int bus = 1;
|
int bus = -1;
|
||||||
int px4mode = MAPPING_PX4;
|
int px4mode = MAPPING_PX4;
|
||||||
int frametype = FRAME_PLUS; // + plus is default
|
int frametype = FRAME_PLUS; // + plus is default
|
||||||
bool motortest = false;
|
bool motortest = false;
|
||||||
bool overrideSecurityChecks = false;
|
bool overrideSecurityChecks = false;
|
||||||
bool showHelp = false;
|
bool showHelp = false;
|
||||||
bool newMode = false;
|
bool newMode = false;
|
||||||
|
char *devicepath = "";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* optional parameters
|
* optional parameters
|
||||||
@@ -1477,36 +1542,69 @@ mkblctrl_main(int argc, char *argv[])
|
|||||||
newMode = true;
|
newMode = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* look for the optional device parameter */
|
||||||
|
if (strcmp(argv[i], "-d") == 0 || strcmp(argv[i], "--device") == 0) {
|
||||||
|
if (argc > i + 1) {
|
||||||
|
devicepath = argv[i + 1];
|
||||||
|
newMode = true;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
errx(1, "missing the devicename (-d)");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (showHelp) {
|
if (showHelp) {
|
||||||
fprintf(stderr, "mkblctrl: help:\n");
|
fprintf(stderr, "mkblctrl: help:\n");
|
||||||
fprintf(stderr, " [-mkmode frame{+/x}] [-b i2c_bus_number] [-t motortest] [--override-security-checks] [-h / --help]\n\n");
|
fprintf(stderr, " [-mkmode {+/x}] [-b i2c_bus_number] [-d devicename] [--override-security-checks] [-h / --help]\n\n");
|
||||||
fprintf(stderr, "\t -mkmode frame {+/x} \t\t Type of frame, if Mikrokopter motor order is used.\n");
|
fprintf(stderr, "\t -mkmode {+/x} \t\t Type of frame, if Mikrokopter motor order is used.\n");
|
||||||
fprintf(stderr, "\t -b i2c_bus_number \t\t Set the i2c bus where the ESCs are connected to (default 1).\n");
|
fprintf(stderr, "\t -b {i2c_bus_number} \t\t Set the i2c bus where the ESCs are connected to (default autoscan).\n");
|
||||||
fprintf(stderr, "\t -t motortest \t\t\t Spin up once every motor in order of motoraddress. (DANGER !!!)\n");
|
fprintf(stderr, "\t -d {devicepath & name}\t\t Create alternate pwm device.\n");
|
||||||
fprintf(stderr, "\t --override-security-checks \t\t Disable all security checks (arming and number of ESCs). Used to test single Motors etc. (DANGER !!!)\n");
|
fprintf(stderr, "\t --override-security-checks \t\t Disable all security checks (arming and number of ESCs). Used to test single Motors etc. (DANGER !!!)\n");
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
fprintf(stderr, "Motortest:\n");
|
||||||
|
fprintf(stderr, "First you have to start mkblctrl, the you can enter Motortest Mode with:\n");
|
||||||
|
fprintf(stderr, "mkblctrl -t\n");
|
||||||
|
fprintf(stderr, "This will spin up once every motor in order of motoraddress. (DANGER !!!)\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (g_mk == nullptr) {
|
if (!motortest) {
|
||||||
if (mk_start(bus, motorcount) != OK) {
|
if (g_mk == nullptr) {
|
||||||
errx(1, "failed to start the MK-BLCtrl driver");
|
if (bus == -1) {
|
||||||
|
bus = mk_check_for_i2c_esc_bus(devicepath, motorcount);
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
if (bus != -1) {
|
||||||
newMode = true;
|
if (mk_start(bus, motorcount, devicepath) != OK) {
|
||||||
}
|
errx(1, "failed to start the MK-BLCtrl driver");
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
errx(1, "failed to start the MK-BLCtrl driver (cannot find i2c esc's)");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* parameter set ? */
|
||||||
|
if (newMode) {
|
||||||
|
/* switch parameter */
|
||||||
|
return mk_new_mode(port_mode, pwm_update_rate_in_hz, motorcount, motortest, px4mode, frametype, overrideSecurityChecks);
|
||||||
|
}
|
||||||
|
|
||||||
/* parameter set ? */
|
exit(0);
|
||||||
if (newMode) {
|
} else {
|
||||||
/* switch parameter */
|
errx(1, "MK-BLCtrl driver already running");
|
||||||
return mk_new_mode(port_mode, pwm_update_rate_in_hz, motorcount, motortest, px4mode, frametype, overrideSecurityChecks);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* test, etc. here g*/
|
} else {
|
||||||
|
if (g_mk == nullptr) {
|
||||||
|
errx(1, "MK-BLCtrl driver not running. You have to start it first.");
|
||||||
|
|
||||||
exit(1);
|
} else {
|
||||||
|
g_mk->set_motor_test(motortest);
|
||||||
|
exit(0);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -299,7 +299,7 @@ void TECS::_update_throttle(float throttle_cruise, const math::Dcm &rotMat)
|
|||||||
|
|
||||||
// Rate limit PD + FF throttle
|
// Rate limit PD + FF throttle
|
||||||
// Calculate the throttle increment from the specified slew time
|
// Calculate the throttle increment from the specified slew time
|
||||||
if (fabsf(_throttle_slewrate) < 0.01f) {
|
if (fabsf(_throttle_slewrate) > 0.01f) {
|
||||||
float thrRateIncr = _DT * (_THRmaxf - _THRminf) * _throttle_slewrate;
|
float thrRateIncr = _DT * (_THRmaxf - _THRminf) * _throttle_slewrate;
|
||||||
|
|
||||||
_throttle_dem = constrain(_throttle_dem,
|
_throttle_dem = constrain(_throttle_dem,
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
Synopsis
|
||||||
|
|
||||||
|
nsh> attitude_estimator_so3_comp start
|
||||||
+166
-323
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,86 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013 PX4 Development Team. All rights reserved.
|
||||||
|
* Author: Hyon Lim <limhyon@gmail.com>
|
||||||
|
* Anton Babushkin <anton.babushkin@me.com>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* 3. Neither the name PX4 nor the names of its contributors may be
|
||||||
|
* used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @file attitude_estimator_so3_params.c
|
||||||
|
*
|
||||||
|
* Parameters for nonlinear complementary filters on the SO(3).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "attitude_estimator_so3_params.h"
|
||||||
|
|
||||||
|
/* This is filter gain for nonlinear SO3 complementary filter */
|
||||||
|
/* NOTE : How to tune the gain? First of all, stick with this default gain. And let the quad in stable place.
|
||||||
|
Log the steady state reponse of filter. If it is too slow, increase SO3_COMP_KP.
|
||||||
|
If you are flying from ground to high altitude in short amount of time, please increase SO3_COMP_KI which
|
||||||
|
will compensate gyro bias which depends on temperature and vibration of your vehicle */
|
||||||
|
PARAM_DEFINE_FLOAT(SO3_COMP_KP, 1.0f); //! This parameter will give you about 15 seconds convergence time.
|
||||||
|
//! You can set this gain higher if you want more fast response.
|
||||||
|
//! But note that higher gain will give you also higher overshoot.
|
||||||
|
PARAM_DEFINE_FLOAT(SO3_COMP_KI, 0.05f); //! This gain will incorporate slow time-varying bias (e.g., temperature change)
|
||||||
|
//! This gain is depend on your vehicle status.
|
||||||
|
|
||||||
|
/* offsets in roll, pitch and yaw of sensor plane and body */
|
||||||
|
PARAM_DEFINE_FLOAT(SO3_ROLL_OFFS, 0.0f);
|
||||||
|
PARAM_DEFINE_FLOAT(SO3_PITCH_OFFS, 0.0f);
|
||||||
|
PARAM_DEFINE_FLOAT(SO3_YAW_OFFS, 0.0f);
|
||||||
|
|
||||||
|
int parameters_init(struct attitude_estimator_so3_param_handles *h)
|
||||||
|
{
|
||||||
|
/* Filter gain parameters */
|
||||||
|
h->Kp = param_find("SO3_COMP_KP");
|
||||||
|
h->Ki = param_find("SO3_COMP_KI");
|
||||||
|
|
||||||
|
/* Attitude offset (WARNING: Do not change if you do not know what exactly this variable wil lchange) */
|
||||||
|
h->roll_off = param_find("SO3_ROLL_OFFS");
|
||||||
|
h->pitch_off = param_find("SO3_PITCH_OFFS");
|
||||||
|
h->yaw_off = param_find("SO3_YAW_OFFS");
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
int parameters_update(const struct attitude_estimator_so3_param_handles *h, struct attitude_estimator_so3_params *p)
|
||||||
|
{
|
||||||
|
/* Update filter gain */
|
||||||
|
param_get(h->Kp, &(p->Kp));
|
||||||
|
param_get(h->Ki, &(p->Ki));
|
||||||
|
|
||||||
|
/* Update attitude offset */
|
||||||
|
param_get(h->roll_off, &(p->roll_off));
|
||||||
|
param_get(h->pitch_off, &(p->pitch_off));
|
||||||
|
param_get(h->yaw_off, &(p->yaw_off));
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
*
|
||||||
|
* Copyright (C) 2013 PX4 Development Team. All rights reserved.
|
||||||
|
* Author: Hyon Lim <limhyon@gmail.com>
|
||||||
|
* Anton Babushkin <anton.babushkin@me.com>
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
*
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in
|
||||||
|
* the documentation and/or other materials provided with the
|
||||||
|
* distribution.
|
||||||
|
* 3. Neither the name PX4 nor the names of its contributors may be
|
||||||
|
* used to endorse or promote products derived from this software
|
||||||
|
* without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||||
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||||
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||||
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||||
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||||
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||||
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @file attitude_estimator_so3_params.h
|
||||||
|
*
|
||||||
|
* Parameters for nonlinear complementary filters on the SO(3).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <systemlib/param/param.h>
|
||||||
|
|
||||||
|
struct attitude_estimator_so3_params {
|
||||||
|
float Kp;
|
||||||
|
float Ki;
|
||||||
|
float roll_off;
|
||||||
|
float pitch_off;
|
||||||
|
float yaw_off;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct attitude_estimator_so3_param_handles {
|
||||||
|
param_t Kp, Ki;
|
||||||
|
param_t roll_off, pitch_off, yaw_off;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize all parameter handles and values
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int parameters_init(struct attitude_estimator_so3_param_handles *h);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update all parameters
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
int parameters_update(const struct attitude_estimator_so3_param_handles *h, struct attitude_estimator_so3_params *p);
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#
|
||||||
|
# Attitude estimator (Nonlinear SO(3) complementary Filter)
|
||||||
|
#
|
||||||
|
|
||||||
|
MODULE_COMMAND = attitude_estimator_so3
|
||||||
|
|
||||||
|
SRCS = attitude_estimator_so3_main.cpp \
|
||||||
|
attitude_estimator_so3_params.c
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
Synopsis
|
|
||||||
|
|
||||||
nsh> attitude_estimator_so3_comp start -d /dev/ttyS1 -b 115200
|
|
||||||
|
|
||||||
Option -d is for debugging packet. See code for detailed packet structure.
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
/*
|
|
||||||
* Author: Hyon Lim <limhyon@gmail.com, hyonlim@snu.ac.kr>
|
|
||||||
*
|
|
||||||
* @file attitude_estimator_so3_comp_params.c
|
|
||||||
*
|
|
||||||
* Implementation of nonlinear complementary filters on the SO(3).
|
|
||||||
* This code performs attitude estimation by using accelerometer, gyroscopes and magnetometer.
|
|
||||||
* Result is provided as quaternion, 1-2-3 Euler angle and rotation matrix.
|
|
||||||
*
|
|
||||||
* Theory of nonlinear complementary filters on the SO(3) is based on [1].
|
|
||||||
* Quaternion realization of [1] is based on [2].
|
|
||||||
* Optmized quaternion update code is based on Sebastian Madgwick's implementation.
|
|
||||||
*
|
|
||||||
* References
|
|
||||||
* [1] Mahony, R.; Hamel, T.; Pflimlin, Jean-Michel, "Nonlinear Complementary Filters on the Special Orthogonal Group," Automatic Control, IEEE Transactions on , vol.53, no.5, pp.1203,1218, June 2008
|
|
||||||
* [2] Euston, M.; Coote, P.; Mahony, R.; Jonghyuk Kim; Hamel, T., "A complementary filter for attitude estimation of a fixed-wing UAV," Intelligent Robots and Systems, 2008. IROS 2008. IEEE/RSJ International Conference on , vol., no., pp.340,345, 22-26 Sept. 2008
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "attitude_estimator_so3_comp_params.h"
|
|
||||||
|
|
||||||
/* This is filter gain for nonlinear SO3 complementary filter */
|
|
||||||
/* NOTE : How to tune the gain? First of all, stick with this default gain. And let the quad in stable place.
|
|
||||||
Log the steady state reponse of filter. If it is too slow, increase SO3_COMP_KP.
|
|
||||||
If you are flying from ground to high altitude in short amount of time, please increase SO3_COMP_KI which
|
|
||||||
will compensate gyro bias which depends on temperature and vibration of your vehicle */
|
|
||||||
PARAM_DEFINE_FLOAT(SO3_COMP_KP, 1.0f); //! This parameter will give you about 15 seconds convergence time.
|
|
||||||
//! You can set this gain higher if you want more fast response.
|
|
||||||
//! But note that higher gain will give you also higher overshoot.
|
|
||||||
PARAM_DEFINE_FLOAT(SO3_COMP_KI, 0.05f); //! This gain will incorporate slow time-varying bias (e.g., temperature change)
|
|
||||||
//! This gain is depend on your vehicle status.
|
|
||||||
|
|
||||||
/* offsets in roll, pitch and yaw of sensor plane and body */
|
|
||||||
PARAM_DEFINE_FLOAT(ATT_ROLL_OFFS, 0.0f);
|
|
||||||
PARAM_DEFINE_FLOAT(ATT_PITCH_OFFS, 0.0f);
|
|
||||||
PARAM_DEFINE_FLOAT(ATT_YAW_OFFS, 0.0f);
|
|
||||||
|
|
||||||
int parameters_init(struct attitude_estimator_so3_comp_param_handles *h)
|
|
||||||
{
|
|
||||||
/* Filter gain parameters */
|
|
||||||
h->Kp = param_find("SO3_COMP_KP");
|
|
||||||
h->Ki = param_find("SO3_COMP_KI");
|
|
||||||
|
|
||||||
/* Attitude offset (WARNING: Do not change if you do not know what exactly this variable wil lchange) */
|
|
||||||
h->roll_off = param_find("ATT_ROLL_OFFS");
|
|
||||||
h->pitch_off = param_find("ATT_PITCH_OFFS");
|
|
||||||
h->yaw_off = param_find("ATT_YAW_OFFS");
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
int parameters_update(const struct attitude_estimator_so3_comp_param_handles *h, struct attitude_estimator_so3_comp_params *p)
|
|
||||||
{
|
|
||||||
/* Update filter gain */
|
|
||||||
param_get(h->Kp, &(p->Kp));
|
|
||||||
param_get(h->Ki, &(p->Ki));
|
|
||||||
|
|
||||||
/* Update attitude offset */
|
|
||||||
param_get(h->roll_off, &(p->roll_off));
|
|
||||||
param_get(h->pitch_off, &(p->pitch_off));
|
|
||||||
param_get(h->yaw_off, &(p->yaw_off));
|
|
||||||
|
|
||||||
return OK;
|
|
||||||
}
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
/*
|
|
||||||
* Author: Hyon Lim <limhyon@gmail.com, hyonlim@snu.ac.kr>
|
|
||||||
*
|
|
||||||
* @file attitude_estimator_so3_comp_params.h
|
|
||||||
*
|
|
||||||
* Implementation of nonlinear complementary filters on the SO(3).
|
|
||||||
* This code performs attitude estimation by using accelerometer, gyroscopes and magnetometer.
|
|
||||||
* Result is provided as quaternion, 1-2-3 Euler angle and rotation matrix.
|
|
||||||
*
|
|
||||||
* Theory of nonlinear complementary filters on the SO(3) is based on [1].
|
|
||||||
* Quaternion realization of [1] is based on [2].
|
|
||||||
* Optmized quaternion update code is based on Sebastian Madgwick's implementation.
|
|
||||||
*
|
|
||||||
* References
|
|
||||||
* [1] Mahony, R.; Hamel, T.; Pflimlin, Jean-Michel, "Nonlinear Complementary Filters on the Special Orthogonal Group," Automatic Control, IEEE Transactions on , vol.53, no.5, pp.1203,1218, June 2008
|
|
||||||
* [2] Euston, M.; Coote, P.; Mahony, R.; Jonghyuk Kim; Hamel, T., "A complementary filter for attitude estimation of a fixed-wing UAV," Intelligent Robots and Systems, 2008. IROS 2008. IEEE/RSJ International Conference on , vol., no., pp.340,345, 22-26 Sept. 2008
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <systemlib/param/param.h>
|
|
||||||
|
|
||||||
struct attitude_estimator_so3_comp_params {
|
|
||||||
float Kp;
|
|
||||||
float Ki;
|
|
||||||
float roll_off;
|
|
||||||
float pitch_off;
|
|
||||||
float yaw_off;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct attitude_estimator_so3_comp_param_handles {
|
|
||||||
param_t Kp, Ki;
|
|
||||||
param_t roll_off, pitch_off, yaw_off;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize all parameter handles and values
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
int parameters_init(struct attitude_estimator_so3_comp_param_handles *h);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Update all parameters
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
int parameters_update(const struct attitude_estimator_so3_comp_param_handles *h, struct attitude_estimator_so3_comp_params *p);
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
#
|
|
||||||
# Attitude estimator (Nonlinear SO3 complementary Filter)
|
|
||||||
#
|
|
||||||
|
|
||||||
MODULE_COMMAND = attitude_estimator_so3_comp
|
|
||||||
|
|
||||||
SRCS = attitude_estimator_so3_comp_main.cpp \
|
|
||||||
attitude_estimator_so3_comp_params.c
|
|
||||||
@@ -871,7 +871,7 @@ int commander_thread_main(int argc, char *argv[])
|
|||||||
check_valid(local_position.timestamp, POSITION_TIMEOUT, local_position.xy_valid, &(status.condition_local_position_valid), &status_changed);
|
check_valid(local_position.timestamp, POSITION_TIMEOUT, local_position.xy_valid, &(status.condition_local_position_valid), &status_changed);
|
||||||
check_valid(local_position.timestamp, POSITION_TIMEOUT, local_position.z_valid, &(status.condition_local_altitude_valid), &status_changed);
|
check_valid(local_position.timestamp, POSITION_TIMEOUT, local_position.z_valid, &(status.condition_local_altitude_valid), &status_changed);
|
||||||
|
|
||||||
if (status.condition_local_altitude_valid) {
|
if (status.is_rotary_wing && status.condition_local_altitude_valid) {
|
||||||
if (status.condition_landed != local_position.landed) {
|
if (status.condition_landed != local_position.landed) {
|
||||||
status.condition_landed = local_position.landed;
|
status.condition_landed = local_position.landed;
|
||||||
status_changed = true;
|
status_changed = true;
|
||||||
@@ -1539,7 +1539,8 @@ check_navigation_state_machine(struct vehicle_status_s *status, struct vehicle_c
|
|||||||
// TODO AUTO_LAND handling
|
// TODO AUTO_LAND handling
|
||||||
if (status->navigation_state == NAVIGATION_STATE_AUTO_TAKEOFF) {
|
if (status->navigation_state == NAVIGATION_STATE_AUTO_TAKEOFF) {
|
||||||
/* don't switch to other states until takeoff not completed */
|
/* don't switch to other states until takeoff not completed */
|
||||||
if (local_pos->z > -takeoff_alt || status->condition_landed) {
|
// XXX: only respect the condition_landed when the local position is actually valid
|
||||||
|
if (status->is_rotary_wing && status->condition_local_altitude_valid && (local_pos->z > -takeoff_alt || status->condition_landed)) {
|
||||||
return TRANSITION_NOT_CHANGED;
|
return TRANSITION_NOT_CHANGED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1549,7 +1550,7 @@ check_navigation_state_machine(struct vehicle_status_s *status, struct vehicle_c
|
|||||||
status->navigation_state != NAVIGATION_STATE_AUTO_MISSION &&
|
status->navigation_state != NAVIGATION_STATE_AUTO_MISSION &&
|
||||||
status->navigation_state != NAVIGATION_STATE_AUTO_RTL) {
|
status->navigation_state != NAVIGATION_STATE_AUTO_RTL) {
|
||||||
/* possibly on ground, switch to TAKEOFF if needed */
|
/* possibly on ground, switch to TAKEOFF if needed */
|
||||||
if (local_pos->z > -takeoff_alt || status->condition_landed) {
|
if (status->is_rotary_wing && status->condition_local_altitude_valid && (local_pos->z > -takeoff_alt || status->condition_landed)) {
|
||||||
res = navigation_state_transition(status, NAVIGATION_STATE_AUTO_TAKEOFF, control_mode);
|
res = navigation_state_transition(status, NAVIGATION_STATE_AUTO_TAKEOFF, control_mode);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,9 +33,9 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file fw_pos_control_l1_params.c
|
* @file fw_att_control_params.c
|
||||||
*
|
*
|
||||||
* Parameters defined by the L1 position control task
|
* Parameters defined by the fixed-wing attitude control task
|
||||||
*
|
*
|
||||||
* @author Lorenz Meier <lm@inf.ethz.ch>
|
* @author Lorenz Meier <lm@inf.ethz.ch>
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -250,6 +250,19 @@ l_vehicle_attitude(const struct listener *l)
|
|||||||
float throttle = armed.armed ? actuators_0.control[3] * 100.0f : 0.0f;
|
float throttle = armed.armed ? actuators_0.control[3] * 100.0f : 0.0f;
|
||||||
mavlink_msg_vfr_hud_send(MAVLINK_COMM_0, airspeed.true_airspeed_m_s, groundspeed, heading, throttle, global_pos.alt, -global_pos.vz);
|
mavlink_msg_vfr_hud_send(MAVLINK_COMM_0, airspeed.true_airspeed_m_s, groundspeed, heading, throttle, global_pos.alt, -global_pos.vz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* send quaternion values if it exists */
|
||||||
|
if(att.q_valid) {
|
||||||
|
mavlink_msg_attitude_quaternion_send(MAVLINK_COMM_0,
|
||||||
|
last_sensor_timestamp / 1000,
|
||||||
|
att.q[0],
|
||||||
|
att.q[1],
|
||||||
|
att.q[2],
|
||||||
|
att.q[3],
|
||||||
|
att.rollspeed,
|
||||||
|
att.pitchspeed,
|
||||||
|
att.yawspeed);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
attitude_counter++;
|
attitude_counter++;
|
||||||
|
|||||||
Reference in New Issue
Block a user