参考链接:https://blog.csdn.net/lixiaoweimashixiao/article/details/80540295
首先我们假定从void AP_Vehicle::setup()
开始,这里是飞控所有初始化所在,程序位于 AP_vehicle.cpp中。
找到其中的 init_ardupilot();
函数,执行跳转
执行跳转过程中,需要选择是机型(无人机,无人车,UUV等)。我们这里选择多旋翼,则走到了 system.cpp
中。
继续寻找到其中的 startup_INS_ground();
如上图所示。然后再次跳转,如下图所得。
这里跟踪定位到 ins.init(scheduler.get_loop_rate_hz());
,该函数已经表示初始化了。当然,我们继续
此时定位在 AP_InertialSensor.cpp
中,我们找到其中的 _start_backends();
,由于采用的是前后端的形式,所以这个地方开始进入到后端了(注意到下面还有一个start()函数,在文末会展开说一下)
由于ArduPilot有多个板子,对应不同的传感器,所以这里先要检测后端,找到使用哪个板子,必要的一步。
这里以Pixhawk为例,如上图所示,ADD_BACKEND是要条件后端了。在继续寻找 probe 函数,进入跳转得:
继续刨根问底!!我们看到了sensor->init()
还没完,这都挖的这么深了…
终于,我们看到了硬件信号对传感器的初始化,包括传感器的一些初始配置,再往下就是总线协议了…
总结:完善的框架,造成藏得真深啊,不过其他传感器的初始化也都类似,如出一辙,通过前后端的形式完成。
补充:后端线程开启
start函数会在后端函数中进行重载,具体实现如下。
在start函数中,最后开启了线程回调函数
void AP_InertialSensor_Invensense::_poll_data()
{
_read_fifo();
}
然后就讲传感器数据送入信号量了。