logo头像
Snippet 博客主题

以MS5611气压计数据分析PX4 uORB

概念

pixhawk的发布订阅机制是通过“微对象请求代理”(uORB)来实现的。

自定义主题

  • 要定义一个自定义主题,发布者需要提供给订阅者一个头文件(参考sensor_baro.h),在这个头文件中必须有:
    /Firmware/build/nuttx_px4fmu-v4_default/msg/tmp/headers –> sensor_baro.h
  1. 用主题的名称做作为参数调用ORB_DECLARE(sensor_baro);宏来定义一个实例
  2. 定义一个结构体,用来描述将要用来发布的数据结构。
    struct sensor_baro_s {
    uint64_t timestamp;
    uint64_t error_count;
    uint32_t device_id;
    float pressure;
    float temperature;
    uint8_t _padding0[4]; // required for logger
    }
  3. 除了头文件,发布者必须要具有使用ORB_DEFINE()宏在源码中定义一个实例,当固件被构建时,他将被编译并且链接到固件。
    在/Firmware/build/nuttx_px4fmu-v4_default/msg/tmp/sources –> sensor_baro.cpp
    ORB_DEFINE(sensor_baro, struct sensor_baro_s, 28, __orb_sensor_baro_fields);
  • 接着就是广告了:
    在 /Firmware/src/drivers/barometer/ms5611 的 ms5611.cpp 的 int MS5611::init()中
    _baro_topic = orb_advertise_multi(ORB_ID(sensor_baro), &brp, &_orb_class_instance, _interface->external() ? ORB_PRIO_HIGH : ORB_PRIO_DEFAULT);

  • 然后就是发布新主题:
    /Firmware/src/drivers/barometer/ms5611 的 ms5611.cpp 的 int MS5611::collect()中
    orb_publish(ORB_ID(sensor_baro), _baro_topic, &report);

  • 接着就是订阅:
    /Firmware/src/modules/events/temperature_calibration 的baro.cpp 的构造函数中
    _sensor_subs[i] = orb_subscribe_multi(ORB_ID(sensor_baro), i);

  • 最后就是把数据拷贝过来:
    /Firmware/src/modules/events/temperature_calibration 的baro.cpp 的 update_sensor_instance();

  1. orb_copy(ORB_ID(sensor_baro), sensor_sub, &baro_data);
  2. 通过sensor_baro_s baro_data; 把publish过来的数据保存在结构体 baro_data 中。

总结

  1. 定义主题时候,若是原PX4中没有,则自己定义一个.h 和一个.cpp文件,若是有则直接模仿进行orb_subscribe_multi/orb_copy。注意定义主题时候的分别在.h和.cpp中声明和定义主题;
  2. 在传感器的.cpp的初始化中进行广告,并且在函数中将数据收集到结构体中,再publish出去;
  3. 在需要调用的构造函数中调用一次订阅函数;
  4. 再在需要用到的地方拷贝出来。