px4 middleware and architecture
2016-05-20 00:06
295 查看
uORB消息uORB是用于线程间/进程间异步的publish()/subscribe() 消息传递 API。API 是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。 uORB在飞控上电时会自动启动(因为很多application都依赖于他)。 It is started with
uorbstart. Unittests can be started with
uorb test. 增添一个新的话题如果你想增添一个新的话题的话,你需要在 msg/ 目录下创建一个新的.msg文件,并且在 msg/CMakeLists.txt中添加文件名字。然后类,就会自动生成相应的C/C++代码啦!我们先来看下一个已经存在msg文件吧。一个消息可以嵌套到其他的消息中。对每个C/C++结果,文件uint64_t timestamp将会被添加进来。这个是用来记录日志的,so当记录message的时候我们要填充他。为了在code中使用这个主题,我们需要包括头文件:
#include <uORB/topics/topic_name.h>通过添加类似如下 .msg文件中的一行,一个消息的定义可以用于多个相互独立的主题实例。
# TOPICS mission offboard_mission onboard_mission然后在code中,将他们当做主题的id: ORB_ID(offboard_mission) 我们可以在系统的任何地方发布一个主题(包括在中断环境下)。中断环境(该函数叫做hrt_call API)。然而,只有在非中断环境下,我们才可以广播一个主题。A topic has to be advertised in the sameprocess as its later published.Listing Topics and Listening in列出所有的主题: ls /obj得到一个主题的内容的5个消息, run the listener:
[code]listener sensor_accel5[/code]输出是主题内容的n倍(Theoutput is n-times the content of the topic:):
TOPIC: sensor_accel#3[/code]
timestamp:84978861[/code]
integral_dt:4044[/code]
error_count:0[/code]
x: -1[/code]
y:2[/code]
z:100[/code]
x_integral: -0[/code]
y_integral:0[/code]
z_integral:0[/code]
temperature:46[/code]
range_m_s2:78[/code]
scaling:0[/code]
TOPIC: sensor_accel#4[/code]
timestamp:85010833[/code]
integral_dt:3980[/code]
error_count:0[/code]
x: -1[/code]
y:2[/code]
z:100[/code]
x_integral: -0[/code]
y_integral:0[/code]
z_integral:0[/code]
temperature:46[/code]
range_m_s2:78[/code]
scaling:0[/code] Core Architecture PX4是一个活跃的系统, 使用pub/sub 去传递消息。我们不需要或者在系统的核心运行过程中使用文件控制代码(file handles)。我们会使用两个主要的APIs: publish/subscribe 系统包括file,network, shared memory backend(sharedmemory是一种协议)。全局的设备记录表可以枚举设备和get/set这些设备的配置。 搭建一个新的平台NuttX(PIXHAWK)启动脚本位于ROMFS/px4fmu_commonOS配置位于nuttx-configs. OS gets loaded作为应用程序搭建的一部分PX4中间层的配置位于src/drivers/boards中。他包括总线(bus)和GPIO口的位置和飞控板初始化的代码驱动程序位于src/drivers相关配置:运行'make px4fmu-v2_default'buildFMUv4.QuRT/Hexagon启动脚本位于posix-configs/OS配置是Linux image的一部分(TODO: 提供LINUX IMAGE和flash instruction(flash 指令)的位置)PX4中间层的配置位于 src/drivers/boards. TODO:ADD BUSCONFIG驱动位于DriverFramework相关配置:运行'make qurt_eagle_release'build theSnapdragon Flight的相关配置 设备IDPX4使用设备ID去识别系统中的传感器。这些ID 存储于配置参数中,用于匹配传感器的校准值,还可以用于将传感器与日志文件对应起来。 传感器的顺序(e.g. 如果有 /dev/mag0 和 /dev/mag1) 并不决定传感器的优先级,优先级是发布的uORB主题的一部分。 解码的例子举个例子,在一个系统中有3个磁力计,使用飞行日志(.px4log)去转存参数。三个参数对应传感器的ID和MAG_PRIME 用于选择主要传感器。每一个MAGx_ID是一个24位的数字,而且左边应该补0.
[code]CAL_MAG0_ID = 73225.0
CAL_MAG1_ID = 66826.0
CAL_MAG2_ID = 263178.0
CAL_MAG_PRIME = 73225.0下面是外部的HMC5983通过I2C,bus 1 at address 0x1E: 这个会出现在log file中以IMU.MagX的形式出现
# device ID 73225 in 24-bit binary:
00000001 00011110 00001 001
# decodes to:
HMC5883 0x1E bus 1 I2C下面是内部HMC5983通过SPI , bus 1, slave select slot5. 这个会出现在log file中以IMU1.MagX的形式出现
# device ID 66826 in 24- b557 bit binary:
00000001 00000101 00001 010
# decodes to:
HMC5883 dev 5 bus 1 SPI下面是内部的MPU9250磁力计通过SPI, bus 1, slave select slot 4. 这个会出现在log file中以IMU2.MagX的形式出现
# device ID 263178 in 24-bit binary:
00000100 00000100 00001 010
#decodes to:
MPU9250 dev 4 bus 1 SPI设备ID解码设备ID是24位的数字
struct[code] DeviceStructure {
enum
DeviceBusType bus_type :3
;
uint8_t
bus:5
;// which instance of the bus type[/code]
uint8_t
address;// address on the bus (eg. I2C address)[/code]
uint8_t
devtype;// device class specific device type[/code]
};The
bus_typeisdecoded according to:
enum[code] DeviceBusType {
DeviceBusType_UNKNOWN =0
,
DeviceBusType_I2C =1
,
DeviceBusType_SPI =2
,
DeviceBusType_UAVCAN =3
,
};
devtypeis decoded according to:
#define DRV_MAG_DEVTYPE_HMC5883 0x01
#define DRV_MAG_DEVTYPE_LSM303D 0x02
#define DRV_MAG_DEVTYPE_ACCELSIM 0x03
#define DRV_MAG_DEVTYPE_MPU9250 0x04
#define DRV_ACC_DEVTYPE_LSM303D 0x11
#define DRV_ACC_DEVTYPE_BMA180 0x12
#define DRV_ACC_DEVTYPE_MPU6000 0x13
#define DRV_ACC_DEVTYPE_ACCELSIM 0x14
#define DRV_ACC_DEVTYPE_GYROSIM 0x15
#define DRV_ACC_DEVTYPE_MPU9250 0x16
#define DRV_GYR_DEVTYPE_MPU6000 0x21
#define DRV_GYR_DEVTYPE_L3GD20 0x22
#define DRV_GYR_DEVTYPE_GYROSIM 0x23
#define DRV_GYR_DEVTYPE_MPU9250 0x24
#define DRV_RNG_DEVTYPE_MB12XX 0x31
#define DRV_RNG_DEVTYPE_LL40LS 0x32
相关文章推荐
- 最长回文串 O(n)复杂度(manacher算法)
- java基础第三天_数组
- 基于TCP/IP协议的网络攻击
- mini2440NFS启动,VFS: Unable to mount root fs via NFS, trying floppy.
- 1,架构总设计及安全思路
- Java基础之比较器 Comparable和Comparator
- 华为云服务产品之精华问题大集烩(一)
- 我们是如何使用 Electron 构建 Linux 桌面应用程序的
- 提高程序员开发效率的必备工具(最新版本)
- rem : web app适配的秘密武器
- 如何选择jQuery版本 1.x? 2.x? 3.x?
- 如何在 Ubuntu 和其他 Linux 发行版中创建照片幻灯片
- 在ASP.NET 2.0中操作数据之七十三:用Managed Code创建存储过程和用户自定义函数(上部分)
- 在ASP.NET 2.0中操作数据之七十四:用Managed Code创建存储过程和用户自定义函数(下部分)
- aspnet_regiis.exe命令使用方法
- 使用aspnet_regiis.exe重新注册.NET Framework
- ASP.NET 修复 IIS 映射具体实现步骤
- 为什么iPhone应用图标都是圆角?还是要从乔布斯说起
- Linux下源码安装nginx服务器以及部分配置
- 多名日本女星的iCloud账户被盗、私照外泄,你的密码安全吗?