ArduPilot姿态环控制-----传感器初始化

参考链接:https://blog.csdn.net/lixiaoweimashixiao/article/details/80540295

首先我们假定从void AP_Vehicle::setup() 开始,这里是飞控所有初始化所在,程序位于 AP_vehicle.cpp中。
ArduPilot姿态环控制-----传感器初始化_第1张图片
找到其中的 init_ardupilot();函数,执行跳转
ArduPilot姿态环控制-----传感器初始化_第2张图片
执行跳转过程中,需要选择是机型(无人机,无人车,UUV等)。我们这里选择多旋翼,则走到了 system.cpp中。
ArduPilot姿态环控制-----传感器初始化_第3张图片
继续寻找到其中的 startup_INS_ground(); 如上图所示。然后再次跳转,如下图所得。
ArduPilot姿态环控制-----传感器初始化_第4张图片
这里跟踪定位到 ins.init(scheduler.get_loop_rate_hz());,该函数已经表示初始化了。当然,我们继续
ArduPilot姿态环控制-----传感器初始化_第5张图片
此时定位在 AP_InertialSensor.cpp 中,我们找到其中的 _start_backends();,由于采用的是前后端的形式,所以这个地方开始进入到后端了(注意到下面还有一个start()函数,在文末会展开说一下
ArduPilot姿态环控制-----传感器初始化_第6张图片
由于ArduPilot有多个板子,对应不同的传感器,所以这里先要检测后端,找到使用哪个板子,必要的一步。
ArduPilot姿态环控制-----传感器初始化_第7张图片
这里以Pixhawk为例,如上图所示,ADD_BACKEND是要条件后端了。在继续寻找 probe 函数,进入跳转得:
ArduPilot姿态环控制-----传感器初始化_第8张图片
继续刨根问底!!我们看到了sensor->init()
ArduPilot姿态环控制-----传感器初始化_第9张图片
还没完,这都挖的这么深了…
ArduPilot姿态环控制-----传感器初始化_第10张图片
终于,我们看到了硬件信号对传感器的初始化,包括传感器的一些初始配置,再往下就是总线协议了…

总结:完善的框架,造成藏得真深啊,不过其他传感器的初始化也都类似,如出一辙,通过前后端的形式完成。

补充:后端线程开启
ArduPilot姿态环控制-----传感器初始化_第11张图片
start函数会在后端函数中进行重载,具体实现如下。
ArduPilot姿态环控制-----传感器初始化_第12张图片
在start函数中,最后开启了线程回调函数
ArduPilot姿态环控制-----传感器初始化_第13张图片

/*
 * Timer process to poll for new data from the Invensense. Called from bus thread with semaphore held
 */
void AP_InertialSensor_Invensense::_poll_data()
{
    _read_fifo();
}

然后就讲传感器数据送入信号量了。

你可能感兴趣的:(ArduPilot,个人总结,数据挖掘,ArduPilot)