基于RflySim平台的uORB消息读取与写入实验(二)

本文详细介绍了在RflySim平台上进行的uORB消息读取与写入实验,包括使用uORBReadFunction-CallTrigger订阅与发布消息,以及如何通过不同的发送接口进行消息控制。同时涉及自定义uORB消息的创建和固件集成过程。
摘要由CSDN通过智能技术生成

uORB消息读取与写入实验框架总览

一. uORB消息读取实验解析

基于RflySim平台的uORB消息读取与写入实验(一)

上篇文章对“基于RflySim平台的uORB消息读取与写入实验”关键子模块做了介绍,本篇介绍实验原理。

例程文件见:RflySim安装平台\

RflySimAPIs\5.RflySimFlyCtrl\0.ApiExps\6.uORB-Read-Write\Exp1_uORB_read.slx

如上图所示,该模型用uORB Read Function-Call Trigger订阅'actuator_armed'消息来接收是否解锁,如果未解锁输出12345678,反之则输出00000000,然后数据通过rfly_px4消息发布出去,被其他程序接收。

uORB Read Function-Call Trigger模块的关键配置如下:

订阅消息要选中actuator_armed'

1) 点击“Create bus Object”就能创建数据总线;

2) uORB interval 时间间隔这里设置为4ms,也就是250Hz,表示每隔多长时间检查消息更新。实际使用时根据情况设置,通常对低延迟高频率的消息,可设置成1ms,也就是1000Hz。这样做会多消耗一些计算量,但是能降低延迟;

3) Function-Call Options为触发函数的功能,本例子不需要使用,默认情况也不需要使用;

4) Sample Time仿真步长,可以设置为-1(使用默认步长,也就是Simulink设置页面的值,或者上一级数据源的步长),这里也可以直接设置为0.01。注意,所有模块的步长与设置页面的基础步长之间,应该成倍数关系。

如上图所示,设置好订阅模块后,就能从Bus Selector中选择自己感兴趣的消息进行订阅了。

本例中,选择了timestamp和armed标志位,其中armed表示是否解锁。具体有哪些uORB消息,以及每个消息的定义,可以参考网站:https://docs.px4.io/main/en/middleware/uorb.html

或者在PX4PSP\Firmware\msg文件夹中自行查看注释。

如下图所示,Switch模块的含义是:如果未解锁,输出12345678,反之则输出00000000。

如下图所示,在 uORB Write Advanced1模块中订阅了rfy_px4消息,用来向其他程序发布数据。点击Open .msg file可查阅该uORB消息,该消息包含两个结构体,具体定义如下:

这是一个无符号64位整数,用于表示自系统启动以来经过的时间,单位是微秒(microseconds)。

这是一个包含8个元素的浮点数数组,用于表示8维控制信号。

如下图所示,在进行自动代码生成前,需要配置仿真环境。

1)必须设置为固定步长;

2)求解器选龙格库塔或其他,阶数越高计算量越大;

3)仿真步长根据实际情况选择,通常为1/250或1/400,也就是250Hz或400Hz;

4)其他的照页面设置,最重要的确认Toolchain为 Pixhawk Toolchain。

二. uORB消息读取触发实验解析

例程见:RflySim安装平台

\RflySimAPIs\5.RflySimFlyCtrl\0.ApiExps\6.uORB-Read-Write\Exp2_uORB_read_func.slx

如上图所示,该模型用uORB Read Function-Call Trigger订阅'actuator_armed'消息,来接收是否解锁。如果未解锁,就输出12345678,反之输出00000000,数据通过rfly_px4消息发布出去,被其他程序接收。

和“Exp1_uORB_read.slx”实验不同,本例程的数据处理采用了触发方式,即只有actuator_armed更新时,才会去处理数据,并发布rfly_px4消息。例程实现原理:uORB Read Function-Call Trigger的配置页面,要勾选Function-Call Triggle。

其中Polling Timeout可以设置为-1或指定值。其中,-1表示会一直阻塞(不会消耗计算性能),直到收到消息才触发Task1;设置为0,则表示不超时立即返回,即不阻塞;设置为对应毫秒,如果超过指定时间没有收到消息,也会强行触发Task1。

注:不能设定为0,会导致飞控以无限快速度执行Task1,导致飞控卡死。

配合function和uORB Read Async模块,来触发并处理actuator_armed数据。

uORB Read Async里面的总线数据要和外层触发模块保持一致,这里是actuator_armed。

三. uORB发送接口使用实验解析

例程见:RflySim安装平台

\RflySimAPIs\5.RflySimFlyCtrl\0.ApiExps\6.uORB-Read-Write\Exp3_uORB_write.slx

程序内容:监听actuator_armed消息,并通过uORB Write、uORB Write Advanced、uORB Write Advanced_dai三个发送接口,依次发送rfly_ctrl、rfly_px4、rfly_ext三条消息。

