ArduPilot第5章 GPS解析


参考文献
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++</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值