我是靠谱客的博主 激情蜗牛,最近开发中收集的这篇文章主要介绍ROS与Simulink联合仿真(四):Simulink接口Subscribe模块Blank Message模块Publish模块参考文献,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

Subscribe模块

ROS Network Configure

IsNew

Msg

Blank Message

非Blank Message

Sample time

Blank Message模块

Bus Assignment

Matlab function使用

Publish模块

参考文献


Subscribe模块

  Simulink中msg以bus(结构体)形式存在,通过Subscribe模块实现对topic msg的订阅。Subscribe模块较为关键参数:IsNew、Msg、ROS Network Configure、Sample time。

ROS Network Configure

  配置主节点的Address、Port地址。

IsNew

  IsNew为Subscribe模块输出之一,当在上一采样时刻有新消息订阅时,输出为1。该输出可与Enabled Subsystem模块配合使用。

Msg

  Msg为Subscribe模块输出之一,其输出可分为Blank Message与非Blank Message。

Blank Message

  当无消息进入时,Msg输出为Blank Message,即0。

非Blank Message

  当有消息进入时,Msg输出为topic中的Message。因自定义或ROS消息中含有可变嵌套结构体数组,对该Msg一般处理如下:

  • 判断数据是否有截断。通过比较Bus中CurrentLength与ReceivedLength大小来判断,若CL<RL,则认为该Msg在Simulink支持的最大长度不足,需要调整。
  • 调整Msg最大支持长度。通过Simulink中的APPS,搜索ROS,调出VariableSize Messages,在该界面下对该Msg的最大长度进行调整,使其CL=RL。

  以上步骤是针对可变而引起的Msg截图,进行的操作。

  • 读取Msg中的嵌套结构体数组。利用Matlab function读取数组大小,利用for循环,对其中的结构体字段进行提取,最后输出。

  以上步骤为对嵌套结构体数组的处理。

  注:对Subscribe模块中的Msg,若Bus中含有Bus即存在Sub Bus(嵌套结构体),直接Bus Selector会报错,可采用matlab function或Selector模块处理。

Sample time

  Subscribe模块中的采样时间,需设为与发布topic频率相同,如果采用继承采样时间(-1),则会导致Msg无法传输进Subscribe。博主在开始未注意采样时间,不同Subscribe的topic均设置为-1,导致Msg无法传输进Subscribe,其值一直为0,即Blank Message。

Blank Message模块

  Blank Message模块需结合Bus Assignment或matlab function使用,对于复杂Msg格式或加入Header,建议使用matlab function模块。

Bus Assignment

  对于简单的Msg结构体,可利用Bus Assignment来组合消息。

Matlab function使用

  通过matlab function模块增加Header、CurrentLength等,具体步骤如下:

  • 定义输出变量Msg。在matlab function中Edit data,对Msg变量进行Type定义,将其定义为相应topic msg的结构体。窗口输入ros.createSimulinkBus('model_name','msg_name'),可生成相应topic msg结构体
  • 添加Header。利用Current time模块,可读取Sec、Nsec。Header及CurrentLength添加代码如下:
persistent i
Seq_Name = uint8('Name');
Strlength = length(Seq_Name);

if isempty(i)   
    i = 0;   
end
i =  i + 1;

msg = blankMessage;
msg.Header.Stamp.Sec = ROS_Sec;
msg.Header.Stamp.Nsec = ROS_NSec;

msg.Header.Seq = uint32(i);
msg.Header.FrameId(1:Strlength) =Seq_Name;
msg.Header.FrameId_SL_Info.CurrentLength = uint32(Strlength); 

注:Simulink不支持可变大小数组,所有数组必须是定长度。可参考参考文献2中的说明。

Publish模块

  Publish模块与Subscribe模块用法相同,故不再进行阐述,详情可参考matlab help。

参考文献

1.https://ww2.mathworks.cn/help/ros/ug/get-started-with-ros-in-simulink.html

2.https://ww2.mathworks.cn/help/ros/ug/work-with-ros-messages-in-simulink.html

3.https://ww2.mathworks.cn/help/ros/ug/manage-array-sizes-in-simulink-ros.html

4.https://blog.csdn.net/xiaolong361/article/details/104405516

最后

以上就是激情蜗牛为你收集整理的ROS与Simulink联合仿真(四):Simulink接口Subscribe模块Blank Message模块Publish模块参考文献的全部内容,希望文章能够帮你解决ROS与Simulink联合仿真(四):Simulink接口Subscribe模块Blank Message模块Publish模块参考文献所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部