ArduPilot开源代码之AP_DAL_Airspeed
1. 源由
AP_DAL_Airspeed
是用于管理和监控多个空速传感器的状态和数据,提供了一系列方法来获取和操作传感器的健康状态、使用状态、空速数据和更新时间。
2. 框架设计
2.1 构造函数和成员变量
- 类中定义了
_RASH
和_RASI
成员变量,分别是log_RASH
和log_RASI
结构体的实例。 //Replay Air Speed Head _RASI
是一个数组,其大小为AIRSPEED_MAX_SENSORS
,用于存储多个传感器的空速数据。//Replay Air Speed Instance
2.2 成员函数
healthy(uint8_t i)
和healthy()
:用于检查指定或主要传感器的健康状态。use(uint8_t i)
和use()
:用于检查指定或主要传感器是否启用。get_airspeed(uint8_t i)
和get_airspeed()
:返回指定或主要传感器的当前空速(单位是米每秒)。last_update_ms(uint8_t i)
和last_update_ms()
:返回指定或主要传感器的最后更新时间(毫秒)。get_num_sensors()
:返回传感器的数量。get_primary()
:返回当前主要传感器的索引。
2.3 其他方法
start_frame()
:可能是一个未提供实现的方法,用于开始一个帧或处理数据的初始操作。handle_message(const log_RASH &msg)
和handle_message(const log_RASI &msg)
:用于处理传感器状态和数据更新的消息。
2.4 结构体 log_RASH
和 log_RASI
- 这些结构体可能定义了传感器状态和数据的存储格式,但在提供的代码中没有具体展示其定义。
3. 重要例程
3.1 应用函数
3.1.1 healthy
获取指定 或 主 空速传感器实例健康状态
bool healthy(uint8_t i) const {
return _RASI[i].healthy;
}
bool healthy() const {
return healthy(get_primary());
}
3.1.2 use
获取指定 或 主 空速传感器实例使能状态
bool use(uint8_t i) const {
return _RASI[i].use;
}
bool use() const {
return use(get_primary());
}
3.1.3 get_airspeed
获取指定 或 主 空速传感器实例空速
float get_airspeed(uint8_t i) const {
return _RASI[i].airspeed;
}
float get_airspeed() const {
return get_airspeed(get_primary());
}
3.1.4 last_update_ms
获取指定 或 主 空速传感器实例最近一次更新时间
uint32_t last_update_ms(uint8_t i) const { return _RASI[i].last_update_ms; }
uint32_t last_update_ms() const { return last_update_ms(get_primary()); }
3.1.5 get_num_sensors
获取空速传感器数量
uint8_t get_num_sensors(void) const { return _RASH.num_sensors; }
3.1.6 get_primary
获取当前主空速传感器序号(实例)
uint8_t get_primary(void) const { return _RASH.primary; }
3.2 其他函数
3.2.1 AP_DAL_Airspeed
构造函数,初始化实例序号
AP_DAL_Airspeed::AP_DAL_Airspeed()
{
#if AP_AIRSPEED_ENABLED
for (uint8_t i=0; i<ARRAY_SIZE(_RASI); i++) {
_RASI[i].instance = i;
}
#endif
}
3.2.2 start_frame
AP_DAL::start_frame
└──> AP_DAL_Airspeed::start_frame
void AP_DAL_Airspeed::start_frame()
{
#if AP_AIRSPEED_ENABLED
const auto *airspeed = AP::airspeed();
if (airspeed == nullptr) {
return;
}
const log_RASH old = _RASH;
_RASH.num_sensors = airspeed->get_num_sensors();
_RASH.primary = airspeed->get_primary();
WRITE_REPLAY_BLOCK_IFCHANGED(RASH, _RASH, old);
for (uint8_t i=0; i<ARRAY_SIZE(_RASI); i++) {
log_RASI &RASI = _RASI[i];
log_RASI old_RASI = RASI;
RASI.last_update_ms = airspeed->last_update_ms(i);
RASI.healthy = airspeed->healthy(i);
RASI.use = airspeed->use(i);
RASI.airspeed = airspeed->get_airspeed(i);
WRITE_REPLAY_BLOCK_IFCHANGED(RASI, RASI, old_RASI);
}
#endif
}
3.2.3 handle_message
AP_DAL::handle_message
└──> AP_DAL_Airspeed::handle_message
void handle_message(const log_RASH &msg) {
_RASH = msg;
}
void handle_message(const log_RASI &msg) {
_RASI[msg.instance] = msg;
}
4. 总结
AP_DAL_Airspeed
的类,用于处理空速传感器数据,管理和访问多个空速传感器实例的状态和数据。
5. 参考资料
【1】ArduPilot开源飞控系统之简单介绍
【2】ArduPilot之开源代码Task介绍
【3】ArduPilot飞控启动&运行过程简介
【4】ArduPilot之开源代码Library&Sketches设计
【5】ArduPilot之开源代码Sensor Drivers设计
【6】ArduPilot开源代码之EKF系列研读