在PSP工具库中,三个uORB发送函数如下:

配置方法:uORB Write 模块需要手动输入消息名,变量名,数据类型,数据维度等,使用较为麻烦。

uORB Write Advanced 模块能自动索引uORB消息文件,并可以通过勾选使能想要发送的消息接口,使用较为方便。

uORB Write Advanced_dai 模块支持uORB消息ID和文件名不同,且支持通过isSend接口,控制是否发送消息,适合命令类消息(只需发送一次,而不是持续发送),或者控制发送频率等。

Send1Hz模块,通过时间整除运算,得到1秒钟触发一次的信号,发送给isSend,使得rfly_ext消息的频率被限制在1Hz。

04 uORB消息读取触发实验解析

例程见:RflySim安装平台

\RflySimAPIs\5.RflySimFlyCtrl\0.ApiExps\6.uORB-Read-Write\Exp4_uORB_DifID.slx

如上图所示,该模型用uORB Read Function-Call Trigger1订阅'vehicle_attitude_vehicle_attitude_groundtruth'消息,同时用uORB Read Function-Call Trigger2。

订阅'vehicle_attitude',然后数据通过三条'vehicle_attitude_estimator_attitude'消息发布出去,被其他程序接收。在进行自动代码生产和固件烧录后,打开QGroundControl软件,点击左上角Logo在弹出的对话框中,选中Analyze Tools,在Mavlink控制台中输入:

通过观察,可以发现飞控接受了三条'vehicle_attitude_estimator_attitude'消息。另外,打开PX4PSP\Firmware\msg\vehicle_attitude.msg文件(注意:PX4 1.14版本开始是VehicleAttitude.msg命名方式)

从文件中可以看出,文件名对应的uORB ID默认为vehicle_attitude,除此之外基于vehicle_attitude.msg消息格式,还支持其他的uORB ID的消息,包括vehicle_attitude_groundtruth、external_ins_attitude、estimator_attitude。

05自定义uORB消息实验解析

例程目录:RflySim安装平台

\RflySimAPIs\5.RflySimFlyCtrl\0.ApiExps\7.uORB-Create\

打开MATLAB软件,在MATLAB中运行init_control.m文件,即可将自定义的uORB消息加载到飞控固件中。

init_control.m脚本解析:添加路径 '.\msg',这个路径应该包含了消息定义的文件。

用来生成消息结构体,是一个自定义的脚本,用于从消息定义文件中生成相应的代码。

msg文件夹中的PX4uORBMsgGen.m脚本的作用是自动化地处理消息文件,并将其集成到 PX4 固件中,以便固件能够正确地处理这些消息。以下是对PX4uORBMsgGen.m脚本的部分解析:

检查固件版本,如果这个变量被设置为false,那么意味着固件版本不低于1.8。

检查是否存在两个.mat文件:CmakeInfo.mat 和 FirmwareVersion.mat。如果这两个文件都存在,它们将被加载到 MATLAB 的工作区中。

检查是否在加载的 Px4PSP_CmakeInfo 结构体变量和 FirmwareVersion 变量中找到了相应的字段。如果找到了,它们将会被提取出来,并且根据 FirmwareVersion 的值来判断固件版本是否小于2.5。如果固件版本小于等于1.8,则会将 isFirmwareLessThan1_8 设置为 true。

输出一些提示信息,指示是否找到了相应的路径和固件版本信息。

然后是一个循环,遍历指定路径下的所有消息文件。在循环中,首先读取消息文件内容,并根据固件版本进行一些处理。例如,如果固件版本较低,则可能会删除或修改一些与新固件版本不兼容的内容。

将处理后的消息内容写入到 PX4 固件的消息目录中,并更新 CMakeLists.txt 文件以确保消息被正确包含在固件编译中。

根据固件版本修改日志文件(如 logger.cpp)以确保新的消息能够被正确记录。

输出PX4 Firmware uORB modified.表示修改完成。

可在“\PX4PSP\Firmware\msg\rfly_test.msg”中查看到rfly_test.msg文件(注意:1.14版本开始是RflyTest.msg命名方式)。同时在本文件夹的CMakeList.txt中也可看到新增的rfly_test.msg消息,如下图所示。

在进行自动代码生产和固件烧录后,打开QGroundControl软件,点击左上角Logo在弹出的对话框中,选中Analyze Tools,在Mavlink控制台中输入:

可以发现,和本例程我们自定义的uORB消息的输入是一致的。

相关资料:

[1]. 全权,杜光勋,赵峙尧,戴训华,任锦瑞,邓恒译.四旋翼飞行器设计与控制[M],电子工业出版社,2018. [2]. PX4官网:https://docs.px4.io/main/zh/index.html

附加资源:

RflySim官方文档 https://rflysim.com/doc/zh/

社区交流:加入RflySim技术交流群 951534390

  • 19
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值