matlab简单界面ros通信

本文介绍如何使用Matlab的可视化编程功能创建一个ROS速度控制工具,包括界面设计、控件回调函数编辑及运行效果展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载:古月老师 http://www.guyuehome.com/1047

MatLab有非常便捷的可视化编程,我们可以借助Matlab来制作一些小的可视化工具,我们在之前的博客中,使用rviz的插件功能实现过一个速度控制的小工具,今天就来探索研究如何用Matlab来实现类似的工具。

本文使用的完整代码可见:github

 

一、了解Matlab的可视化编程

 

Matlab的可视化编程非常简单,首先在命令窗口中输入“guide”命令来启动可视化编程:

Image

 

 

然后选择默认的空窗口,点击“OK”,然后会出现如下的可视化编辑界面:

Image

 

 

在这个界面中,我们可以从左边的控件列表中选择创建按钮、编辑框等控件:

Image

 

 

创建控件后就可以编辑该控件的回调函数,从而实现该控件的对应功能。

 

二、创建界面

 

了解了上边创建控件的基础知识,我们接下来就来动手做一个速度控制的界面。

首先从左侧控件列表中选择一个“Edit Text”控件,然后在主窗口中点击并拖动鼠标来绘制控件的位置。

 

Image

 

现在控件的命名和默认内容不是我们想要的,双击控件,可以修改相应的属性。

 

Image

 

这个输入控件是用来输入ROS_MASTER_URI的,同样的方法,我们再来创建一个输入框,用来输入topic name:

 

 Image

 

接下来,我们需要创建一些按键,并且编辑按键的属性,最终的界面如下:

 

 Image

三、编辑控件回调函数

 

界面我们已经设计完成了,接下来我们来编辑每个控件的功能,即回调函数。保存目前设计的界面,命名为myTeleop,在保存路径下,我们可以看到出现了一个.fig文件和一个.m文件,前者是界面设计,上一节已经实现,后者是这一节将要编辑的代码文件。在上一篇中我们已经讲到了Matlab中可用的一些ROS接口,这里的核心代码基本还上一篇类似,忘记的同学可以参考上一篇。

 

1.设计全局变量

考虑到该工具所应用的一些功能,我们首先在代码声明一些全局变量,方便不同回调函数的使用。

 

  1.     % 声明一些全局变量
    
        % ROS Master URI和Topic name
    
        global rosMasterUri
    
        global teleopTopicName
    
         
    
        rosMasterUri = 'http://192.168.1.202:11311';
    
        teleopTopicName = '/cmd_vel';
    
         
    
        % 机器人的运行速度
    
        global leftVelocity
    
        global rightVelocity
    
        global forwardVelocity
    
        global backwardVelocity
    
         
    
        leftVelocity = 2;        % 角速度 (rad/s)
    
        rightVelocity = -2;      % 角速度 (rad/s)
    
        forwardVelocity = 2;     % 线速度 (m/s)
    
        backwardVelocity = -2;   % 线速度 (m/s)

     

2.URI输入框和Topic name输入框

两个输入分别对应ROS_MASTER_URI和Topic name,在输入之后,我们需要将输入的字符串保存到全局变量当中,所对应的回调函数如下:

    % 设置ROS Master URI

    function URIEdit_Callback(hObject, eventdata, handles)

     

    global rosMasterUri

    rosMasterUri = get(hObject,'String')

     

    % 设置Topic name

    function TopicEdit_Callback(hObject, eventdata, handles)

     

    global teleopTopicName

    teleopTopicName = get(hObject,'String')

3.建立连接和断开连接的按键

建立连接的按键在点击之后需要初始化Matlab中的ros环境,并且和ROS master建立连接,还需要初始化速度指令的发布者。

断开连接的按键在点击之后关闭Matlab中的ROS即可。

    % 建立连接并初始化ROS publisher

    function ConnectButton_Callback(hObject, eventdata, handles)

     

    global rosMasterUri

    global teleopTopicName

    global robot

    global velmsg

     

    setenv('ROS_MASTER_URI',rosMasterUri)

    rosinit

    robot = rospublisher(teleopTopicName,'geometry_msgs/Twist');

    velmsg = rosmessage(robot);

     

    % 断开连接,关闭ROS

    function DisconnectButton_Callback(hObject, eventdata, handles)

     

    rosshutdown

 

4.运动控制按键

