PX4源码开发人员文档(二)——Hello Sky.doc_第1页
PX4源码开发人员文档(二)——Hello Sky.doc_第2页
PX4源码开发人员文档(二)——Hello Sky.doc_第3页
PX4源码开发人员文档(二)——Hello Sky.doc_第4页
PX4源码开发人员文档(二)——Hello Sky.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

前提 用UART1连接PX4FMU和计算机 安装PX4Toolchain 注册Github账户Step 1: 准备源码文件为了方便管理代码,可以使用GIT 版本控制系统,在 GitHub上 fork和更新源码。不注册GitHub的话,可以在PX4 console中输入下面的命令:1. gitclone/PX4/Firmware更新the git submodules,在 PX4 console上输入:1. cdFirmware2. gitsubmoduleinit3. gitsubmoduleupdate文件准本完成,编译操作系统,输入:1. makearchives当submodules或者NuttX配置改变,重新编译。在Firmware/src/examples/新建目录px4_simple_app,在目录中新建文件module.mk并添加如下内容:1. MODULE_COMMAND=px4_simple_app2. SRCS=px4_simple_app.cStep 2: 最小程序在px4_simple_app目录下创建px4_simple_app.c文件。遵循PX4 CodingStyle编辑如下代码:1. /*2. *filepx4_simple_app.c3. *MinimalapplicationexampleforPX4autopilot.4. */5. 6. #include7. #include8. #include9. 10. _EXPORTintpx4_simple_app_main(intargc,char*argv);11. 12. intpx4_simple_app_main(intargc,char*argv)13. 14. printf(HelloSky!n);15. returnOK;16. Step 3: 在NuttShell中注册应用并build完成了应用并可以运行,但是没有在NuttShell 命令中注册。为将应用编译到固件当中,将其填加到需要build的模块中。该配置位于:Firmware/makefiles/nuttx/config_px4fmu-v2_default.mk在上面的文件中的任意位置,为应用创建一行:1. MODULES+=examples/px4_simple_app然后编译,并清除已经build的应用:1. makeclean2. makepx4fmu-v2_default-j4如果没有注册新的app,只需要对新增的builds执行下述命令:1. makepx4fmu-v2_default-j4Step 4:加载应用并测试使能uploader 然后重置电路板:1. makeuploadpx4fmu-v2_default-j4在重置电路板之前显示如下一系列信息:1. Generating/Users/user/src/Firmware/Images/px4fmu.px42. Loadedfirmwarefor5,0,waitingforthebootloader.电路板充值并上载后,打印:1. Foundboard5,0on/dev/tty.usbmodem12. erase.3. program.4. verify.5. done,rebooting.运行px4 Toolchain下的TeraTerm,运行File/New connection,选择飞控所在的串口,点击OK。按回车,出现nsh.在NSH连接的情况下,切换到shell.如果没有看到输出,敲击Enter键,会得到NSH提示;或者也可以,使用QGroundControl进行NuttShell (NSH),使用Mini-USB连接Pixhawk,按照下图进行。点击QGroundControl上的终端输出,并敲击Enter键。1. nsh输入help,并敲击Enter键:1. nshhelp2. helpusage:help-v3. 4. dfkillmkfifopssleep5. ?echolosetupmkrdpwdtest6. catexeclsmhrmumount7. cdexitmbmountrmdirunset8. cpfreemkdirmvsetusleep9. ddhelpmkfatfsmwshxd10. 11. BuiltinApps:12. reboot13. perf14. top15. .16. px4_simple_app17. .18. sercon19. serdispx4_simple_app现在成为可用的指令。输入px4_simple_app并敲击Enter键:1. nshpx4_simple_app2. HelloSky!Step 5: 订阅传感器数据为了做有用的事情,应用需要订阅subscribe输入并发布publish输出 (e.g. 电机 或伺服指令). PX4平台真正的硬件抽象(truehardware abstraction )开始有用不需要与传感器驱动以任何方式相互作用,并且电路板或者传感器升级后不需要升级。PX4中应用间独立的消息通道被称作topics. 在这里,感兴趣的是sensor_combinedtopic, 其调用整个系统的同步传感器数据。订阅到topic非常快和干净:1. #include2. .3. intsensor_sub_fd=orb_subscribe(ORB_ID(sensor_combined);sensor_sub_fd是一个文件描述符,非常高效的执行一块等待新的数据的数据块。当前的进程进入休眠,当有新的数据可用时,由调度程序自动地唤醒,在等待的时候,不占用任何CPU周期。为实现这点,使用poll(),调用 POSIX system 。将poll()添加到subscription看上去像:1. #include2. #include3. .4. intsensor_sub_fd=orb_subscribe(ORB_ID(sensor_combined);5. 6. /*onecouldwaitformultipletopicswiththistechnique,justusingonehere*/7. structpollfdfds=8. .fd=sensor_sub_fd,.events=POLLIN,9. ;10. 11. while(true)12. /*waitforsensorupdateof1filedescriptorfor1000ms(1second)*/13. intpoll_ret=poll(fds,1,1000);14. .15. if(fds0.revents&POLLIN)16. /*obtaineddataforthefirstfiledescriptor*/17. structsensor_combined_sraw;18. /*copysensorsrawdataintolocalbuffer*/19. orb_copy(ORB_ID(sensor_combined),sensor_sub_fd,&raw);20. printf(px4_simple_appAccelerometer:t%8.4ft%8.4ft%8.4fn,21. (double)raw.accelerometer_m_s20,22. (double)raw.accelerometer_m_s21,23. (double)raw.accelerometer_m_s22);24. 25. px4_simple_app的完整代码如下:1. /*2. *filepx4_simple_app.c3. *MinimalapplicationexampleforPX4autopilot4. *5. *authorExampleUser6. */7. 8. #include9. #include10. #include11. #include12. 13. #include14. #include15. 16. _EXPORTintpx4_simple_app_main(intargc,char*argv);17. 18. intpx4_simple_app_main(intargc,char*argv)19. 20. printf(HelloSky!n);21. 22. /*subscribetosensor_combinedtopic*/23. intsensor_sub_fd=orb_subscribe(ORB_ID(sensor_combined);24. 25. /*onecouldwaitformultipletopicswiththistechnique,justusingonehere*/26. structpollfdfds=27. .fd=sensor_sub_fd,.events=POLLIN,28. /*therecouldbemorefiledescriptorshere,intheformlike:29. *.fd=other_sub_fd,.events=POLLIN,30. */31. ;32. 33. interror_counter=0;34. 35. while(true)36. /*waitforsensorupdateof1filedescriptorfor1000ms(1second)*/37. intpoll_ret=poll(fds,1,1000);38. 39. /*handlethepollresult*/40. if(poll_ret=0)41. /*thismeansnoneofourprovidersisgivingusdata*/42. printf(px4_simple_appGotnodatawithinasecondn);43. elseif(poll_ret0)44. /*thisisseriouslybad-shouldbeanemergency*/45. if(error_counter10|error_counter%50=0)46. /*useacountertopreventflooding(andslowingusdown)*/47. printf(px4_simple_appERRORreturnvaluefrompoll():%dn48. ,poll_ret);49. 50. error_counter+;51. else52. 53. if(fds0.revents&POLLIN)54. /*obtaineddataforthefirstfiledescriptor*/55. structsensor_combined_sraw;56. /*copysensorsrawdataintolocalbuffer*/57. orb_copy(ORB_ID(sensor_combined),sensor_sub_fd,&raw);58. printf(px4_simple_appAccelerometer:t%8.4ft%8.4ft%8.4fn,59. (double)raw.accelerometer_m_s20,60. (double)raw.accelerometer_m_s21,61. (double)raw.accelerometer_m_s22);62. 63. /*therecouldbemorefiledescriptorshere,intheformlike:64. *if(fds1.n.revents&POLLIN)65. */66. 67. 68. 69. return0;70. 编译app,通过下面的指令:1. make测试uORB订阅运行更新后的程序。UORB app 可能已经在运行,但是重新运行一次也没关系,所以执行:1. uorbstart目标请求中间人已经被激活,可以启动传感器:1. sh/etc/init.d/rc.sensors最后一步是启动应用,但是为什么语法不同?1. px4_simple_app&不同是,uorb和传感器应用作为后台程序运行Daemon(computing)。 这就允许在不失去对NuttShell控制的情况下,启动/停止其。假如忘了在行末输入& ,应用将会将现在传感器的值铺满显示屏:1. px4_simple_appAccelerometer:0.04830.08210.03322. px4_simple_appAccelerometer:0.04860.08200.03363. px4_simple_appAccelerometer:0.04870.08190.03274. px4_simple_appAccelerometer:0.04820.08180.03235. px4_simple_appAccelerometer:0.04820.08270.03316. px4_simple_appAccelerometer:0.04890.08040.0328由于不是后台程序,没有办法将其停止,只能让其运行,或者通过发起下面的命令重启自驾仪:1. reboot或者按压PX4FMU上的reset button.如何将应用变为后台程序可以参考this tutorial。Step 6: 速率受限的订阅上一步最后一步是屏幕上铺满传感器数据。通常并不需要数据以最高速率刷新,试图保持最高速率,通常会使整个系统变慢。API接口非常简单:1. orb_set_interval(inthandle,unsignedinterval);限制topic到1 Hz, 只需添加:1. orb_set_interval(sensor_sub_fd,1000);到示例代码这行的下面(在line 55附近):1. /*subscribetosensor_combinedtopic*/2. intsensor_sub_fd=orb_subscribe(ORB_ID(sensor_combined);屏幕将会以1Hz的速率方便的打印传感器数据。Step 7: 发布数据为了使用计算得到的输出,下一步是发布结果。假如我们使用了一个topic,mavlinkapp通过该topic转发到地面站,我们甚至可以查看结果。出于这个目的,来拦截姿态 topic。接口非常简单,初始化topic结构,并通告(advertise)topic。1. #include2. .3. /*advertiseattitudetopic*/4. structvehicle_attitude_satt;5. memset(&att,0,sizeof(att);6. orb_advert_tatt_pub_fd=orb_advertise(ORB_ID(vehicle_attitude),&att);在主循环中,当其准备好后,发布信息:1. orb_publish(ORB_ID(vehicle_attitude),att_pub_fd,&att);修改后的完整示例代码为:1. /*2. *filepx4_simple_app.c3. *MinimalapplicationexampleforPX4autopilot4. */5. 6. #include7. #include8. #include9. #include10. 11. #include12. #include13. #include14. 15. _EXPORTintpx4_simple_app_main(intargc,char*argv);16. 17. intpx4_simple_app_main(intargc,char*argv)18. 19. printf(HelloSky!n);20. 21. /*subscribetosensor_combinedtopic*/22. intsensor_sub_fd=orb_subscribe(ORB_ID(sensor_combined);23. orb_set_interval(sensor_sub_fd,1000);24. 25. /*advertiseattitudetopic*/26. structvehicle_attitude_satt;27. memset(&att,0,sizeof(att);28. intatt_pub_fd=orb_advertise(ORB_ID(vehicle_attitude),&att);29. 30. /*onecouldwaitformultipletopicswiththistechnique,justusingonehere*/31. structpollfdfds=32. .fd=sensor_sub_fd,.events=POLLIN,33. /*therecouldbemorefiledescriptorshere,intheformlike:34. *.fd=other_sub_fd,.events=POLLIN,35. */36. ;37. 38. interror_counter=0;39. 40. while(true)41. /*waitforsensorupdateof1filedescriptorfor1000ms(1second)*/42. intpoll_ret=poll(fds,1,1000);43. 44. /*handlethepollresult*/45. if(poll_ret=0)46. /*thismeansnoneofourprovidersisgivingusdata*/47. printf(px4_simple_appGotnodatawithinasecondn);48. elseif(poll_ret0)49. /*thisisseriouslybad-shouldbeanemergency*/50. if(error_counter10|error_counter%50=0)51. /*useacountertopreventflooding(andslowingusdown)*/52. printf(px4_simple_appERRORreturnvaluefrompoll():%dn53. ,poll_ret);54. 55. error_counter+;56. else57. 58. if(fds0.revents&POLLIN)59. /*obtaineddataforthefirstfiledescriptor*/60. structsensor_combined_sraw;61. /*copysensorsrawdataintolocalbuffer*/62. orb_copy(ORB_ID(sensor_combined),sensor_sub_fd,&raw);63. printf(px4_simple_appAccelerometer:t%8.4ft%8.4ft%8.4f

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论