ROS和MATLAB实现服务通信

  • 硬件条件:两台装有ubuntu的电脑
  • 需求:一台工控机向机器人电机端发送指令,一台电脑安装有MATLAB进行实施运动规划。MATLAB和工控机上的ROS节点建立服务通信,采用自定义的数据类型方便数据传输
  • 实现方式:ROS中的服务通信,工控机是server端,laptop是client段,服务通信要求client发送数据并从server端接收返回值
  • 前置工作:网线直连,IP地址配置

参考链接:

ROS多机器通信_awhuter的博客-CSDN博客_ros 多机器

一、自定义服务数据类型的实现

参考链接:

Create Custom Messages from ROS Package- MATLAB & Simulink- MathWorks 中国

ROS Custom Message Support- MATLAB & Simulink- MathWorks 中国

后者指明了必须先定义好如下文件结构(每一个条目都不能少):

 其中“custom_robot_msgs”是数据包的名字,本文中制定的数据包名为“lander”。上述文件夹都被放在一个package文件夹内,在该目录下执行:

rosgenmsg('......\package'')

即可在数据包lander的同级目录下生成“matlab_msg_gen_ros1”文件。这行代码没有抱错的话,按照提升继续完成后续操作即可。

执行rosmsg list可以查看自定义通信数据结构是否被顺利建立。会生成两个新的数据类型,lander/...Request和lander/...Response

二、MATLAB端代码编写

工控机端采用的语言是C++,编译器是vsCode,其环境配置和服务端实现可供参考的资料较多。

参考链接:Introduction · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程

MATLAB端服务通信可供参考资料较少,主要参考MathWorks Help Center。

主要代码如下:

% 初始化ROS网络, 网线通讯已经搭建好,不需要再设置默认端口
rosinit 
%% 使用'rossvcclient'创建一个客户端,采用我们自定义的数据结构
% rossvcclient的参数是在服务器(lander)端定义的话题名称
lander_client = rossvcclient('PlanMsg');
% 检查通讯是否建立
if(isServerAvailable(lander_client))
    [connectionStatus,connectionStatustext] = waitForServer(lander_client)
end
% 创建服务请求函数
req_msg = rosmessage(lander_client);
% The default service request message is an empty message of type serviceclient.ServiceType.
req_msg.CommandIndex = 0;
% 向工控机发送命令
lander_resp = call(lander_client, req_msg);

在matlab端获取ROS全局参数【记得要在参数名前加/】:

% 启动ROS参数服务器
GlobalParam = rosparam;

%% 判断上个指令的动作是否执行完毕,并发送数据
    if count ~= 0
        while isFinishFlag == false
            isFinishFlag = get(GlobalParam, '/isFinishFlag');
        end
    end

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值