WSLにROS2環境を構築しWindowsから通信する
ROSを使ったロボットやその他デバイスは動かしたいけど、Ubuntuは管理したくない
そんなことないでしょうか?
そんなときに便利なのが、rosbridgeです。
通常TCPに基づいて通信するアプリケーションはROSとのコミュニケーションが不可能ですが、
Webソケットを作成してROSと非ROSの間でJSON形式で通信することができるノード(rosbridge)をROS環境上で実行させることで、非ROSとの通信が実現することができます。
今回はそのrosbridgeを利用して、
rosbridgeサーバ(Ubuntu)とroslibpyクライアント(Windows)間でROSとの通信環境を構築してみます。
やりたいこと
Windows上でクライアントアプリケーションを実行し、
WSLのUbuntu上でrosbridgeとROS2を実行し、通信を行う。
通信イメージは以下のようだと思っています。(下図で知識レベルは察してください)
本ページの目標
ROS2ノードのturtlesimをWindowsから制御することを目標としたいと思います。
環境
以下の環境で実行しました。
- Windows11
- Ubuntu20.04 on WSL2
- Python:3.8.10
WSL環境の構築
Windows PCだけで作業を行いたいので、今回はWindows上で構築できるLinux環境WSLを使用します。ここからWSLの環境構築手順を示します。
WSL2のインストール
WSLのインストールはとても簡単です。
powershellで以下コマンドを実行してください。
wsl --install
基本的にはこれだけでインストールできます。
インストール後は、Linuxパスワードの設定が必要です。
ディストリビューション指定してインストールする場合は以下のコマンドを実行してください。
wsl --install -d <DistroName>
<DistroName>
は以下から取得します。
wsl --list --online
WSLを最初からやり直すには
- 一度入れたWSLをアンインストールする
Windowsの設定→アプリ→アプリと機能から該当するディストリビューションを選択しアンインストールする - 同じディストリビューションをまっさらな状態にする
Windowsの設定→アプリ→アプリと機能の該当ディストリビューションから詳細オプションをクリックし、リセットボタンを押す
リモート接続のためのVScode拡張機能
別にコンソール使うから良い、って人はこの項目読み飛ばしてください。
VSCodeを使っているならRemote Development
拡張機能をインストールをするのが便利です。
拡張機能からremote
とでも打つと検索の上のほうに出てくると思います。
インストール後は左のバーからリモートエクスプローラのタブが出ます(ディスプレイマークの右下にリモートデスクトップのアイコンが重なってるやつ)。
WSL TargetsからインストールしたLinuxディストリビューションを選べば、WSLにログインができます。
ここまでで、WSLにログインすることができるはずです。
ログイン時にはWSLをインストールした際に設定したLinuxのパスワードを聞かれると思いますので打ち込んでログインしてください。
WSLの初期設定
ここからはWSLでの作業になります。
特にいじらずにログインするとユーザフォルダになると思います。
そのまま以下のコマンドを打ち込んでください。
sudo apt update
上記が済んだら下記も実行してください。
sudo apt install x11-apps -y
こちらはWindwosのX Window Systemサーバと通信するためのクライアントアプリをインストールしてます。
サーバアプリ側はWindowsのアプリとしてインストールする手順を後述します。
bashrcに追記
WSLが初期設定のままだとX Window Systemのサーバを見つけれられませんので、以下の設定をbashrcに追記します。
# wslがx serverを見つけられるようにするための設定
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
ちなみに、最後の記述はresolv.conf
に書いてあるnameserver
のIPアドレスをDISPLAY
環境変数に設定するよ、ということのようです。
↓こちらのかたの解説がとても参考になりました。
RViz, Gazeboの設定
※rviz, gazeboは、今回は使いませんがROSを利用しているなら使用するシーンはあると思いますのでおすすめ設定として記載してます。同様にbashrcに追記してください。
- rvizとx serverの通信設定
export LIBGL_ALWAYS_INDIRECT=""
- gazeboとx serverの通信設定
export GAZEBO_IP=127.0.0.1
最後にbashrcの設定を適用するために設定の更新をしてください。
source ~/.bashrc
X Window Systemサーバの構築
Windowsで、X Window SystemのサーバアプリVcXsrvをインストールします。
👇ダウンロードはこちらから。
👇ここからの手順はこちらのサイトを参考にしています。
上記サイトのVcXsrvの初期設定手順を引用します。
- 「スタート」からxlaunch.exeを起動。
- multiple windowを選択し、次へ。
- start no client を選択し、次へ.
- Additional parameters for VcXsrv という入力フォームに 「-ac -nowgl」と入力し、次へ。
- Save configurationを押下して、設定ファイルをどこかに保存。
- 完了を押下して、VcXsrvを起動。
ついでに設定ファイルはWindowsのスタートアップに登録しておきましょう。
-
Windows + R
でファイル名を指定して実行にshell:startup
と打ち込む - 開いたフォルダにVcxsrvを起動したときに作られた設定ファイルを配置する
これでWindows起動時にX Windows Systemサーバの設定が適用されます。
X Window Systemサーバへの表示確認
VcXsrvの設定ができたら、以下で動作確認をしてみましょう。
xeyes
こんな感じでギョロメが出たらOKです。
これでWSLでGUIが有効になりました。
ROS環境の構築
これまでに構築したWSL上にROS環境を構築します。
ROS2のインストール
今回はROS2をインストールしていきます。
インストールは方法は公式に従ってください。
Proxy環境下でもなければ、特にはまることもないはずです。
ちなみに私は、Environment setup
にある下記のROSの環境変数設定のためのコマンドは、毎回打ち込むの面倒なのでbashrcに書き込んでいます。
source /opt/ros/foxy/setup.bash
ROS2動作確認
ROS2がインストールできたか確認してみましょう。
以下を実行してみてください。
ros2 run turtlesim turtlesim_node
こんな感じでkameがVcXsrvのWindowに映し出されたでしょうか?
ひとまずkameさんに出会えたなら、WSLのROS2環境構築は完了です。
RViz, Gazeboの起動確認
上のbashrcの設定でRVizとGazeboの設定を追記していたなら以下で動作確認可能です。
RViz
rviz2
画面が表示されればOKです。
Gazebo
ついでにGazeboも表示されるか動作確認します。
GazeboはROS2のデフォルトパッケージに含まれていないようですので、以下からインストールしましょう。
sudo apt install ros-foxy-gazebo-ros-pkgs
インストールできたら、以下のコマンドで画面が表示されるか確認してみてください。
gazebo
rosbridge-suite
ROSパッケージのrosbridge-suiteのfoxy版をインストールします。
以下を実行して、パッケージをインストールしてください。
sudo apt install ros-foxy-rosbridge-suite
インストール出来たら、
以下のコマンドでrosbridgeサーバを起動します。
ros2 launch rosbridge_server rosbridge_websocket_launch.xml
これにより以下のようなログが出ていたら、rosbridgeサーバが起動しています。
[rosbridge_websocket-1] [INFO] [1652491717.603733094] [rosbridge_websocket]: Rosbridge WebSocket server started on port 9090
これを見ると、9090ポート経由でWebソケットが作成されているようですね。
ここまでで、rosbridgeサーバが立ち上がり、TCPプロトコルで通信ができるようになりました。
次が最後の仕上げです。
rosbridgeサーバ経由でROS2のturtlesimノードに指示してみましょう。
再度turtlesimノードを起動しておきます。
ros2 run turtlesim turtlesim_node
この時点で、rosbridgeが起動しているターミナルと、turtlesimが起動しているターミナルの2つが存在することになります。
あとは、ROS2側とつながるWindow側クライアントを実装していきましょう。
Windows側ROS通信クライアント
👇このかたのサイトを参考に、クライアント用pythonスクリプトからturtlesimへ指示を出します。(参考に、というかほぼ丸パクリです...)
実装の前に、roslibpy
ライブラリをインストールします。
下記コマンドを実行してください。
pip install roslibpy
インストールが出来たら、以下のスクリプトを保存して実行してみてください。
やることはこれだけです。
# -*- coding:utf8 -*-
import time
from roslibpy import Message, Ros, Topic
def main():
# roscoreを実行しているサーバーへ接続
ros_client = Ros('localhost', 9090)
# Publishするtopicを指定
publisher = Topic(ros_client, '/turtle1/cmd_vel', 'geometry_msgs/Twist')
def start_sending():
while True:
if not ros_client.is_connected:
break
# 送信するTwistメッセージの内容
publisher.publish(Message({
'linear': {
'x': 2.0,
'y': 0,
'z': 0
},
'angular': {
'x': 0,
'y': 0,
'z': 1.8
}
}))
time.sleep(0.1)
publisher.unadvertise()
# Publish開始
ros_client.on_ready(start_sending, run_in_thread=True)
ros_client.run_forever()
if __name__ == '__main__':
main()
それではスクリプトを実行してみましょう。
以下を実行してみてください。
python sample.py
どうですか?
kameがくるくると泳いでる様子が見れたでしょうか?
ちなみに、rqt
で起動しているノードを確認することができます。
rqt_graph
rosbridgeがturtlesimに対して速度指示を送信していることがわかりますね!
送信メッセージのlinear
やangular
の値を変えるとkameの軌道が変わると思います。
ぜひ試してみててください👍
まとめ
Windows上のPythonスクリプトからrosbridgeサーバ経由でROS2のturtlesimノードに指示を出してみました。
今回行ったことは以下です。
- WSL2(Ubuntu20.04)のインストール
- ROS2をWSLにインストール
- rosbrige-suiteをインストール
- クライアント用pythonスクリプトを作成
次はもうちょっとこの環境のカスタマイズ方法を模索していきたいなーと思っています。
最後まで見ていただいたかたありがとうございました😊
Discussion