今天我们看一下如何创建一个应用程序,读取传感器和发送数据:https://pixhawk.org/dev/px4_simple_app
当把环境搭建好,整个工程下载后,打开src-->examples--->px4_simple_app。
当然了,也可以自己添加想实现的功能和任务。当写好这些应用程序,还要考虑要把它注册为NuttShell命令。为了使该应用程序进入固件的编译,将其添加到模块来构建名单。
名单构建位置:Firmware/cmake/configs/nuttx_px4fmu-v2_default.cmake
这此文件的末尾,添加:
examples/px4_simple_app
然后执行make px4fmu-v2_default命令编译工程。
编译下载完后,我们需要连接测试一下:
串口连接官网:https://pixhawk.org/users/serial_connection
我目前使用的是windows系统我使用的软件是官网提供的TeraTerm
打开这个软件并连接好,?或者help都会出现已经编译好的命令,在其中你会发现px4_simple_app,就是咱们要测试运行的。
刚才添加的程序已经在系统中注册好。
接下来我们需要扩展的是:如何订阅传感器数据并打印出来。
应用程序之间的个人信息通道称为px4主题。在本教程中,我们感兴趣的sensor_combined话题,其中包含完整系统的同步传感器数据。(下一更着重翻译一下uORB进程间通信)
#include <uORB/topics/sensor_combined.h> .. int sensor_sub_fd = orb_subscribe(ORB_ID(sensor_combined));
毫无疑问,sensor_sub_fd是一个文件描述符,官网上说,这可以用于非常有效地执行一个阻塞等待新数据,当前线程进入睡眠状态,并且一旦有新数据,不消耗任何cpu周期,等待自动唤醒。当然做到这一点使用pull()轮询机制来完成的。
实例中已经给出相关解释和说明,然后编译下载。我们来看一下测试:
系统可能已经运行uorb程序,如果运行的程序我们再启动一遍,会收到系统的通知,XX已经启动。
第二部运行sh/etc/init.d/rc.sensors
启动传感器。
最后一部启动传感器,px4_simple_app&
但是为什么后面要加个&符号呢?
如果加上&符号,会一直握有NuttShell的控制权。
下一步我们如何发布获取到的数据呢?我们可以通过mavlink应用程序,将其转发给地面站。
(按官网)
初始化要发布的的专题的结构和广告的话题:
#include <uORB/topics/vehicle_attitude.h> .. /* advertise attitude topic */struct vehicle_attitude_s att;memset(&att, 0, sizeof(att)); orb_advert_t att_pub_fd = orb_advertise(ORB_ID(vehicle_attitude), &att);
在主循环中发布信息:
orb_publish(ORB_ID(vehicle_attitude), att_pub_fd, &att);