Pixhawk源码总结.doc

上传人:豆**** 文档编号:23968104 上传时间:2022-07-03 格式:DOC 页数:199 大小:1.35MB
返回 下载 相关 举报
Pixhawk源码总结.doc_第1页
第1页 / 共199页
Pixhawk源码总结.doc_第2页
第2页 / 共199页
点击查看更多>>
资源描述

《Pixhawk源码总结.doc》由会员分享,可在线阅读,更多相关《Pixhawk源码总结.doc(199页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-datePixhawk源码总结Pixhawk源码总结Pixhawk源码分析 - Sany_huang 阿国总结整理-目录Pixhawk源码一:APM代码基本结构 Pixhawk源码二:APM线程Pixhawk源码三:串行接口UART和ConsolePixhawk源码四:学习RC Input and Output Pixhawk源码五:存储与EEPROM管理 Pixhawk源码

2、六:源码预览与APM程序库 Pixhawk源码七:姿态控制预览Pixhawk源码八:添加新的参数Pixhawk源码九:添加新的飞行模式Pixhawk源码十:代码调度,使之定时运行 Pixhawk源码十一:增加新的MAVLink消息Pixhawk源码十二:采用VisualStudio编译MissionPlanner方法与问题总结Pixhawk源码笔记一:代码基本结构ArduPilot 代码分为5个主要部分,基本结构分类如下:(无人机控制系统 ArduPilotMega (APM) 是市面上最强大的基于惯性导航的开源自驾仪(并且是最便宜的之一!) 特性包括: 免费开源固件) vehicle dir

3、ectories AP_HAL libraries tools directories external support code1、vehicle directories模型类型 当前共有4种模型:ArduPlane, ArduCopter, APMrover2 and AntennaTracker。都是.pde文件,就是为了兼容arduino平台,以后可能会放弃。ArduPlane:固件运行在APM自动驾驶仪上,可以给任何固定翼飞机全部自主飞行能力ArduCopter 多旋翼机arduino平台一款便捷灵活、方便上手的开源电子原型平台,包含硬件(各种型号的Arduino板)和软件(Ardu

4、ino IDE)2、AP_HAL硬件抽象层 硬件抽象层,使得在不同硬件平台上的移植变得简单。 其中AP_HAL目录定义了一个通用的接口。其他的目录AP_HAL_XXX针对不同硬件平台进行详细的定义。例如AP_HAL_AVR目录对于AVR平台,AP_HAL_PX4对应PX4平台,AP_HAL_Linux对应Linux平台。3、tools directories工具目录 主要提供支持。For examples, tools/autotest provides the autotest infrastructure behind site and tools/Replay provides our

5、log replay utility.4、external support code外部支持代码 对于其他平台,需要外部支持代码。例如Pixhawk、PX4的支持代码如下: PX4NuttX 板载实时系统。the core NuttX RTOS used on PX4 boards PX4Firmware PX4固件。the base PX4 middleware and drivers used on PX4 boards uavcan 飞行器CAN通信协议。the uavcan CANBUS implementation used in ArduPilot mavlink Mavlink通

6、信协议。the mavlink protocol and code generator5、系统编译 针对不同的硬件板,编译可以采用“make TARGET”的形式。 make apm1 the APM1 board make apm2 the APM2 board make px4-v1 the PX4v1 make px4-v2 the Pixhawk 如果要移植到新的硬件,可以在mk/targets.mk文件中添加。 比如: make apm2-octa -j8 或者: make px4-v2 -j8 采用8通道并行编译方式,针对APM、Pixhawk硬件板(AVR、STM32),编译八旋

7、翼代码。第二部分: 学习sketch例程代码 sketch,是指使用 .pde 文件编写的主程序。 开始之前,你可以试着阅读、编译并运行下面的sketches libraries/AP_GPS/examples/GPS_AUTO_test libraries/AP_InertialSensor/examples/INS_generic libraries/AP_Compass/examples/AP_Compass_test libraries/AP_Baro/examples/BARO_generic libraries/AP_AHRS/examples/AHRS_Test 例如,下面的编译

8、方法,将在Pixhawk上安装AP_GPS例程sketch。 cd libraries/AP_GPS/examples/GPS_AUTO_test make px4-clean make px4-v2 make px4-v2-upload 正确理解sketch例程代码,我们以GPS_AUTO_test.pde代码为例(目录ardupilotlibrariesAP_GPSexamplesGPS_AUTO_test),主要几个特点: 1、 pde文件包含很多 includes; 2、 定义了 hal 引用声明; 3、 代码非常粗糙; 4、 setup() 和 loop()函数1、include文件

9、 pde文件转变为C+文件后,提供必要的库引用支持。2、hal引用声明 定义如下: const AP_HAL:HAL& hal = AP_HAL_BOARD_DRIVER;/ pixhawk等价于AP_HAL_PX4 该定义,方便访问硬件接口,比如console终端、定时器、I2C、SPI接口等。 实际的定义是在HAL_PX4_Class.cpp中定义,如下: const HAL_PX4 AP_HAL_PX4; hal是针对 AP_HAL_PX4 的引用。 经常使用的方法如下: 终端字符输出。hal.console-printf() and hal.console-printf_P() to

10、print strings (use the _P to use less memory on AVR) 获取当前运行时间。hal.scheduler-millis() and hal.scheduler-micros() to get the time since boot 延时。hal.scheduler-delay() and hal.scheduler-delay_microseconds() to sleep for a short time IO输入输出。hal.gpio-pinMode(), hal.gpio-read() and hal.gpio-write() for acc

11、essing GPIO pins I2C操作,hal.i2c SPI操作,hal.spi3、setup()和loop() 每个sketch都有一个setup()和loop()函数。板子启动时,setup()被调用。这些调用都来自HAL代码中的main()函数调用(HAL_PX4_Class.cpp文件main_loop())。setup()函数只调用一次,用于初始化所有libraries。 Loop()循环被调用,执行主任务。4、AP_HAL_MAIN()宏指令 每一个sketch(.pde文件)最底部,都有一个“AP_HAL_MAIN();”指令,它是一个HAL宏,用于定义一个C+ main

12、函数,整个程序的入口。它真正的定义在AP_HAL_PX4_Main.h中。 #define AP_HAL_MAIN() extern C _EXPORT int SKETCH_MAIN(int argc, char * const argv); int SKETCH_MAIN(int argc, char * const argv) hal.init(argc, argv); return OK; 作为程序的起点,在AP_HAL_MAIN()里,就正式调用了hal.init()初始化代码。 程序的执行过程就是:程序起点AP_HAL_MAIN() hal.init() hal.main_loop

13、() sketch中的setup()和loop()。Pixhawk源码笔记二:APM线程第三部分APM线程 详细参考: 对于APM1、APM2硬件板,不支持多线程,所以只能通过简单的定时器加回调函数来实现。类似PX4和Linux硬件板支持Posix标准的多线程。线程一般是指基于多任务操作系统的并行任务,我们首先要明白的几个概念如下: 1、 定时回调 2、 HAL专属线程 3、 驱动专属线程 4、 APM驱动与板级驱动 5、 板级专属线程、任务 6、 AP_Scheduler任务调度系统 7、 信号灯(任务队列互锁用) 8、 lockless data structures 如果你对操作系统运行

14、机制比较了解,那就很好理解了。1、定时回调The timer callbacks 每个飞控平台都提供一个1kHz的定时器(见AP_HAL),通过“注册”一个定时器函数来获取1kHz定时功能。所有注册的定时器将被顺序调用。调用形式如下: hal.scheduler-register_timer_process(AP_HAL_MEMBERPROC(&AP_Baro_MS5611:_update); 定时器优先级为181,高于主进程的180。上面代码是以MS5611气压计驱动为例,其中 AP_HAL_MEMBERPROC() 宏,主要作用是将一个C+成员函数包装起来,作为一个回调参数。其定义在AP_

15、HAL_Namespace.h文件中,如下: / macro to hide the details of AP_HAL:MemberProc #define AP_HAL_MEMBERPROC(func) fastdelegate:MakeDelegate(this, func) 使用hal.scheduler-millis() and hal.scheduler-micros() 可以记录时间。 好了,你可以试着自己边一个简单的sketch,在setup()和loop()函数中练习一下1秒钟向USB终端输出一个时间或字符。2、HAL专属线程 以PX4为例,HAL专属线程有: 1、 UART

16、线程,用于读、写串行接口数据(包括USB); 2、 定时器线程,支持1kHz定时功能; 3、 IO线程,支持写microSD、EEPROM、FRAM等。 对于Pixhawk,请准备一条调试电缆,连接到nsh console(serial 5 端口),波特率57600。如果已经连接,试下”ps”命令,你会得到如下信息: PID PRI SCHD TYPE NP STATE NAME 0 0 FIFO TASK READY Idle Task() 1 192 FIFO KTHREAD WAITSIG hpwork() 2 50 FIFO KTHREAD WAITSIG lpwork() 3 100

17、 FIFO TASK RUNNING init() 37 180 FIFO TASK WAITSEM AHRS_Test() AHRS线程 38 181 FIFO PTHREAD WAITSEM (20005400)定时器线程 39 60 FIFO PTHREAD READY (20005400)UART线程 40 59 FIFO PTHREAD WAITSEM (20005400) IO线程 10 240 FIFO TASK WAITSEM px4io() 13 100 FIFO TASK WAITSEM fmuservo() 30 240 FIFO TASK WAITSEM uavcan(

18、) 上面的线程为定时器线程(优先级181),UART线程(60), IO线程(59),以及其他线程诸如:px4io, fmuservo, uavcan, lpwork, hpwork and idle tasks 线程的主要目的是在不干扰主进程的情况下,在后台处理一些低优先级任务。例如 AP_Terrain library,需要向microSD卡写地形文件,它的实现方式如下: hal.scheduler-register_io_process(AP_HAL_MEMBERPROC(&AP_Terrain:io_timer); 注意:IO线程优先级59,相比定时器181优先级慢了很多。3、Driv

19、er专属线程 没什么好说的,请参考英文原版,需要提的一点是,我们可以利用register_io_process() 和register_timer_process()来处理驱动的访问。4、APM驱动与板级(原生)驱动 我们可以看到MPU6000驱动有两个版本:一个是APM版本,在libraries/AP_InertalSensor/AP_InertialSensor_MPU6000.cpp,另一个为原生代码版本,在PX4Firmware/src/drivers/mpu6000。 注意,对于Pixhawk,APM代码使用的是Pixhawk原生驱动,因为原生驱动已经做得很好了。libraries/

20、AP_InertialSensor/AP_InertialSensor_PX4.cpp中可以查看详情。 在非PX4平台上,我们使用AP_InertialSensor_MPU6000.cpp驱动,在PX4平台上,我们就用PX4原生驱动AP_InertialSensor_PX4.cpp5、板级专属线程、任务 在上面第2节“HAL专属线程”讲到”ps”命令显示的线程。很多都不是 AP_HAL_PX4 Schedule启动的线程,这些线程列举如下: idle task called when there is nothing else to run init used to start up the

21、system px4io handle the communication with the PX4IO co-processor hpwork PX4稍低优先级驱动线程。handle thread based PX4 drivers (mainly I2C drivers) lpwork PX4非常低优先级驱动线程。handle thread based low priority work (eg. IO) fmuservo AUX输出。handle talking to the auxillary PWM outputs on the FMU uavcan handle the uavca

22、n CANBUS protocol 这些任务的启动,由rc.APM脚本文件(ardupilotmkPX4ROMFSinit.drc.APM)指定。PX4启动时,会读取该文件。rc.APM属于nsh 类型脚本。作为练习,你可以修改rc.APM脚本文件,增加一些sleep和echo命令,那么当PX4启动时,通过debug console(也就是serial 5)可以显示出来。 更多内容,可以参考英文原版。 原生线程的启动代码如下: hrt_call_every(&_call, 1000, _call_interval, (hrt_callout)&MPU6000:measure_trampolin

23、e, this); 等同于AP_HAL中的hal.scheduler-register_timer_process()。上述代码的意思是,HRT (high resolution timer)高精度定时器,以1000微妙的周期调用MPU6000:measure_trampoline函数。这些操作是禁止中断的,最多占用数十微妙的时间。 上面的优先级非常高。下面的方法,是稍低优先级。 work_queue(HPWORK, &_work, (worker_t)&HMC5883:cycle_trampoline, this, 1); 用于处理I2C设备。大概花几百微妙的操作时间。是可以被中断的任务。如

24、果是最低优先级,那么参数改为LPWORK,这样的任务一般需要花费更长的时间。6、AP_Scheduler任务调度系统 用于飞行器主线程,提供了简单的机制控制每个操作花费了多少时间。例如:1、等待一个新IMU采样;2、在每一个IMU采样周期之间调用一系列其他任务。 每一个飞行器都有一个AP_Scheduler:Task table任务列表,参考代码(ardupilotlibrariesAP_Scheduler Scheduler_test.pde )类似如下: static const AP_Scheduler:Task scheduler_tasks PROGMEM = ins_update,

25、 1, 1000 , one_hz_print, 50, 1000 , five_second_call, 250, 1800 , ; 结构体第1列,循环调用的任务函数。第2列,调用频率(也叫tick,一个tick,就是一个最小时间单元,pixhawk为2.5ms)。第3列为最大可能占用的操作时间,scheduler.run()会传递当前可用的时间(微秒),如果时间不够,那么这个任务就pass掉了,不执行。 注意,AP_Scheduler:Task table列表必须具备以下条件: 1、 他们不能被阻塞。 2、 在飞行时,他们不能调用sleep function 3、 他们必须有可预估的最坏的

26、运行时间。 你可以修改Scheduler_test.pde,加入自己的代码来读取气压计、罗盘、GPS、更新AHRS输出roll/pitch。7、信号灯 有3种方法可以避免多线程访问冲突:1、信号灯;2、lockless data;3、PX4 ORB。 例如:I2C驱动可以通过信号灯,确保同一时间,只有一个I2C设备被使用。可以查看ardupilotlibrariesAP_CompassAP_Compass_HMC5843.cpp了解: 获得信号灯:_i2c_sem-take(1); 释放信号灯:_i2c_sem-give();8、Lockless Data Structures Lockles

27、s Data Structures比信号灯要方便,例子见: the _shared_data structure in libraries/AP_InertialSensor/AP_InertialSensor_MPU9250.cpp the ring buffers used in numerous places. A good example is libraries/DataFlash/DataFlash_File.cpp Go and have a look at these two examples, and prove to yourself that they are safe

28、for concurrent access. For DataFlash_File look at the use of the _writebuf_head and _writebuf_tail variables.9、PX4 ORB ORB(Object Request Broker)是PX4的互斥机制。 另外两种PX4驱动通信机制,列举如下: ioctl calls (see the examples in AP_HAL_PX4/RCOutput.cpp) /dev/xxx read/write calls (see _timer_tick in AP_HAL_PX4/RCOutput.

29、cpp) Pixhawk源码笔记三:串行接口UART和Console第四部分串行接口UART和Console 详细参考: UART很重要,用于调试输出,数传、GPS模块等。1、5个UART 目前共定义了5个UART,他们的用途分别是: uartA 串行终端,通常是Micro USB接口,运行MAVLink协议。 uartB GPS1模块。 uartC 主数传接口,也就是Pixhawk telem1接口。 uartD 次数传接口,也就是telem2接口。 uartE GPS2模块。 有些UART具备双重角色,比如通过修改SERIAL2_PROTOCOL参数,可以将uartD的Mavlink te

30、lemetry数传更改为Frsky telemetry数传(中国江苏产数传)。 测试libraries/AP_HAL/examples/UART_test目录下的example sketch,分别对5个UART都输出hello 消息。使用USB转串口工具,可以测试。2、调试终端Debug console 作为5个UART的补充,有些平台额外的还有一个debug console调试终端。你可以通过检查HAL_OS_POSIX_IO宏定义来判断,诸如: #if HAL_OS_POSIX_IO :printf(hello consolen); #endif 如果定义了HAL_OS_POSIX_IO,

31、可以试着查看AP_HAL/AP_HAL_Boards.h代码。3、UART函数 每个UART都一系列基本操作函数,主要有: 1. printf formatted print 2. printf_P formatted print with progmem string (saves memory on AVR boards) 3. println print and line feed 4. write write a bunch of bytes 5. read read some bytes 6. available check if any bytes are waiting 7. t

32、xspace check how much outgoing buffer space is available 8. get_flow_control check if the UART has flow control capabilities 可以到AP_HAL中查看他们的定义,并使用UART_TEST进行测试。4、UART接口说明 众多UART接口,众多名称,他们的对应关系,我总结如下,如有问题,欢迎发邮件至30175224 新浪WalkAnt,欢迎指正。代码定义PCB电路表述飞控板接口Serial标号说明APM代码中的表述电路板上的表述Pixhawk外壳上的标识串口序号uartAMi

33、cro USBUSBUSB接USB,支持MAVLink协议uartBUART4GPSSerial 3接GPS模块,另CAN2接口uartCUART2Telem1Serial 1接第1数传模块uartDUART3Telem2Serial 2接第2数传模块uartEUART8SERIAL4/5Serial 4一般接GPS2模块/UART7SERIAL4/5Serial 5Debug Console用于程序调试前面的文章:Pixhawk源码笔记一:APM代码基本结构:Pixhawk源码笔记二:APM线程:经过对UART测试代码: libraries/AP_HAL/examples/UART_test

34、)进行详细测试:void loop(void) / Micro USB口输出:Hello on UART uartA at 764.461 seconds test_uart(hal.uartA, uartA);/ GPS接口输出:Hello on UART uartB at 91.845 seconds test_uart(hal.uartB, uartB);/ 数传Telem1输出:Hello on UART uartC at 24.693 seconds test_uart(hal.uartC, uartC); / 数传Telem2输出:Hello on UART uartD at 80

35、5.557 seconds test_uart(hal.uartD, uartD);/ SEIRAL 4口输出:Hello on UART uartE at 911.812 seconds test_uart(hal.uartE, uartE); / also do a raw printf() on some platforms, which prints to the / debug console#if HAL_OS_POSIX_IO/ SEIRAL 5口输出: Hello on debug console at 976.857 seconds :printf(Hello on debu

36、g console at %.3f secondsn, hal.scheduler-millis()*0.001f);#endif hal.scheduler-delay(1000);SERIAL 5 作为重要的调试口。Pixhawk启动时会通过该接口输出大量信息,可以用来对启动过程进行监控。Pixhawk源码笔记四:学习RCInputandOutput第五部分 学习RC Input and Output 参考: RC Input,也就是遥控输入,用于控制飞行方向、改变飞行模式、控制摄像头等外围装置。ArduPilot支持集中不同RC input(取决于具体的硬件飞控板): 1. PPMSum

37、 on PX4, Pixhawk, Linux and APM2 2. SBUS on PX4, Pixhawk and Linux 3. Spektrum/DSM on PX4, Pixhawk and Linux 4. PWM on APM1 and APM2 5. RC Override (MAVLink) all boards 其中SBUS and Spektrum/DSM是串行协议,SBUS为100kbps反UART协议,Spektrum/DSM为115200bps UART协议。对于PX4,这些协议是通过硬件UARTs实现的,而有些Linux系统是通过软件UARTs实现的。(原文:

38、Some boards implement these using hardware UARTs (such as on PX4) and some implement them as bit-banged software UARTs (on Linux).) RC Output,是指飞控接受到RC输入后,再将其处理后,输出到伺服和电机(电调)上。RC Output默认50Hz PWM信号。对于ArduCopter多轴飞行器和直升机,输出频率为400Hz。1、RCInput对象(AP_HAL) RCInput 对象声明: AP_HAL:RCInput* rcin; 相关例程: librari

39、es/AP_HAL/examples/RCInput/RCInput.pde ,试着动动遥控器手柄,看看输出是否符合预期。2、RCOutput对象(AP_HAL) RCOutput对象声明: AP_HAL:RCOutput* rcout; 不同的飞控,代码实现有所不同,可能包含了片上定时器、I2C、经由协处理器(PX4IO)输出等程序。 相关例程: libraries/AP_HAL/examples/RCOutput/RCOutput.pde 这段程序从1通道到14通道,控制电机从最小转速到最大转速逐级变化。3、RC_Channel对象 hal.rcin和hal.rcout对象,为低层次调用。

40、最常用的是使用更高级封装的RC_Channel 对象来实现RC input 和 output。它允许用户对参数进行配置,例如每个通道min/max/trim值,同时支持辅助AUX通道函数,还可对input output进行比例缩放处理等。 相关例程: libraries/RC_Channel/examples/RC_Channel/RC_Channel.pde例程教你如何setup、read、copy input to output。4、RC_Channel奇怪的input/output 设置 看代码时,有些地方程序会让你感到奇怪,有一些是由于程序代码的不完善产生的,有一些则不是。 例如,很多变量作用在input和output上:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com