ArduPilot开源代码之AP_DAL研读系列
- 1. 源由
- 2. 框架设计
- 3. 设备实例
- 4. 其他函数
-
- 4.1 辅助函数
-
- 4.1.1 构造函数
- 4.1.2 获取对象实例
- 4.1.3 时间函数
- 4.1.4 ekf_low_time_remaining
- 4.1.5 get_armed
- 4.1.6 available_memory
- 4.1.7 get_ekf_type
- 4.1.8 snprintf
- 4.1.9 malloc_type
- 4.1.10 get_EAS2TAS
- 4.1.11 get_vehicle_class
- 4.1.12 get_fly_forward
- 4.1.13 get_takeoff_expected
- 4.1.14 get_touchdown_expected
- 4.1.15 set_takeoff_expected
- 4.1.16 get_trim
- 4.1.17 get_rotation_vehicle_body_to_autopilot_body
- 4.1.18 get_home
- 4.1.19 get_time_flying_ms
- 4.1.20 opticalflow_enabled
- 4.1.21 wheelencoder_enabled
- 4.2 重要函数
- 4.3 日志函数
- 5. 总结
- 6. 参考资料
1. 源由
AP_DAL
作为NavEKF3_core
的成员变量,在深入研读NavEKF3_core
之前,有必要先明确或者搞清楚该类的作用。
首先,What does DAL in AP_DAL mean?
从字面意思分析,感觉像是API接口封装。主要涉及以下传感器对外的统一接口:
- AP_DAL_InertialSensor
- AP_DAL_Baro
- AP_DAL_GPS
- AP_DAL_RangeFinder
- AP_DAL_Compass
- AP_DAL_Airspeed
- AP_DAL_Beacon
- AP_DAL_VisualOdom
AP_DAL
整合上述设备对象,做一个整合后,统一对外提供API服务,或者说为NavEKF3_core
提供服务。
2. 框架设计
AP_DAL
类通过枚举类型、成员变量和方法提供了对飞行控制数据抽象的封装和管理。它允许记录不同类型的事件和传感器数据,管理不同类型的传感器对象,并提供了单例访问方式以及消息处理的接口。这种设计有助于保持代码的结构化和可维护性,同时提供了对底层硬件和传感器的抽象接口。
2.1 枚举类型
-
FrameType
- 枚举了不同的帧类型,用于标识不同的操作或日志记录。具体的枚举值包括
InitialiseFilterEKF2
、UpdateFilterEKF2
、InitialiseFilterEKF3
、UpdateFilterEKF3
、LogWriteEKF2
和LogWriteEKF3
。
- 枚举了不同的帧类型,用于标识不同的操作或日志记录。具体的枚举值包括
-
Event
- 定义了各种事件,每个事件用一个唯一的枚举值来标识。例如
resetGyroBias
、resetHeightDatum
、setTerrainHgtStable
等等。
- 定义了各种事件,每个事件用一个唯一的枚举值来标识。例如
-
VehicleClass
- 标识了不同的车辆类别,包括
UNKNOWN
、GROUND
、COPTER
、FIXED_WING
和SUBMARINE
。
- 标识了不同的车辆类别,包括
-
StateMask
- 定义了一个状态掩码,目前只包含
ARMED
。
- 定义了一个状态掩码,目前只包含
-
EKFType
- 用于标识不同的扩展卡尔曼滤波器(EKF)类型,包括
EKF2
和EKF3
。
- 用于标识不同的扩展卡尔曼滤波器(EKF)类型,包括
2.2 成员变量
- 静态指针
_singleton
:用于保存类的单例实例。 - 日志和传感器结构体:包括
_RFRH
、_RFRF
、_RFRN
等,用于存储不同类型的日志数据或传感器信息。 - 各种传感器对象:包括
_ins
、_baro
、_gps
、_compass
等,用于访问与传感器相关的功能。
2.3 方法
- 构造函数和单例获取方法:构造函数初始化对象,单例方法
get_singleton()
用于获取类的唯一实例。 - 日志记录方法:包括
log_event2
、log_SetOriginLLH2
、log_event3
等,用于记录不同类型的事件或传感器数据。 - 状态获取方法:包括
get_armed
、get_ekf_type
、get_vehicle_class
等,用于获取状态或配置信息。 - 消息处理方法:一系列的
handle_message
方法,用于处理不同类型的传感器数据或日志消息。
2.4 其他特性
- 条件编译:在一些方法中使用了条件编译,根据编译器定义的配置选择不同的实现或参数。
3. 设备实例
3.1 IMU
3.1.1 ins
AP_DAL_InertialSensor &ins() {
return _ins; }
3.1.2 handle_message
void handle_message(const log_RISH &msg) {
_ins.handle_message(msg);
}
void handle_message(const log_RISI &msg) {
_ins.handle_message(msg);
}
3.2 气压计
3.2.1 baro
AP_DAL_Baro &baro() {
return _baro; }
3.2.2 handle_message
void handle_message(const log_RBRH &msg) {
_baro.handle_message(msg);
}
void handle_message(const log_RBRI &msg) {
_baro.handle_message(msg);
}
3.3 磁力计
3.3.1 compass
AP_DAL_Compass &compass() {
return _compass; }
3.3.2 handle_message
void handle_message(const log_RMGH &msg) {
_compass.handle_message(msg);
}
void handle_message(const log_RMGI &msg) {
_compass.handle_message(msg);
}
3.4 GPS
3.4.1 gps
AP_DAL_GPS &gps() {
return _gps; }
3.4.2 handle_message
void handle_message(const log_RGPH &msg) {
_gps.handle_message(msg);
}
void handle_message(const log_RGPI &msg) {
_gps.handle_message(msg);
}
void handle_message(const log_RGPJ &msg) {
_gps.handle_message(msg);
}
3.5 测距仪
3.5.1 rangefinder
#if AP_RANGEFINDER_ENABLED
AP_DAL_RangeFinder *rangefinder() {
return _rangefinder;
}
#endif
3.5.2 handle_message
void handle_message(const log_RRNH &msg) {
#if AP_RANGEFINDER_ENABLED
if (_rangefinder == nullptr) {
_rangefinder = NEW_NOTHROW AP_DAL_RangeFinder;
}
_rangefinder->handle_message(msg);
#endif
}
void handle_message(const log_RRNI &msg) {
#if AP_RANGEFINDER_ENABLED
if (_rangefinder == nullptr) {
_rangefinder = NEW_NOTHROW AP_DAL_RangeFinder;
}
_rangefinder->handle_message(msg);
#endif
}
3.6 空速计
3.6.1 airspeed
AP_DAL_Airspeed *airspeed() {
return _airspeed;
}
3.6.2 handle_message
void handle_message(const log_RASH &msg) {
if (_airspeed == nullptr) {
_airspeed = NEW_NOTHROW AP_DAL_Airspeed;
}
_airspeed->handle_message(msg);
}
void handle_message(const log_RASI &msg) {
if (_airspeed == nullptr) {
_airspeed = NEW_NOTHROW AP_DAL_Airspeed;
}
_airspeed->handle_message(msg);
}
3.6.3 airspeed_sensor_enabled
获取空速计传感使能状态
// random methods that AP_NavEKF3 wants to call on AHRS:
bool airspeed_sensor_enabled(void) const {
return _RFRN.ahrs_airspeed_sensor_enabled;
}
3.7 BeaCon
3.7.1 beacon
#if AP_BEACON_ENABLED
AP_DAL_Beacon *beacon() {
return _beacon;
}
#endif
3.7.2 handle_message
void handle_message(const log_RBCH &msg) {
#if AP_BEACON_ENABLED
if (_beacon == nullptr) {
_beacon = NEW_NOTHROW AP_DAL_Beacon;
}
_beacon->handle_message(msg);
#endif
}
void handle_message(const log_RBCI &msg) {
#if AP_BEACON_ENABLED
if (_beacon == nullptr) {
_beacon = NEW_NOTHROW AP_DAL_Beacon;
}
_beacon->handle_message(msg);
#endif
}
3.8 实际里程计
3.8.1 visualodom
#if HAL_VISUALODOM_ENABLED
AP_DAL_VisualOdom *visualodom() {
return _visualodom;
}
#endif
3.8.2 handle_message
void handle_message(const log_RVOH &msg) {
#if HAL_VISUALODOM_ENABLED
if (_visualodom == nullptr) {
_visualodom