ROS与Simulink联合仿真(四):Simulink接口

目录

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

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值