创建uORB消息
- 在路径“msg”中自定义文件feixing_demo.msg(尽量不要使用类似于test_uorb_demo.msg之类的名称),输入:
uint64 timestamp # 时间戳,time since system start (microseconds)
bool enable
float32 acc_norm
float32[3] acc
- 有时有注释:
# TOPICS vehicle_local_position vehicle_local_position_groundtruth
# TOPICS estimator_local_position
表明该消息有多个ID,所以不定义特殊ID时,应将这两行注释删除。
2. 在路径“msg/CMakeLists.txt”中的set(msg_files)内部,输入feixing_demo.msg
发布与订阅
- 在需要该消息的文件的.hpp文件中,加入#include <uORB/topics/feixing_demo.h>
- 在.hpp文件的private中订阅消息:
//引用原始的传感器数据
#include <uORB/topics/sensor_combined.h>
//定时的周期性订阅
//这行代码创建了一个名为_sensor_combined_sub的uORB::Subscription对象,用于订阅vehicle_land_detected主题的消息。
uORB::Subscription _sensor_combined_sub {ORB_ID(vehicle_land_detected)};
//feixingdemo_s表示结构体
uORB::Publication<feixing_demo_s> _feixing_demo_pub {ORB_ID(feixing_demo)};
- 在终端输入命令
make px4_sitl_default
,之后可在路径“build/px4_sitl_default/uORB/topics”中生成文件“feixing_demo.h”
如果直接输入make px4_sitl_default gazebo,则可能报错。
- 在.cpp文件中输入:
sensor_combined_s imu;//实例化对象
if (_sensor_combined_sub.update(&imu)){//如果对象更新消息
feixing_demo_s feixing_demo;//实例化对象
feixing_demo.enable = true;
feixing_demo.timestamp = hrt_absolute_time(); //获取当前时间戳,也可以使用time_stamp_now赋值
feixing_demo.acc[0]= imu.accelerometer_m_s2[0];//通过sensor_combined_s跳转到定义,可以查看哪些值可以赋值给test_demo.acc
feixing_demo.acc[1]= imu.accelerometer_m_s2[1];
feixing_demo.acc[2]= imu.accelerometer_m_s2[2];
feixing_demo.acc_norm = sqrtf(feixing_demo.acc[0]*feixing_demo.acc[0] + feixing_demo.acc[1]*feixing_demo.acc[1] + feixing_demo.acc[2]*feixing_demo.acc[2]);
_feixing_demo_pub.publish(feixing_demo);//发布
}
添加进日志
- 在路径“src/modules/logger/logged_topics.cpp”中的
void LoggedTopics::add_default_topics()
,输入add_topic("feixing_demo");//或者add_topic("feixing_demo",100),表示100ms记录一次日志。
模拟飞行测试并导出飞行日志
- 运行gazebo仿真。
- 在qgc中使用虚拟遥感控制多旋翼飞行。
- 选择需要的日志下载到本地。