最后是四个控制前后左右的按键,按下对应的按键,就会发布相应的运动指令。

    % 向前

    function ForwardButton_Callback(hObject, eventdata, handles)

     

    global velmsg

    global robot

    global teleopTopicName

    global forwardVelocity

     

    velmsg.Angular.Z = 0;

    velmsg.Linear.X = forwardVelocity;

    send(robot,velmsg);

    latchpub = rospublisher(teleopTopicName, 'IsLatching', true);

     

     

    %向左

    function LeftButton_Callback(hObject, eventdata, handles)

     

    global velmsg

    global robot

    global teleopTopicName

    global leftVelocity

     

    velmsg.Angular.Z = leftVelocity;

    velmsg.Linear.X = 0;

    send(robot,velmsg);

    latchpub = rospublisher(teleopTopicName, 'IsLatching', true);

     

     

    % 向右

    function RightButton_Callback(hObject, eventdata, handles)

     

    global velmsg

    global robot

    global teleopTopicName

    global rightVelocity

     

    velmsg.Angular.Z = rightVelocity;

    velmsg.Linear.X = 0;

    send(robot,velmsg);

    latchpub = rospublisher(teleopTopicName, 'IsLatching', true);

     

     

    % 向后

    function BackwardButton_Callback(hObject, eventdata, handles)

     

    global velmsg

    global robot

    global teleopTopicName

    global backwardVelocity

     

    velmsg.Angular.Z = 0;

    velmsg.Linear.X = backwardVelocity;

    send(robot,velmsg);

    latchpub = rospublisher(teleopTopicName, 'IsLatching', true);

四、运行效果

 

OK,到此为止,我们已经在Matlab中实现了速度控制插件的界面和代码,接下来就可以运行看效果了。

这里以小海龟的仿真作为控制对象,在ubuntu中运行ROS,并且查看ROS_MASTER_URI,然后运行小海龟仿真器。

Image

 

 

然后在matlab中运行我们刚才实现的速度控制工具,并且在输入框中输入对应的信息。

 

Image

 

 

接着点击“建立连接”,如果一切正常的话,可以在Matlab的命令窗口中看到如下信息:

Image

 

 

这样就可以开始控制了,我们点击前、后、左、右的按键(点击之后要放开鼠标),可以看到小海龟确实可以按照我们的指令运动。

 

Image

 

这样,我们就使用Matlab的可视化编程界面实现了一个ROS速度控制的小工具,更多功能和应用还等待我们继续探索。

### 设置MATLABROS的本地通信 为了实现在Ubuntu系统上配置MATLABROS之间建立有效的本地通信,需遵循一系列特定操作流程。 #### 安装必要的软件包和支持工具 确保已安装了支持版本的MATLAB以及对应的Robotics System Toolbox。对于基于Ubuntu 20.04 LTS环境下的ROS Noetic Ninjemys,应确认MATLAB R2021a已经正确安装并能够访问Robotics System Toolbox功能集[^1]。 #### 配置ROS节点与MATLAB交互 启动MATLAB之后,可以通过调用`rosinit()`函数初始化ROS客户端实例,这一步骤会自动检测当前计算机上的默认ROS Master URI,并创建一个名为`matlab_client`的新节点加入到ROS网络中。如果需要指定其他主机作为Master,则可通过传递参数给此函数完成自定义设置: ```matlab % 初始化ROS客户端,默认连接至localhost上的master rosinit(); ``` #### 运行示例程序验证连通性 利用内置的例子来测试两者间的通讯状况是一个不错的选择。例如,通过执行如下命令可打开一个关于无人机控制的应用场景,其中包含了完整的ROS集成过程展示: ```matlab openExample('uav_ros/ControlASimulatedUAVUsingROS2AndPX4BridgeExample'); ``` 上述例子不仅提供了直观的操作指南,而且有助于理解实际应用中的数据交换机制[^2]。 #### 查看活跃的话题列表 当仿真平台正常运作时,在MATLAB命令行界面键入`rostopic list`查看当前活动的话题名称集合,以此检验是否存在预期的消息通道如`/location`等。这一环节对于调试阶段尤为重要,因为它可以帮助开发者快速定位可能存在的问题点[^3]。 #### 编辑CMakeLists.txt和package.xml文件(如有必要) 某些情况下,可能会涉及到修改位于工作空间内的`CMakeLists.txt`或`package.xml`这两个关键配置文档,特别是当你打算扩展现有的ROS包或是引入新的依赖项之时。这些改动允许更灵活地管理项目结构及其关联资源[^4]。 ```xml <!-- 示例:向package.xml添加额外依赖 --> <build_depend>rostime</build_depend> <exec_depend>rostime</exec_depend> ``` ```cmake # 示例:更新CMakeLists.txt以包含第三方库路径 find_package(catkin REQUIRED COMPONENTS rostime) include_directories(${catkin_INCLUDE_DIRS}) target_link_libraries(your_node ${catkin_LIBRARIES}) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值