mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-06-06 07:53:43 +08:00
sim getting closer
This commit is contained in:
@@ -48,6 +48,7 @@
|
||||
|
||||
# imu Booz2 v1
|
||||
ap.CFLAGS += -DBOOZ_IMU_TYPE_H=\"imu/booz_imu_b2.h\"
|
||||
ap.CFLAGS += -DIMU_B2_MAG_TYPE=IMU_B2_MAG_AMI601
|
||||
ap.CFLAGS += -DSSP_VIC_SLOT=9
|
||||
ap.srcs += $(SRC_BOOZ)/booz_imu.c \
|
||||
$(SRC_BOOZ)/imu/booz_imu_b2.c \
|
||||
@@ -67,6 +68,7 @@ ap.CFLAGS += -DUSE_I2C1 -DI2C1_SCLL=150 -DI2C1_SCLH=150 -DI2C1_VIC_SLOT=11 -DI2
|
||||
#
|
||||
|
||||
sim.CFLAGS += -DBOOZ_IMU_TYPE_H=\"imu/booz_imu_b2.h\"
|
||||
sim.CFLAGS += -DIMU_B2_MAG_TYPE=IMU_B2_MAG_AMI601
|
||||
sim.srcs += $(SRC_BOOZ)/booz_imu.c \
|
||||
$(SRC_BOOZ)/imu/booz_imu_b2.c \
|
||||
$(SRC_BOOZ_SIM)/imu/booz_imu_b2_arch.c
|
||||
@@ -75,3 +77,6 @@ sim.srcs += $(SRC_BOOZ)/booz_imu.c \
|
||||
sim.srcs += $(SRC_BOOZ)/peripherals/booz_max1168.c \
|
||||
$(SRC_BOOZ_SIM)/peripherals/booz_max1168_arch.c
|
||||
|
||||
sim.CFLAGS += -DUSE_AMI601
|
||||
sim.srcs += $(SRC_BOOZ)/peripherals/booz_ami601.c
|
||||
sim.CFLAGS += -DUSE_I2C1
|
||||
+2
-2
@@ -461,11 +461,11 @@
|
||||
<field name="blmc_nb_err" type="uint8"/>
|
||||
<field name="rc_status" type="uint8" values="OK|LOST|REALLY_LOST"/>
|
||||
<field name="gps_status" type="uint8" values="NO_FIX|NA|NA|3Dfix"/>
|
||||
<field name="ap_mode" type="uint8" values="FAILSAFE|KILL|RATE_DIRECT|ATTITUDE_DIRECT|RATE_RC_CLIMB|ATTITUDE_RC_CLIMB|RATE_Z_HOLD|ATTITUDE_Z_HOLD|HOVER_DIRECT|HOVER_Z_HOLD|NAV"/>
|
||||
<field name="ap_mode" type="uint8" values="FAILSAFE|KILL|RATE_DIRECT|ATTITUDE_DIRECT|RATE_RC_CLIMB|ATTITUDE_RC_CLIMB|ATTITUDE_CLIMB|RATE_Z_HOLD|ATTITUDE_Z_HOLD|HOVER_DIRECT|HOVER_CLIMB|HOVER_Z_HOLD|NAV"/>
|
||||
<field name="ap_in_flight" type="uint8" values="ON_GROUND|IN_FLIGHT"/>
|
||||
<field name="ap_motors_on" type="uint8" values="MOTORS_OFF|MOTORS_ON"/>
|
||||
<field name="ap_h_mode" type="uint8" values="KILL|RATE|ATTITUDE|HOVER|NAV"/>
|
||||
<field name="ap_v_mode" type="uint8" values="KILL|RC_DIRECT|RC_CLIMB|CLIMB|HOVER"/>
|
||||
<field name="ap_v_mode" type="uint8" values="KILL|RC_DIRECT|RC_CLIMB|CLIMB|HOVER|NAV"/>
|
||||
<field name="vsupply" type="uint8" unit="decivolt"/>
|
||||
<field name="cpu_time" type="uint16" unit="s"></field>
|
||||
</message>
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
<psi unit="DEG"> 0.0 </psi>
|
||||
<latitude unit="DEG"> 37.6136 </latitude>
|
||||
<longitude unit="DEG">-122.3569 </longitude>
|
||||
<altitude unit="M"> 0.11 </altitude>
|
||||
<!-- <altitude unit="M"> 0.11 </altitude> -->
|
||||
<altitude unit="M"> 0.9 </altitude>
|
||||
<winddir unit="DEG"> 0.0 </winddir>
|
||||
<vwind unit="FT/SEC"> 0.0 </vwind>
|
||||
</initialize>
|
||||
|
||||
@@ -16,8 +16,9 @@
|
||||
</mode>
|
||||
|
||||
<mode name="ppm">
|
||||
<message name="PPM" period="0.5"/>
|
||||
<message name="RC" period="0.5"/>
|
||||
<message name="PPM" period="0.5"/>
|
||||
<message name="RC" period="0.5"/>
|
||||
<message name="BOOZ2_RADIO_CONTROL" period="0.5"/>
|
||||
<message name="BOOZ_STATUS" period="1"/>
|
||||
</mode>
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@
|
||||
|
||||
#include "booz_imu.h"
|
||||
|
||||
#include "airframe.h"
|
||||
|
||||
void booz_imu_b2_arch_init(void) {
|
||||
|
||||
}
|
||||
@@ -31,3 +33,29 @@ void booz_imu_periodic(void) {
|
||||
|
||||
}
|
||||
|
||||
#include "nps_sensors.h"
|
||||
|
||||
void booz_imu_feed_gyro_accel(void) {
|
||||
booz_max1168_values[IMU_GYRO_P_CHAN] = sensors.gyro.value.x;
|
||||
booz_max1168_values[IMU_GYRO_Q_CHAN] = sensors.gyro.value.y;
|
||||
booz_max1168_values[IMU_GYRO_R_CHAN] = sensors.gyro.value.z;
|
||||
booz_max1168_values[IMU_ACCEL_X_CHAN] = sensors.accel.value.x;
|
||||
booz_max1168_values[IMU_ACCEL_Y_CHAN] = sensors.accel.value.y;
|
||||
booz_max1168_values[IMU_ACCEL_Z_CHAN] = sensors.accel.value.z;
|
||||
booz_max1168_status = STA_MAX1168_DATA_AVAILABLE;
|
||||
}
|
||||
|
||||
|
||||
void booz_imu_feed_mag(void) {
|
||||
#if defined IMU_B2_MAG_TYPE && IMU_B2_MAG_TYPE == IMU_B2_MAG_MS2001
|
||||
ms2001_values[IMU_MAG_X_CHAN] = sensors.mag.value.x;
|
||||
ms2001_values[IMU_MAG_Y_CHAN] = sensors.mag.value.y;
|
||||
ms2001_values[IMU_MAG_Z_CHAN] = sensors.mag.value.z;
|
||||
ms2001_status = MS2001_DATA_AVAILABLE;
|
||||
#elif defined IMU_B2_MAG_TYPE && IMU_B2_MAG_TYPE == IMU_B2_MAG_AMI601
|
||||
ami601_values[IMU_MAG_X_CHAN] = sensors.mag.value.x;
|
||||
ami601_values[IMU_MAG_Y_CHAN] = sensors.mag.value.y;
|
||||
ami601_values[IMU_MAG_Z_CHAN] = sensors.mag.value.z;
|
||||
ami601_status = AMI601_DATA_AVAILABLE;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -30,15 +30,8 @@
|
||||
#define BOOZ2_IMU_B2_ARCH_H
|
||||
|
||||
|
||||
#define booz_imu_feed_gyro_accel() { \
|
||||
booz2_max1168_values[IMU_GYRO_P_CHAN] = bsm.gyro->ve[AXIS_P]; \
|
||||
booz2_max1168_values[IMU_GYRO_Q_CHAN] = bsm.gyro->ve[AXIS_Q]; \
|
||||
booz2_max1168_values[IMU_GYRO_R_CHAN] = bsm.gyro->ve[AXIS_R]; \
|
||||
booz2_max1168_values[IMU_ACCEL_X_CHAN] = bsm.accel->ve[AXIS_X]; \
|
||||
booz2_max1168_values[IMU_ACCEL_Y_CHAN] = bsm.accel->ve[AXIS_Y]; \
|
||||
booz2_max1168_values[IMU_ACCEL_Z_CHAN] = bsm.accel->ve[AXIS_Z]; \
|
||||
booz2_max1168_status = STA_MAX1168_DATA_AVAILABLE; \
|
||||
}
|
||||
extern void booz_imu_feed_gyro_accel(void);
|
||||
extern void booz_imu_feed_mag(void);
|
||||
|
||||
|
||||
#endif /* BOOZ2_IMU_B2_HW_H */
|
||||
|
||||
@@ -23,6 +23,21 @@
|
||||
|
||||
#include "booz_radio_control.h"
|
||||
|
||||
#include "nps_radio_control.h"
|
||||
|
||||
void booz_radio_control_ppm_arch_init ( void ) {
|
||||
|
||||
}
|
||||
|
||||
#define PPM_OF_NPS(_nps, _neutral, _min, _max) \
|
||||
((_nps) >= 0 ? (_neutral) + (_nps) * ((_max)-(_neutral)) : (_neutral) + (_nps) * ((_neutral)- (_min)))
|
||||
|
||||
void booz_radio_control_feed(void) {
|
||||
booz_radio_control_ppm_pulses[RADIO_CONTROL_ROLL] = PPM_OF_NPS(nps_radio_control.roll, 1500, 950, 2050);
|
||||
booz_radio_control_ppm_pulses[RADIO_CONTROL_PITCH] = PPM_OF_NPS(nps_radio_control.pitch, 1500, 2050, 950);
|
||||
booz_radio_control_ppm_pulses[RADIO_CONTROL_YAW] = PPM_OF_NPS(nps_radio_control.yaw, 1500, 2050, 950);
|
||||
booz_radio_control_ppm_pulses[RADIO_CONTROL_THROTTLE] = PPM_OF_NPS(nps_radio_control.throttle, 1223, 1223, 2050);
|
||||
booz_radio_control_ppm_pulses[RADIO_CONTROL_MODE] = PPM_OF_NPS(nps_radio_control.mode, 1500, 2050, 940);
|
||||
booz_radio_control_ppm_frame_available = TRUE;
|
||||
}
|
||||
|
||||
|
||||
@@ -24,6 +24,6 @@
|
||||
#ifndef BOOZ_RADIO_CONTROL_PPM_ARCH_H
|
||||
#define BOOZ_RADIO_CONTROL_PPM_ARCH_H
|
||||
|
||||
|
||||
extern void booz_radio_control_feed(void);
|
||||
|
||||
#endif /* BOOZ_RADIO_CONTROL_PPM_ARCH_H */
|
||||
|
||||
@@ -50,6 +50,25 @@ void booz2_analog_baro_init( void ) {
|
||||
#endif
|
||||
}
|
||||
|
||||
/* decrement offset until adc reading is over a threshold */
|
||||
void booz2_analog_baro_calibrate(void) {
|
||||
if (booz2_analog_baro_value_filtered < 850 && booz2_analog_baro_offset >= 1) {
|
||||
if (booz2_analog_baro_value_filtered == 0)
|
||||
booz2_analog_baro_offset -= 15;
|
||||
else
|
||||
booz2_analog_baro_offset--;
|
||||
Booz2AnalogSetDAC(booz2_analog_baro_offset);
|
||||
#ifdef BOOZ2_ANALOG_BARO_LED
|
||||
LED_TOGGLE(BOOZ2_ANALOG_BARO_LED);
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
booz2_analog_baro_status = BOOZ2_ANALOG_BARO_RUNNING;
|
||||
#ifdef BOOZ2_ANALOG_BARO_LED
|
||||
LED_ON(BOOZ2_ANALOG_BARO_LED);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -40,6 +40,8 @@ extern uint16_t booz2_analog_baro_value;
|
||||
extern uint16_t booz2_analog_baro_value_filtered;
|
||||
extern bool_t booz2_analog_baro_data_available;
|
||||
|
||||
extern void booz2_analog_baro_calibrate(void);
|
||||
|
||||
#define Booz2AnalogBaroEvent(_handler) { \
|
||||
if (booz2_analog_baro_data_available) { \
|
||||
_handler(); \
|
||||
@@ -55,32 +57,12 @@ extern bool_t booz2_analog_baro_data_available;
|
||||
#define Booz2BaroISRHandler(_val) { \
|
||||
booz2_analog_baro_value = _val; \
|
||||
booz2_analog_baro_value_filtered = (3*booz2_analog_baro_value_filtered + booz2_analog_baro_value)/4; \
|
||||
if (booz2_analog_baro_status == BOOZ2_ANALOG_BARO_UNINIT) \
|
||||
Booz2AnalogBaroCalibrate(); \
|
||||
if (booz2_analog_baro_status == BOOZ2_ANALOG_BARO_UNINIT) { \
|
||||
RunOnceEvery(10, { booz2_analog_baro_calibrate();}); \
|
||||
} \
|
||||
/* else */ \
|
||||
booz2_analog_baro_data_available = TRUE; \
|
||||
}
|
||||
}
|
||||
|
||||
/* decrease offset until adc reading is over a threshold */
|
||||
#define Booz2AnalogBaroCalibrate() { \
|
||||
RunOnceEvery(10, { \
|
||||
if (booz2_analog_baro_value_filtered < 850 && booz2_analog_baro_offset >= 1) { \
|
||||
if (booz2_analog_baro_value_filtered == 0) \
|
||||
booz2_analog_baro_offset -= 15; \
|
||||
else \
|
||||
booz2_analog_baro_offset--; \
|
||||
Booz2AnalogSetDAC(booz2_analog_baro_offset); \
|
||||
/* #ifdef BOOZ2_ANALOG_BARO_LED */ \
|
||||
LED_TOGGLE(BOOZ2_ANALOG_BARO_LED); \
|
||||
/* #endif */ \
|
||||
} \
|
||||
else { \
|
||||
booz2_analog_baro_status = BOOZ2_ANALOG_BARO_RUNNING; \
|
||||
/* #ifdef BOOZ2_ANALOG_BARO_LED */ \
|
||||
LED_ON(BOOZ2_ANALOG_BARO_LED); \
|
||||
/* #endif */ \
|
||||
} \
|
||||
}); \
|
||||
} \
|
||||
|
||||
#endif /* BOOZ2_ANALOG_BARO_H */
|
||||
|
||||
@@ -80,6 +80,14 @@
|
||||
|
||||
#ifdef USE_RADIO_CONTROL
|
||||
#define PERIODIC_SEND_RC() DOWNLINK_SEND_RC(RADIO_CONTROL_NB_CHANNEL, radio_control.values)
|
||||
#define PERIODIC_SEND_BOOZ2_RADIO_CONTROL() { \
|
||||
DOWNLINK_SEND_BOOZ2_RADIO_CONTROL(&radio_control.values[RADIO_CONTROL_ROLL], \
|
||||
&radio_control.values[RADIO_CONTROL_PITCH], \
|
||||
&radio_control.values[RADIO_CONTROL_YAW], \
|
||||
&radio_control.values[RADIO_CONTROL_THROTTLE], \
|
||||
&radio_control.values[RADIO_CONTROL_MODE], \
|
||||
&radio_control.status);}
|
||||
|
||||
#else
|
||||
#define PERIODIC_SEND_RC() {}
|
||||
#endif
|
||||
|
||||
@@ -46,11 +46,11 @@
|
||||
#elif defined IMU_B2_MAG_TYPE && IMU_B2_MAG_TYPE == IMU_B2_MAG_AMI601
|
||||
#include "peripherals/booz_ami601.h"
|
||||
#define BoozImuMagEvent(_mag_handler) { \
|
||||
if (booz_ami601_status == STA_AMI601_DATA_AVAILABLE) { \
|
||||
booz_imu.mag_unscaled.x = ami601_values[IMU_MAG_X_CHAN]; \
|
||||
booz_imu.mag_unscaled.y = ami601_values[IMU_MAG_Y_CHAN]; \
|
||||
booz_imu.mag_unscaled.z = ami601_values[IMU_MAG_Z_CHAN]; \
|
||||
booz_ami601_status = STA_AMI601_IDLE; \
|
||||
if (ami601_status == AMI601_DATA_AVAILABLE) { \
|
||||
booz_imu.mag_unscaled.x = ami601_values[IMU_MAG_X_CHAN]; \
|
||||
booz_imu.mag_unscaled.y = ami601_values[IMU_MAG_Y_CHAN]; \
|
||||
booz_imu.mag_unscaled.z = ami601_values[IMU_MAG_Z_CHAN]; \
|
||||
ami601_status = AMI601_IDLE; \
|
||||
_mag_handler(); \
|
||||
} \
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "booz_ami601.h"
|
||||
#include "peripherals/booz_ami601.h"
|
||||
|
||||
uint8_t ami601_foo1;
|
||||
uint8_t ami601_foo2;
|
||||
|
||||
@@ -29,8 +29,8 @@ extern volatile uint32_t ami601_nb_err;
|
||||
|
||||
#ifdef SITL
|
||||
#define AMI601Event(_handler) { \
|
||||
ami601_status = AMI601_DATA_AVAILABLE; \
|
||||
_handler(); \
|
||||
if (ami601_status == AMI601_DATA_AVAILABLE) \
|
||||
_handler(); \
|
||||
}
|
||||
#else
|
||||
#define AMI601Event(_handler) { \
|
||||
|
||||
@@ -3,6 +3,11 @@
|
||||
#include "booz2_main.h"
|
||||
#include "nps_sensors.h"
|
||||
#include "nps_radio_control.h"
|
||||
#include "booz_radio_control.h"
|
||||
#include "booz_imu.h"
|
||||
#include "booz2_analog_baro.h"
|
||||
|
||||
#include "actuators.h"
|
||||
|
||||
struct NpsAutopilot autopilot;
|
||||
|
||||
@@ -15,33 +20,57 @@ void nps_autopilot_init(void) {
|
||||
|
||||
}
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
void nps_autopilot_run_step(double time __attribute__ ((unused))) {
|
||||
|
||||
#if 0
|
||||
if (nps_radio_control_available(time)) {
|
||||
booz2_radio_control_feed();
|
||||
booz_radio_control_feed();
|
||||
booz2_main_event();
|
||||
}
|
||||
#endif
|
||||
|
||||
if (nps_sensors_gyro_available()) {
|
||||
// booz2_imu_feed_data();
|
||||
// booz2_main_event();
|
||||
booz_imu_feed_gyro_accel();
|
||||
booz2_main_event();
|
||||
}
|
||||
|
||||
if (nps_sensors_mag_available()) {
|
||||
// printf("in mag %f %f %f\n", sensors.mag.value.x, sensors.mag.value.y, sensors.mag.value.z);
|
||||
booz_imu_feed_mag();
|
||||
booz2_main_event();
|
||||
}
|
||||
|
||||
if (nps_sensors_baro_available()) {
|
||||
Booz2BaroISRHandler(sensors.baro.value);
|
||||
booz2_main_event();
|
||||
}
|
||||
|
||||
booz2_main_periodic();
|
||||
|
||||
// double hover = 0.25;
|
||||
double hover = 0.2493;
|
||||
// double hover = 0.23;
|
||||
// double hover = 0.;
|
||||
// if (time > 20) hover = 0.25;
|
||||
|
||||
autopilot.commands[SERVO_FRONT] = hover;
|
||||
autopilot.commands[SERVO_BACK] = hover;
|
||||
autopilot.commands[SERVO_RIGHT] = hover;
|
||||
autopilot.commands[SERVO_LEFT] = hover;
|
||||
if (time < 5) {
|
||||
double hover = 0.25;
|
||||
//double hover = 0.2493;
|
||||
// double hover = 0.23;
|
||||
// double hover = 0.;
|
||||
// if (time > 20) hover = 0.25;
|
||||
|
||||
autopilot.commands[SERVO_FRONT] = hover;
|
||||
autopilot.commands[SERVO_BACK] = hover;
|
||||
autopilot.commands[SERVO_RIGHT] = hover;
|
||||
autopilot.commands[SERVO_LEFT] = hover;
|
||||
}
|
||||
else {
|
||||
int32_t ut_front = Actuator(SERVO_FRONT) - TRIM_FRONT;
|
||||
int32_t ut_back = Actuator(SERVO_BACK) - TRIM_BACK;
|
||||
int32_t ut_right = Actuator(SERVO_RIGHT) - TRIM_RIGHT;
|
||||
int32_t ut_left = Actuator(SERVO_LEFT) - TRIM_LEFT;
|
||||
autopilot.commands[SERVO_FRONT] = (double)ut_front / SUPERVISION_MAX_MOTOR;
|
||||
autopilot.commands[SERVO_BACK] = (double)ut_back / SUPERVISION_MAX_MOTOR;
|
||||
autopilot.commands[SERVO_RIGHT] = (double)ut_right / SUPERVISION_MAX_MOTOR;
|
||||
autopilot.commands[SERVO_LEFT] = (double)ut_left / SUPERVISION_MAX_MOTOR;
|
||||
}
|
||||
printf("%f %f %f %f\n", autopilot.commands[SERVO_FRONT], autopilot.commands[SERVO_BACK],
|
||||
autopilot.commands[SERVO_RIGHT], autopilot.commands[SERVO_LEFT]);
|
||||
|
||||
}
|
||||
|
||||
@@ -119,7 +119,7 @@ static void test123(LlaCoor_d* fdm_lla, FGPropagate* propagate) {
|
||||
fdm_lla->lat = propagate->GetLatitude();
|
||||
fdm_lla->lon = propagate->GetLongitude();
|
||||
// FIXME
|
||||
// fdm_lla->alt = MetersOfFeet(propagate->Geth());
|
||||
fdm_lla->alt = MetersOfFeet(propagate->GetDistanceAGL());
|
||||
|
||||
}
|
||||
|
||||
@@ -176,6 +176,15 @@ static void init_ltp(void) {
|
||||
ltp_def_from_ecef_d(<pdef_d,&fdm.ecef_pos);
|
||||
ltpdef_copy(<pdef, <pdef_d);
|
||||
|
||||
fdm.ltp_g.x = 0.;
|
||||
fdm.ltp_g.y = 0.;
|
||||
fdm.ltp_g.z = 9.81;
|
||||
|
||||
fdm.ltp_h.x = 1.;
|
||||
fdm.ltp_h.y = 0.;
|
||||
fdm.ltp_h.z = 1.;
|
||||
|
||||
|
||||
}
|
||||
|
||||
static void jsbsimloc_to_loc(EcefCoor_d* fdm_location, FGLocation* jsb_location){
|
||||
|
||||
+19
-3
@@ -9,18 +9,34 @@
|
||||
#include "nps_autopilot.h"
|
||||
#include "nps_fdm.h"
|
||||
|
||||
static void on_DL_SETTING(IvyClientPtr app __attribute__ ((unused)),
|
||||
void *user_data __attribute__ ((unused)),
|
||||
int argc __attribute__ ((unused)), char *argv[]);
|
||||
|
||||
extern void nps_ivy_init(void) {
|
||||
void nps_ivy_init(void) {
|
||||
const char* agent_name = AIRFRAME_NAME"_NPS";
|
||||
const char* ready_msg = AIRFRAME_NAME"_NPS Ready";
|
||||
IvyInit(agent_name, ready_msg, NULL, NULL, NULL, NULL);
|
||||
//IvyBindMsg(on_DL_SETTING, NULL, "^(\\S*) DL_SETTING (\\S*) (\\S*) (\\S*)");
|
||||
IvyBindMsg(on_DL_SETTING, NULL, "^(\\S*) DL_SETTING (\\S*) (\\S*) (\\S*)");
|
||||
//IvyBindMsg(on_DL_BLOCK, NULL, "^(\\S*) BLOCK (\\S*) (\\S*)");
|
||||
//IvyBindMsg(on_DL_MOVE_WP, NULL, "^(\\S*) MOVE_WP (\\S*) (\\S*) (\\S*) (\\S*) (\\S*)");
|
||||
IvyStart("127.255.255.255");
|
||||
}
|
||||
|
||||
extern void nps_ivy_display(void) {
|
||||
#include "settings.h"
|
||||
#include "dl_protocol.h"
|
||||
#include "downlink.h"
|
||||
static void on_DL_SETTING(IvyClientPtr app __attribute__ ((unused)),
|
||||
void *user_data __attribute__ ((unused)),
|
||||
int argc __attribute__ ((unused)), char *argv[]) {
|
||||
uint8_t index = atoi(argv[2]);
|
||||
float value = atof(argv[3]);
|
||||
DlSetting(index, value);
|
||||
DOWNLINK_SEND_DL_VALUE(&index, &value);
|
||||
printf("setting %d %f\n", index, value);
|
||||
}
|
||||
|
||||
void nps_ivy_display(void) {
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,95 +0,0 @@
|
||||
#include "nps_jsbsim.h"
|
||||
|
||||
#include <FGState.h>
|
||||
#include <math/FGColumnVector3.h>
|
||||
#include <math/FGMatrix33.h>
|
||||
#include <math/FGQuaternion.h>
|
||||
|
||||
static void cp_fgvec_to_vec(JSBSim::FGColumnVector3 jsbvec, VEC* vec);
|
||||
static void cp_fgquat_to_quat(JSBSim::FGQuaternion jsbquat, VEC* quat);
|
||||
|
||||
static void cp_fgvec_to_vec(JSBSim::FGColumnVector3 jsbvec, VEC* vec) {
|
||||
while(int i=0 < 3) {vec->ve[i] = jsbvec.Entry(i); }
|
||||
}
|
||||
|
||||
static void cp_fgquat_to_quat(JSBSim::FGQuaternion jsbquat, VEC* quat) {
|
||||
while(int i=0 < 4) {quat->ve[i] = jsbquat.Entry(i); }
|
||||
}
|
||||
|
||||
int JSBInit(double sim_dt) {
|
||||
|
||||
bool result = false;
|
||||
|
||||
JSBSim::FGFDMExec* fdmex;
|
||||
fdmex = new JSBSim::FGFDMExec();
|
||||
|
||||
fdmex->DisableOutput();
|
||||
fdmex->SetDebugLevel(0);
|
||||
|
||||
JSBSim::FGState State(fdmex);
|
||||
State.Setdt(sim_dt);
|
||||
|
||||
if ( ! fdmex->LoadModel( RootDir + "aircraft",
|
||||
RootDir + "engine",
|
||||
RootDir + "systems",
|
||||
AircraftName,
|
||||
1)) {
|
||||
cerr << "JSBSim could not load model" << endl << endl;
|
||||
delete fdmex;
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
JSBSim::FGInitialCondition* IC = fdmex->GetIC();
|
||||
if ( ! IC->Load(ResetName)) {
|
||||
delete fdmex;
|
||||
cerr << "JSBSim could not initialize state" << endl;
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
result = fdmex->RunIC();
|
||||
return(result);
|
||||
|
||||
}
|
||||
|
||||
void nps_jsbsim_feed_inputs(JSBSim::FGFDMExec* fdmex, struct NpsFdmState* fdm_state) {
|
||||
|
||||
fdmex->SetPropertyValue("/fdm/jsbsim/fcs/control_force", fdm_state->vehicle.dummy.f_input);
|
||||
|
||||
}
|
||||
|
||||
void nps_jsbsim_fetch_state(JSBSim::FGFDMExec* fdmex, struct NpsFdmState* fdm_state) {
|
||||
|
||||
double radius;
|
||||
double lon;
|
||||
double lat;
|
||||
|
||||
radius = FT2M*(fdmex->GetPropagate()->GetRadius()); // meters
|
||||
lon = fdmex->GetPropagate()->GetLongitude(); // radians
|
||||
lat = fdmex->GetPropagate()->GetLatitude(); // radians
|
||||
|
||||
JSBSim::FGColumnVector3 ecef_pos (radius*cos(lon)*cos(lat),
|
||||
radius*sin(lon)*cos(lat),radius*sin(lat));
|
||||
|
||||
JSBSim::FGColumnVector3 bdy_vel;
|
||||
JSBSim::FGColumnVector3 bdy_accel;
|
||||
JSBSim::FGMatrix33 Tb2ec;
|
||||
JSBSim::FGColumnVector3 ecef_vel;
|
||||
JSBSim::FGColumnVector3 ecef_accel;
|
||||
|
||||
bdy_vel = fdmex->GetPropagate()->GetUVW();
|
||||
bdy_accel = fdmex->GetPropagate()->GetUVWdot();
|
||||
Tb2ec = fdmex->GetPropagate()->GetTb2ec();
|
||||
|
||||
ecef_vel = (Tb2ec*bdy_vel)*FT2M;
|
||||
ecef_accel = (Tb2ec*bdy_accel)*FT2M;
|
||||
|
||||
fdm_state->on_ground = fdmex->GetPropertyValue("gear/unit[0]/WOW");
|
||||
|
||||
cp_fgvec_to_vec(ecef_pos, fdm_state->ecef_pos);
|
||||
cp_fgvec_to_vec(ecef_vel, fdm_state->ecef_vel);
|
||||
cp_fgvec_to_vec(ecef_accel, fdm_state->ecef_accel);
|
||||
|
||||
cp_fgquat_to_quat(fdmex->GetPropagate()->GetQuaternion(), fdm_state->ltp_to_body_quat);
|
||||
cp_fgvec_to_vec(fdmex->GetPropagate()->GetPQR(), fdm_state->ltp_body_rate);
|
||||
cp_fgvec_to_vec(fdmex->GetPropagate()->GetPQRdot(), fdm_state->ltp_body_accel);
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
#ifndef NPS_JSBSIM_H
|
||||
#define NPS_JSBSIM_H
|
||||
|
||||
#include <FGFDMExec.h>
|
||||
#include "nps_fdm.h"
|
||||
|
||||
extern void nps_jsbsim_feed_inputs(JSBSim::FGFDMExec* fdmex, struct NpsFdmState* fdm_state);
|
||||
extern void nps_jsbsim_fetch_state(JSBSim::FGFDMExec* fdmex, struct NpsFdmState* fdm_state);
|
||||
extern int JSBInit(double sim_dt);
|
||||
|
||||
#endif /* NPS_JSBSIM_H */
|
||||
|
||||
@@ -8,15 +8,37 @@ void nps_radio_control_init(void) {
|
||||
nps_radio_control.next_update = 0.;
|
||||
}
|
||||
|
||||
#define MODE_SWITCH_MANUAL -1.0
|
||||
#define MODE_SWITCH_AUTO1 0.0
|
||||
#define MODE_SWITCH_AUTO2 1.0
|
||||
|
||||
void nps_radio_control_run_script(double time) {
|
||||
nps_radio_control.roll = 0.;
|
||||
nps_radio_control.pitch = 0.;
|
||||
/* starts motors */
|
||||
if (time < 1.) {
|
||||
nps_radio_control.yaw = 1.;
|
||||
nps_radio_control.throttle = 0.;
|
||||
nps_radio_control.mode = MODE_SWITCH_MANUAL;
|
||||
}
|
||||
else if (time < 3.5) {
|
||||
nps_radio_control.yaw = 0.;
|
||||
nps_radio_control.throttle = 0.;
|
||||
nps_radio_control.mode = MODE_SWITCH_MANUAL;
|
||||
}
|
||||
else {
|
||||
nps_radio_control.yaw = 0.;
|
||||
// nps_radio_control.throttle = 0.99;
|
||||
// nps_radio_control.mode = MODE_SWITCH_AUTO2;
|
||||
nps_radio_control.throttle = 0.265;
|
||||
nps_radio_control.mode = MODE_SWITCH_MANUAL;
|
||||
}
|
||||
}
|
||||
|
||||
bool_t nps_radio_control_available(double time) {
|
||||
if (time >= nps_radio_control.next_update) {
|
||||
nps_radio_control.next_update += RADIO_CONTROL_DT;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
nps_radio_control_run_script(time);
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
|
||||
@@ -21,6 +21,7 @@ void nps_sensor_accel_init(struct NpsSensorAccel* accel, double time) {
|
||||
accel->data_available = FALSE;
|
||||
}
|
||||
|
||||
//#include <stdio.h>
|
||||
|
||||
void nps_sensor_accel_run_step(struct NpsSensorAccel* accel, double time, struct DoubleRMat* body_to_imu) {
|
||||
|
||||
@@ -30,18 +31,23 @@ void nps_sensor_accel_run_step(struct NpsSensorAccel* accel, double time, stru
|
||||
/* transform gravity to body frame */
|
||||
struct DoubleVect3 g_body;
|
||||
FLOAT_QUAT_VMULT(g_body, fdm.ltp_to_body_quat, fdm.ltp_g);
|
||||
// printf(" g_body %f %f %f\n", g_body.x, g_body.y, g_body.z);
|
||||
|
||||
// printf(" accel_fdm %f %f %f\n", fdm.body_ecef_accel.x, fdm.body_ecef_accel.y, fdm.body_ecef_accel.z);
|
||||
|
||||
/* substract gravity to acceleration in body frame */
|
||||
struct DoubleVect3 accelero_body;
|
||||
FLOAT_VECT3_DIFF(accelero_body, fdm.body_ecef_accel, g_body);
|
||||
|
||||
|
||||
// printf(" accelero body %f %f %f\n", accelero_body.x, accelero_body.y, accelero_body.z);
|
||||
|
||||
/* transform to imu frame */
|
||||
struct DoubleVect3 accelero_imu;
|
||||
MAT33_VECT3_MUL(accelero_imu, *body_to_imu, accelero_body );
|
||||
|
||||
/* compute accelero readings */
|
||||
MAT33_VECT3_MUL(accel->value, accel->sensitivity, accelero_imu);
|
||||
|
||||
VECT3_ADD(accel->value, accel->neutral);
|
||||
/* Compute sensor error */
|
||||
struct DoubleVect3 accelero_error;
|
||||
/* constant bias */
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
#include "nps_sensor_baro.h"
|
||||
|
||||
#include "airframe.h"
|
||||
|
||||
#include "std.h"
|
||||
#include "nps_fdm.h"
|
||||
#include "nps_random.h"
|
||||
#include NPS_SENSORS_PARAMS
|
||||
|
||||
|
||||
|
||||
void nps_sensor_baro_init(struct NpsSensorBaro* baro, double time) {
|
||||
baro->value = 0.;
|
||||
baro->next_update = time;
|
||||
@@ -17,13 +21,14 @@ void nps_sensor_baro_run_step(struct NpsSensorBaro* baro, double time) {
|
||||
if (time < baro->next_update)
|
||||
return;
|
||||
|
||||
if (time < 12.5)
|
||||
baro->value = 840;
|
||||
if (time < 10.)
|
||||
baro->value = rint(time*90);
|
||||
else {
|
||||
double z = fdm.ltpprz_pos.z + get_gaussian_noise()*NPS_BARO_NOISE_STD_DEV;
|
||||
double baro_reading = NPS_BARO_QNH + z * NPS_BARO_SENSITIVITY;
|
||||
baro_reading = rint(baro_reading);
|
||||
baro->value = baro_reading;
|
||||
Bound(baro->value, 0, 1024);
|
||||
}
|
||||
|
||||
baro->next_update += NPS_BARO_DT;
|
||||
|
||||
@@ -35,6 +35,7 @@ void nps_sensor_gyro_run_step(struct NpsSensorGyro* gyro, double time, struct Do
|
||||
MAT33_VECT3_MUL(rate_imu, *body_to_imu, *rate_body );
|
||||
/* compute gyros readings */
|
||||
MAT33_VECT3_MUL(gyro->value, gyro->sensitivity, rate_imu);
|
||||
VECT3_ADD(gyro->value, gyro->neutral);
|
||||
/* compute gyro error readings */
|
||||
|
||||
/* round signal to account for adc discretisation */
|
||||
|
||||
@@ -39,7 +39,7 @@ void nps_sensor_mag_run_step(struct NpsSensorMag* mag, double time, struct Doubl
|
||||
|
||||
/* compute magnetometer reading */
|
||||
MAT33_VECT3_MUL(mag->value, mag->sensitivity, h_sensor);
|
||||
|
||||
VECT3_ADD(mag->value, mag->neutral);
|
||||
/* FIXME: ADD error reading */
|
||||
|
||||
/* round signal to account for adc discretisation */
|
||||
|
||||
Reference in New Issue
Block a user