Tagebuch von Spargel

最近zennに移行しましたhttps://zenn.dev/spargel

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操作およびセンサの値が取得できる.

jp.mathworks.com

rostopic listなどのコマンドも使用可能.