文章目录
- 前言
- 一、GPS串口初始化
- 二、GPS函数初始化
- 三、GPS的update
-
- 1.SCHED_TASK_CLAS
- 2.AP_GPS::update
- 3.AP_GPS::update_instance
- 4.AP_GPS::detect_instance
- 5.AP_GPS_NMEA::_detect
- 6.AP_GPS_Backend ※drivers
- 7.virtual bool read() = 0
- 8.class AP_GPS_NMEA
- 9.AP_GPS_NMEA::read
- 10.AP_GPS_NMEA::_decode
- 11.AP_GPS_NMEA::_term_complete()
- 12.AP_GPS_NMEA::_parse_decimal_100
- 13.AP_GPS_NMEA::_parse_degrees()
- 14.update_primary(void)
- 15.AP_GPS::is_healthy
- 16.location(primary_instance)
- 总结
参考文献
Ardupilot串口代码解析(应用篇)
https://zhuanlan.zhihu.com/p/64437691
Ardupilot添加自定义参数Param
https://blog.csdn.net/LiaRonBob/article/details/129546952
APM_ArduCopter源码解析学习(五)——GPS
https://blog.csdn.net/zhangfengmei1987/article/details/110794867
gps协议解析_the android sdk location
https://ispacesoft.com/107429.html
APM-GPS数据解析之一
https://blog.csdn.net/qq_30623591/article/details/124378705
pixhawk当中关于NMEA类型的gps数据处理流程
https://blog.csdn.net/wangxiyanw/article/details/77873523
Ardupilot前后端基于NEMA协议GPS解包过程
https://blog.csdn.net/leoli95/article/details/93531952
APM-GPS数据解析(NMEA协议)
https://blog.csdn.net/qq_30623591/article/details/123872876
前言
本文介绍如何在Ardupilot框架下解析GPS程序。
一、GPS串口初始化
1.AP_Vehicle::setup()
此函数仅在启动时调用一次。用于初始化一些必要的任务。此函数由 HAL 中的 main() 函数调用。
setup()调用init_ardupilot()
setup()分别使用serial_manager.init_console()和serial_manager.init()来初始化串口。
\libraries\AP_Vehicle\AP_Vehicle.cpp
void AP_Vehicle::setup()
{
...
serial_manager.init_console();
...
init_ardupilot();
...
serial_manager.init();
...
}
2.AP_Vehicle& vehicle = copter
\ArduCopter\ArduCopter.cpp
Copter copter;
AP_Vehicle& vehicle = copter;
3.Copter::init_ardupilot()
执行init_ardupilot()
\ArduCopter\system.cpp
void Copter::init_ardupilot()
{
gps.set_log_gps_bit(MASK_LOG_GPS);
gps.init(serial_manager);
}
4.AP_SerialManager::init()
执行AP_SerialManager::init()函数
在libraries/AP_SerialManager/AP_SerialManager.cpp中从swatch函数中可以看出,init函数重点是配置实现相应的串口协议和波特率。
\libraries\AP_SerialManager\AP_SerialManager.cpp
// init - // init - initialise serial ports
void AP_SerialManager::init()
{
...
// initialise serial ports
for (uint8_t i=1; i<SERIALMANAGER_NUM_PORTS; i++) {
...
case SerialProtocol_GPS:
case SerialProtocol_GPS2:
state[i].uart->begin(map_baudrate(state[i].baud),
AP_SERIALMANAGER_GPS_BUFSIZE_RX,
AP_SERIALMANAGER_GPS_BUFSIZE_TX);
break;
...}
而对应的协议和波特率已经通过如下定义实现。
5.AP_SerialManager::var_info[]
(1)
在\libraries\AP_SerialManager\AP_SerialManager.h
在AP_SerialManager的类中执行调用初始化
class AP_SerialManager {
public:
AP_Param::setup_object_defaults(this, var_info);
...
}
(2)
执行AP_SerialManager::var_info[]
\libraries\AP_SerialManager\AP_SerialManager.cpp
const AP_Param::GroupInfo AP_SerialManager::var_info[] = {
...
#if SERIALMANAGER_NUM_PORTS > 3
// @Param: 3_PROTOCOL
// @DisplayName: Serial 3 (GPS) protocol selection
// @Description: Control what protocol Serial 3 (GPS) should be used for. Note that the Frsky options require external converter hardware. See the wiki for details.
// @Values: -1:None, 1:MAVLink1, 2:MAVLink2, 3:Frsky D, 4:Frsky SPort, 5:GPS, 7:Alexmos Gimbal Serial, 8:SToRM32 Gimbal Serial, 9:Rangefinder, 10:FrSky SPort Passthrough (OpenTX), 11:Lidar360, 13:Beacon, 14:Volz servo out, 15:SBus servo out, 16:ESC Telemetry, 17:Devo Telemetry, 18:OpticalFlow, 19:RobotisServo, 20:NMEA Output, 21:WindVane, 22:SLCAN, 23:RCIN, 24:MegaSquirt EFI, 25:LTM, 26:RunCam, 27:HottTelem, 28:Scripting, 29:Crossfire, 30:Generator, 31:Winch, 32:MSP, 33:DJI FPV
// @User: Standard
// @RebootRequired: True
AP_GROUPINFO("3_PROTOCOL", 5, AP_SerialManager, state[3].protocol, SERIAL3_PROTOCOL),
// @Param: 3_BAUD
// @DisplayName: Serial 3 (GPS) Baud Rate
// @Description: The baud rate used for the Serial 3 (GPS). Most stm32-based boards can support rates of up to 1500. If you setup a rate you cannot support and then can't connect to your board you should load a firmware from a different vehicle type. That will reset all your parameters to defaults.
// @Values: 1:1200,2:2400,4:4800,9:9600,19:19200,38:38400,57:57600,111:111100,115:115200,230:230400,256:256000,460:460800,500:500000,921:921600,1500:1500000
// @User: Standard
AP_GROUPINFO("3_BAUD", 6, AP_SerialManager, state[3].baud, AP_SERIALMANAGER_GPS_BAUD/1000),
#endif
...
}
二、GPS函数初始化
1.gcs().init()
在void AP_Vehicle::setup()中,调用gcs().init()函数。
\libraries\AP_Vehicle\AP_Vehicle.cpp
void AP_Vehicle::setup()
{
...
gcs().init();
...
}
2.AP_GPS gps
\libraries\AP_Vehicle\AP_Vehicle.h
class AP_Vehicle : public AP_HAL::HAL::Callbacks {
{
...
protected:
...
AP_GPS gps;
...
}
3.AP_Param::GroupInfo AP_GPS::var_info[]
AP_GPS,_type[0],_type[1]选择参数
// table of user settable parameters
const AP_Param::GroupInfo AP_GPS::var_info[] = {
// @Param: _TYPE
// @DisplayName: 1st GPS type
// @Description: GPS type of 1st GPS
// @Values: 0:None,1:AUTO,2:uBlox,5:NMEA,6:SiRF,7:HIL,8:SwiftNav,9:DroneCAN,10:SBF,11:GSOF,13:ERB,14:MAV,15:NOVA,16:HemisphereNMEA,17:uBlox-MovingBaseline-Base,18:uBlox-MovingBaseline-Rover,19:MSP,20:AllyStar,21:ExternalAHRS,22:DroneCAN-MovingBaseline-Base,23:DroneCAN-MovingBaseline-Rover
// @RebootRequired: True
// @User: Advanced
AP_GROUPINFO("_TYPE", 0, AP_GPS, _type[0], HAL_GPS_TYPE_DEFAULT),
#if GPS_MAX_RECEIVERS > 1
// @Param: _TYPE2
// @DisplayName: 2nd GPS type
// @Description: GPS type of 2nd GPS
// @Values: 0:None,1:AUTO,2:uBlox,5:NMEA,6:SiRF,7:HIL,8:SwiftNav,9:DroneCAN,10:SBF,11:GSOF,13:ERB,14:MAV,15:NOVA,16:HemisphereNMEA,17:uBlox-MovingBaseline-Base,18:uBlox-MovingBaseline-Rover,19:MSP,20:AllyStar,21:ExternalAHRS,22:DroneCAN-MovingBaseline-Base,23:DroneCAN-MovingBaseline-Rover
// @RebootRequired: True
// @User: Advanced
AP_GROUPINFO("_TYPE2", 1, AP_GPS, _type[1], 0),
#endif
...
}
4 AP_GPS::init
在class AP_Vehicle : public AP_HAL::HAL::Callbacks 中,有gcs().init()函数。
\libraries\AP_GPS\AP_GPS.cpp
/// Startup initialisation.
void AP_GPS::init(const AP_SerialManager& serial_manager)
{
// Set new primary param based on old auto_switch use second option
if ((_auto_switch.get() == 3) && !_primary.configured()) {
_primary.set_and_save(1);
_auto_switch.set_and_save(0);
}
// search for serial ports with gps protocol
uint8_t uart_idx = 0;
for (uint8_t i=0; i<GPS_MAX_RECEIVERS; i++</