mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-30 19:47:50 +08:00
PX4FLOW fixes in the state machine
This commit is contained in:
@@ -5,7 +5,7 @@
|
|||||||
<description>PX4FLOW optical flow sensor connected over i2c bus</description>
|
<description>PX4FLOW optical flow sensor connected over i2c bus</description>
|
||||||
<configure name="PX4FLOW_I2C_DEV" value="i2c2" description="I2C device to use for px4flow"/>
|
<configure name="PX4FLOW_I2C_DEV" value="i2c2" description="I2C device to use for px4flow"/>
|
||||||
<configure name="PX4FLOW_I2C_ADDR" value="0x84" description="slave address of px4flow"/>
|
<configure name="PX4FLOW_I2C_ADDR" value="0x84" description="slave address of px4flow"/>
|
||||||
<configure name="REQUEST_INT_FRAME" value="0" description="request i2c_integral_frame"/>
|
<configure name="REQUEST_INT_FRAME" value="1" description="request i2c_integral_frame, default TRUE"/>
|
||||||
<configure name="PX4FLOW_NOISE_STDDEV" value="1.0" description="standard deviation of the flow measurement (if known)"/>
|
<configure name="PX4FLOW_NOISE_STDDEV" value="1.0" description="standard deviation of the flow measurement (if known)"/>
|
||||||
<configure name="USE_PX4FLOW_AGL" value="1" description="update AGL measurements from onboard sonar"/>
|
<configure name="USE_PX4FLOW_AGL" value="1" description="update AGL measurements from onboard sonar"/>
|
||||||
<configure name="PX4FLOW_COMPENSATE_ROTATION" value="1" description="compensate AGL measurements for body rotation"/>
|
<configure name="PX4FLOW_COMPENSATE_ROTATION" value="1" description="compensate AGL measurements for body rotation"/>
|
||||||
@@ -26,11 +26,11 @@
|
|||||||
</header>
|
</header>
|
||||||
<init fun="px4flow_i2c_init()"/>
|
<init fun="px4flow_i2c_init()"/>
|
||||||
<periodic fun="px4flow_i2c_downlink()" freq="4" autorun="FALSE"/> <!-- for debug -->
|
<periodic fun="px4flow_i2c_downlink()" freq="4" autorun="FALSE"/> <!-- for debug -->
|
||||||
<periodic fun="px4flow_i2c_periodic()" freq="50"/> <!-- poll px4flow for data, max 150Hz -->
|
<periodic fun="px4flow_i2c_periodic()" freq="50"/> <!-- poll px4flow for data, see https://pixhawk.org/modules/px4flow for details -->
|
||||||
<makefile>
|
<makefile>
|
||||||
<configure name="PX4FLOW_I2C_DEV" default="i2c1" case="lower|upper"/>
|
<configure name="PX4FLOW_I2C_DEV" default="i2c1" case="lower|upper"/>
|
||||||
<configure name="PX4FLOW_I2C_ADDR" default="0x84"/> <!-- 0x42 + additional zero at the end to make 8 bit address -->
|
<configure name="PX4FLOW_I2C_ADDR" default="0x84"/> <!-- 0x42 + additional zero at the end to make 8 bit address -->
|
||||||
<configure name="REQUEST_INT_FRAME" default="0"/>
|
<configure name="REQUEST_INT_FRAME" default="1"/>
|
||||||
<configure name="PX4FLOW_NOISE_STDDEV" default="1.0"/>
|
<configure name="PX4FLOW_NOISE_STDDEV" default="1.0"/>
|
||||||
<configure name="USE_PX4FLOW_AGL" default="1"/>
|
<configure name="USE_PX4FLOW_AGL" default="1"/>
|
||||||
<configure name="PX4FLOW_COMPENSATE_ROTATION" default="1"/>
|
<configure name="PX4FLOW_COMPENSATE_ROTATION" default="1"/>
|
||||||
|
|||||||
@@ -57,6 +57,7 @@ struct MedianFilterInt sonar_filter;
|
|||||||
#define PX4FLOW_I2C_INTEGRAL_FRAME 0x16
|
#define PX4FLOW_I2C_INTEGRAL_FRAME 0x16
|
||||||
#define PX4FLOW_I2C_FRAME_LENGTH 22
|
#define PX4FLOW_I2C_FRAME_LENGTH 22
|
||||||
#define PX4FLOW_I2C_INTEGRAL_FRAME_LENGTH 25
|
#define PX4FLOW_I2C_INTEGRAL_FRAME_LENGTH 25
|
||||||
|
#define PX4FLOW_I2C_ID 0x4D
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Propagate optical flow information
|
* Propagate optical flow information
|
||||||
@@ -114,6 +115,16 @@ static inline void px4flow_i2c_frame_cb(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Propagate itegral frame
|
||||||
|
*/
|
||||||
|
static inline void px4flow_i2c_int_frame_cb(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialization function
|
* Initialization function
|
||||||
*/
|
*/
|
||||||
@@ -121,7 +132,11 @@ void px4flow_i2c_init(void)
|
|||||||
{
|
{
|
||||||
px4flow.trans.status = I2CTransDone;
|
px4flow.trans.status = I2CTransDone;
|
||||||
px4flow.addr = PX4FLOW_I2C_ADDR;
|
px4flow.addr = PX4FLOW_I2C_ADDR;
|
||||||
|
#if REQUEST_INT_FRAME
|
||||||
|
px4flow.status = PX4FLOW_INT_FRAME_REQ;
|
||||||
|
#else
|
||||||
px4flow.status = PX4FLOW_FRAME_REQ;
|
px4flow.status = PX4FLOW_FRAME_REQ;
|
||||||
|
#endif
|
||||||
px4flow.update_agl = USE_PX4FLOW_AGL;
|
px4flow.update_agl = USE_PX4FLOW_AGL;
|
||||||
px4flow.compensate_rotation = PX4FLOW_COMPENSATE_ROTATION;
|
px4flow.compensate_rotation = PX4FLOW_COMPENSATE_ROTATION;
|
||||||
px4flow.stddev = PX4FLOW_NOISE_STDDEV;
|
px4flow.stddev = PX4FLOW_NOISE_STDDEV;
|
||||||
@@ -174,27 +189,30 @@ void px4flow_i2c_periodic(void)
|
|||||||
idx += sizeof(uint8_t);
|
idx += sizeof(uint8_t);
|
||||||
px4flow.i2c_frame.ground_distance = (px4flow.trans.buf[idx + 1] << 8 | px4flow.trans.buf[idx]);
|
px4flow.i2c_frame.ground_distance = (px4flow.trans.buf[idx + 1] << 8 | px4flow.trans.buf[idx]);
|
||||||
|
|
||||||
// send ABI messages
|
// propagate measurements
|
||||||
px4flow_i2c_frame_cb();
|
px4flow_i2c_frame_cb();
|
||||||
}
|
}
|
||||||
// increment status
|
// increment status
|
||||||
#if REQUEST_INT_FRAME
|
|
||||||
// ask for the integral frame
|
|
||||||
px4flow.status = PX4FLOW_INT_FRAME_REQ;
|
|
||||||
#else
|
|
||||||
// ask for regular frame again
|
// ask for regular frame again
|
||||||
px4flow.status = PX4FLOW_FRAME_REQ;
|
px4flow.status = PX4FLOW_FRAME_REQ;
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
case PX4FLOW_INT_FRAME_REQ:
|
case PX4FLOW_INT_FRAME_REQ:
|
||||||
// ask for integral frame
|
// Send the command to begin a measurement.
|
||||||
px4flow.trans.buf[0] = PX4FLOW_I2C_INTEGRAL_FRAME;
|
px4flow.trans.buf[0] = PX4FLOW_I2C_INTEGRAL_FRAME;
|
||||||
if (i2c_transceive(&PX4FLOW_I2C_DEV, &px4flow.trans, px4flow.addr, 1, PX4FLOW_I2C_INTEGRAL_FRAME_LENGTH)) {
|
if (i2c_transmit(&PX4FLOW_I2C_DEV, &px4flow.trans, px4flow.addr, 1)) {
|
||||||
// transaction OK, increment status
|
// transaction OK, increment status
|
||||||
px4flow.status = PX4FLOW_INT_FRAME_REC;
|
px4flow.status = PX4FLOW_INT_FRAME_REC;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case PX4FLOW_INT_FRAME_REC:
|
case PX4FLOW_INT_FRAME_REC:
|
||||||
|
// ask for integral frame
|
||||||
|
px4flow.trans.buf[0] = PX4FLOW_I2C_INTEGRAL_FRAME;
|
||||||
|
if (i2c_transceive(&PX4FLOW_I2C_DEV, &px4flow.trans, px4flow.addr, 1, PX4FLOW_I2C_INTEGRAL_FRAME_LENGTH)) {
|
||||||
|
// transaction OK, increment status
|
||||||
|
px4flow.status = PX4FLOW_INT_FRAME_REC_OK;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PX4FLOW_INT_FRAME_REC_OK:
|
||||||
// check if the transaction was successful
|
// check if the transaction was successful
|
||||||
if (px4flow.trans.status == I2CTransSuccess) {
|
if (px4flow.trans.status == I2CTransSuccess) {
|
||||||
// retrieve data
|
// retrieve data
|
||||||
@@ -221,10 +239,13 @@ void px4flow_i2c_periodic(void)
|
|||||||
idx += sizeof(int16_t);
|
idx += sizeof(int16_t);
|
||||||
px4flow.i2c_int_frame.gyro_temperature = (px4flow.trans.buf[idx + 1] << 8 | px4flow.trans.buf[idx]);
|
px4flow.i2c_int_frame.gyro_temperature = (px4flow.trans.buf[idx + 1] << 8 | px4flow.trans.buf[idx]);
|
||||||
idx += sizeof(int16_t);
|
idx += sizeof(int16_t);
|
||||||
px4flow.i2c_int_frame.quality = px4flow.trans.buf[idx];
|
px4flow.i2c_int_frame.qual = px4flow.trans.buf[idx];
|
||||||
|
|
||||||
|
// propagate measurements
|
||||||
|
px4flow_i2c_int_frame_cb();
|
||||||
}
|
}
|
||||||
// increment status
|
// increment status
|
||||||
px4flow.status = PX4FLOW_FRAME_REQ;
|
px4flow.status = PX4FLOW_INT_FRAME_REQ;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -240,10 +261,20 @@ void px4flow_i2c_periodic(void)
|
|||||||
void px4flow_i2c_downlink(void)
|
void px4flow_i2c_downlink(void)
|
||||||
{
|
{
|
||||||
// Convert i2c_frame into PX4FLOW message
|
// Convert i2c_frame into PX4FLOW message
|
||||||
uint8_t id = 0;
|
uint8_t id = PX4FLOW_I2C_ID;
|
||||||
|
|
||||||
float timestamp = get_sys_time_float();
|
float timestamp = get_sys_time_float();
|
||||||
|
|
||||||
|
#if REQUEST_INT_FRAME
|
||||||
|
int16_t flow_x = px4flow.i2c_int_frame.pixel_flow_x_integral;
|
||||||
|
int16_t flow_y = px4flow.i2c_int_frame.pixel_flow_y_integral;
|
||||||
|
|
||||||
|
float flow_comp_m_x = 0.0;
|
||||||
|
float flow_comp_m_y = 0.0;
|
||||||
|
|
||||||
|
uint8_t quality = px4flow.i2c_int_frame.qual;
|
||||||
|
float ground_distance = ((float)px4flow.i2c_int_frame.ground_distance) / 1000.0;
|
||||||
|
#else
|
||||||
int16_t flow_x = px4flow.i2c_frame.pixel_flow_x_sum;
|
int16_t flow_x = px4flow.i2c_frame.pixel_flow_x_sum;
|
||||||
int16_t flow_y = px4flow.i2c_frame.pixel_flow_y_sum;
|
int16_t flow_y = px4flow.i2c_frame.pixel_flow_y_sum;
|
||||||
|
|
||||||
@@ -252,6 +283,7 @@ void px4flow_i2c_downlink(void)
|
|||||||
|
|
||||||
uint8_t quality = px4flow.i2c_frame.qual;
|
uint8_t quality = px4flow.i2c_frame.qual;
|
||||||
float ground_distance = ((float)px4flow.i2c_frame.ground_distance) / 1000.0;
|
float ground_distance = ((float)px4flow.i2c_frame.ground_distance) / 1000.0;
|
||||||
|
#endif
|
||||||
|
|
||||||
DOWNLINK_SEND_PX4FLOW(DefaultChannel, DefaultDevice,
|
DOWNLINK_SEND_PX4FLOW(DefaultChannel, DefaultDevice,
|
||||||
×tamp,
|
×tamp,
|
||||||
|
|||||||
@@ -37,7 +37,8 @@ enum Px4FlowStatus {
|
|||||||
PX4FLOW_FRAME_REQ,
|
PX4FLOW_FRAME_REQ,
|
||||||
PX4FLOW_FRAME_REC,
|
PX4FLOW_FRAME_REC,
|
||||||
PX4FLOW_INT_FRAME_REQ,
|
PX4FLOW_INT_FRAME_REQ,
|
||||||
PX4FLOW_INT_FRAME_REC
|
PX4FLOW_INT_FRAME_REC,
|
||||||
|
PX4FLOW_INT_FRAME_REC_OK
|
||||||
};
|
};
|
||||||
|
|
||||||
struct px4flow_i2c_frame
|
struct px4flow_i2c_frame
|
||||||
@@ -68,7 +69,7 @@ struct px4flow_i2c_integral_frame
|
|||||||
uint32_t sonar_timestamp;// time since last sonar update [microseconds]
|
uint32_t sonar_timestamp;// time since last sonar update [microseconds]
|
||||||
int16_t ground_distance;// Ground distance in meters*1000 [meters*1000]
|
int16_t ground_distance;// Ground distance in meters*1000 [meters*1000]
|
||||||
int16_t gyro_temperature;// Temperature * 100 in centi-degrees Celsius [degcelsius*100]
|
int16_t gyro_temperature;// Temperature * 100 in centi-degrees Celsius [degcelsius*100]
|
||||||
uint8_t quality;// averaged quality of accumulated flow values [0:bad quality;255: max quality]
|
uint8_t qual;// averaged quality of accumulated flow values [0:bad quality;255: max quality]
|
||||||
};
|
};
|
||||||
|
|
||||||
struct px4flow_data
|
struct px4flow_data
|
||||||
@@ -88,7 +89,7 @@ extern struct px4flow_data px4flow;
|
|||||||
extern void px4flow_i2c_init(void);
|
extern void px4flow_i2c_init(void);
|
||||||
extern void px4flow_i2c_periodic(void);
|
extern void px4flow_i2c_periodic(void);
|
||||||
extern void px4flow_i2c_downlink(void);
|
extern void px4flow_i2c_downlink(void);
|
||||||
extern void px4flow_i2c_event(void);
|
|
||||||
|
|
||||||
#endif /* PX4FLOW_I2C_H */
|
#endif /* PX4FLOW_I2C_H */
|
||||||
|
|
||||||
|
|||||||
@@ -115,6 +115,10 @@
|
|||||||
#define AGL_LIDAR_LITE_ID 6
|
#define AGL_LIDAR_LITE_ID 6
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef AGL_PX4FLOW_ID
|
||||||
|
#define AGL_PX4FLOW_ID 7
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* IDs of magnetometer sensors (including IMUs with mag)
|
* IDs of magnetometer sensors (including IMUs with mag)
|
||||||
*/
|
*/
|
||||||
@@ -257,11 +261,11 @@
|
|||||||
#define PX4FLOW_VELOCITY_ID 17
|
#define PX4FLOW_VELOCITY_ID 17
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef IMU_PX4
|
#ifndef IMU_PX4_ID
|
||||||
#define IMU_PX4_ID 18
|
#define IMU_PX4_ID 18
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef IMU_VECTORNAV
|
#ifndef IMU_VECTORNAV_ID
|
||||||
#define IMU_VECTORNAV_ID 19
|
#define IMU_VECTORNAV_ID 19
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user