matlabをwsl上のROSに接続してTurtleBot3を動かす
はじめに
matlabからWSL上のROSに接続して操作する方法について記載する.
gazeboの中のTurtleBot3を操作し,データをmatlab側に読み込む.
環境
windows側
- windows10 or windows11
- matlab2022b
- ROS ToolBox
wsl2側
- Ubuntu20.04
- ROS Noetic
前提
wsl2内にROSとTurtleBot3の構築は済んでいるものとする.
導入の仕方は下記参照:
tagebuchvonspargel.hatenablog.com
手順
wslとmatlabの接続は下記を参考に行うが,そのままするとネットワーク周りでうまくいかない.
Communicate with ROS in WSL2 - MATLAB Answers - MATLAB Central
そこで下記の手順を踏む
open-sshの導入
matlabからはssh接続するため,wslにopen-sshを導入する.すでに導入済みの場合もある.
参考: How to Enable SSH Password Authentication - ServerPilot
# in wsl terminal
$ sudo apt install open-ssh
つぎに,/etc/ssh/sshd_configをエディタ(vi,vscodeなど)で開き,
例:code /etc/ssh/sshd_config
ファイル内の
PasswordAuthentication no
を
PasswordAuthentication yes
とする.Ctrl+Fで探すのが楽.
その後,sshを起動する.
# in wsl terminal sudo service ssh restart
これはwslを起動するたびに実行する必要がある.
ssh接続した際にエラーのとき:Starting OpenBSD Secure Shell server sshd sshd: no hostkeys available -- exiting.
下記コード実行
# in wsl terminal sudo ssh-keygen -A
参考:
sshd: no hostkeys available — exiting. [fail] が出た時の解決方法 | 技術屋さんの日記帳
WSL内でROSの起動
環境変数の設定(~/.bashrcに書いている場合は飛ばして良い)
~/.bashrcに下記のように書いていることを確認する.
ない場合は追記したあとにsource ~/.bashrcとする.
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0
export LIBGL_ALWAYS_INDIRECT=0
export GAZEBO_IP=127.0.0.1
export ROS_IP=$(hostname -I | tr -d [:blank:])
export ROS_MASTER_URI=http://$(hostname -I | tr -d [:blank:]):11311
起動
下記コマンド実行してgazeboとturtlebot3を起動する
# devel/setup.bashの読み込み source ~/catkin_ws/devel/setup.bash export TURTLEBOT3_MODEL=burger roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch
この時点でgazeboが立ち上がり,turtlebotが見える.

MATLABとの接続
新しいterminalを起動し,windowsとwslのIPアドレスを調べる.
# in windows terminal
$ ipconfig
vEthernet (WSL)となっているところのIPv4アドレス:xxx.xxx.xxx.xxxをメモする.
# in wsl terminal
$ ifconfig
eth0のinet:yyy.yyy.yyy.yyyをメモする.
次にMATLABを起動し,MATLABのterminalに環境変数の設定を行う.
% in MATLAB terminal >> setenv('ROS_IP','xxx.xxx.xxx.xxx')
rosにつなげることができるかは下記コマンドで確認できる
% in MATLAB terminal rosdevice(WSLipAddress, WSLusername, WSLpassword);
次にrosinit(wslipaddress)でmatlabノードの初期化を行う.
%in MATLAB Terminal rosinit('yyy.yyy.yyy.yyy')
うまく起動できると,下記のようにメッセージが出る(ipaddressは環境により異なる)

この後は,下記公式ページの"Move the robot"以降を参照して行えば,robot操作およびセンサの値が取得できる.
rostopic listなどのコマンドも使用可能.
