MATLAB2022b和ROS的通讯 (MATLAB–Windows ROS–虚拟机)
提示1:本次Windows是win10,MATLAB是MATLAB2022b
提示2:虚拟机用的是VMware,ubuntu20.04,对应的ROS版本是noetic
提示2:确保MATLAB安装了Robotics System Toolbox,并更新到最新的版本
一、本次想实现MATLAB发送数据ROS控制小乌龟移动
前言:要把两个强大的工具融合在一起,把ros的数据传输到MATLAB上做计算处理,再把数据传回到ROS
1.连接自己热点
2.关闭防火墙 (Windows 和 Ubuntu)
window端
- 先打开自己的控制面板
2.选择 - 系统和安全
3.选择-Windows Defender 防火墙
4.选择- 启用或关闭Windows Defender 防火墙
a)选择–>关闭防火墙
b)再按–>确定
Ubuntu端
1.新建一个终端
2.查看一下自己的防火墙是否关闭
sudo ufw status
3.关闭防火墙
sudo ufw disable
提示:打开防火墙的指令是 sudo ufw enable,这里我就不演示了
4.再确认是否关闭防火墙
要是还不行,重启就OK了 ,beacause重启解决99%的问题-----哈哈哈
提示:到这里第二部分算是完成了
3.虚拟机ubuntu设置成桥接模式
提示1:虚拟机要关机 ,再设置虚拟机,否则会出现意想不到的bug
提示2:这里我本身就设置了桥接模式,你们可以根据我给的步骤(图片)去执行就行了
4.查看自己的IP地址并把IP地址写到/hosts
a)查看自己的ip地址
Ubuntu端
新建一个终端,再输入ifconfig
ifconfig
找到自己的IP地址
Windows端
Ctrl+R 打开终端,再输入cmd
再输入ipconfig查询IP地址
因为我是连接WiFi因此找到无线局域网适配器WLAN
怎么算是判断在同一网段呢?那么这边我随便瞎编一下IP的地址吧,如果之前我们Ubuntu查询的地址为192.168.1.1,那么我的Windows端就一定在192.168.1.x(这里的x为随机的一个值2),因此就可以找到这个IP地址
若想深度理解的话,可以参考这位大佬(淘客有道)的文章
参考链接:
[如何判断两个IP地址是否在同一个网段?什么是子网掩码? - 淘客有道的文章 - 知乎
https://zhuanlan.zhihu.com/p/425228726]
b)查看用户名
Windows端
找到设置,选择系统
找到关于
就可以找到用户名了
Ubuntus端
新建一个终端,输入ls /home
ls /home
则会查看到你的用户
c)把IP地址写到/hosts
Windows端
我的Windows端/hosts在路径
打开hosts :
提示1:这里我用的编辑器是notepad++进行编辑,你们可以用记事本的形式
提示2:注意运用管理员身份打开
根据我们在Windows和Ubuntu查询到的IP地址,我们把它添加到这里
格式是:
这里的IP地址是我假设的,实际情况要看你自己IP地址,因此如有雷同,纯属巧合
#Windows
192.168.1.1 windows用户名
#Ubuntu
192.168.1.2 ubuntu用户名
Ubuntu端
终端输入
sudo gedit /etc/hosts
根据上述Windows端操作写进去
5.把Windows端的IP添加到~/.bashrc文件上
输入
gedit ~/.bashrc
添加下面这句话
export ROS_IP=192.168.1.1
保存之后,再更新~/.bashrc文件
6.ROS和MATLAB的通讯
a) MATLAB在命令行输入
setenv('ROS_MASTER_URI','http://192.168.1.1:11311/');
setenv('ROS_IP','192.168.1.2')
上面是个模版,实际情况你们自己再填,说完这次就不提示了,太累了
b) 在ubuntu中运行ros核心
roscore
c) 再到MATLAB输入
rosinit
出现下面代码说明两个都能连通
7.MATLAB发送数据给ROS,控制小乌龟移动
a)首先在ROS启动ros的小乌龟节点
rosrun turtlesim turtlesim_node
b)用MATLAB查看一下 ros的话题
rostopic list
c)然后我们新建一个MATLAB实时脚本,输入
learn_turtlesim_pub = rospublisher('/turtle1/cmd_vel', 'geometry_msgs/Twist');
learn_turtlesim_msg = rosmessage(learn_turtlesim_pub);
learn_turtlesim_msg.Linear.X = 10;
learn_turtlesim_msg.Angular.Z = 5;
send(learn_turtlesim_pub, learn_turtlesim_msg); % 使用发布者对象的 send 方法发送消息
点击运行
小乌龟移动
c)再ros端,打印一下我们MATLAB发送的数据
运行代码:
rostopic echo /turtle1/cmd_vel
二、参考的链接:
淘客有道
[如何判断两个IP地址是否在同一个网段?什么是子网掩码? - 淘客有道的文章 - 知乎
https://zhuanlan.zhihu.com/p/425228726]
wujiangzhu_xjtu
http://t.csdnimg.cn/eaAaI
三、总结
本次从MATLAB与ros的通讯的失败,尝试过卸掉MATLAB(因为版本过低),再到ros与MATLAB之间能通讯,但出现了ros接受不到MATLAB发送数据的问题。
最后,向b站up主SunProdefi 表示谢意 ,感谢一部分的建议,还有up主制作的视频。本文经过视频操作还出些了一些问题的补充。