您的位置:首页 > 其它

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_accel
5[/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_type
 isdecoded according to:
enum[code] DeviceBusType {
  DeviceBusType_UNKNOWN =
0
,
  DeviceBusType_I2C     =
1
,
  DeviceBusType_SPI     =
2
,
  DeviceBusType_UAVCAN  =
3
,
};
  
devtype
 is 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

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: