目次
1. はじめに
LIMO を ROS 2 で制御するために、AgileX 社は limo_ros2 パッケージを公開しています。
ROS 2 や limo_ros2 は、デフォルトで LIMO にインストールされていないため、本稿では LIMO 上で ROS 2 を動作させ limo_ros2 パッケージを実行するまでの方法をご案内します。
limo_ros2(foxy branch): https://github.com/agilexrobotics/limo_ros2
LIMO で ROS 2 を動作させる際には、docker を用いて LIMO 上に仮想環境を用意する方法を使用します。
なお、limo_ros2は現在も開発が続いているため、今後の動作方法は本稿と異なるものになる可能性もございます。予めご了承ください。
※本記事は「LIMO Basic」上にROS2 foxyの仮想環境を構築する方法を紹介するものです。
「LIMO Pro」「LIMO ROS2」ではこの方法は使用できません。
2. 環境
以下の環境にて、この手順が有効であることを確認しています。
外部PC: Windows 10 (64bit)
LIMO:
内部コンピュータ – Jetson Nano
OS – Ubuntu 18.04
3. リモートデスクトップのセットアップ
外部PCから無線接続している LIMO を GUI 上から操作したり RViz を表示したりするのに、リモートデスクトップツールの NoMachine を利用します。
(1) LIMO と外部PCを同じWi-Fi に接続
(2) リモートデスクトップツール NoMachine のダウンロード
対応する NoMachine を外部PCにダウンロード・インストールしてください。
(3) NoMachine を起動し、Add ボタンから LIMO を登録
「Name」には任意の名前を入れ、「Host」にはLIMOのIPアドレスを入力します。LIMO のIPアドレスは、LIMO側の NoMachine のアイコンから「show server status」をクリックすると確認できます。
(4) 登録したデバイスを選択し、LIMO のユーザー名(agilex)、パスワードを入力
以下の操作は全てLIMOのデスクトップ画面上で行ってください。
4. docker環境のセットアップ
ROS 2 foxy および limo_ros2 がインストール済みのdockerコンテナを作成します。
以下のGithubリポジトリにも同様の手順が記載されているのでご参照ください。
https://github.com/TechShare-inc/limo_ros2_docker
(1) リポジトリをクローンする
LIMOのデスクトップ上でTerminalを開き、以下のコマンドを実行します。
$ cd ~
$ git clone -b foxy https://github.com/TechShare-inc/limo_ros2_docker.git
(2) 必要な依存パッケージを用意する
Terminalで以下のコマンドを実行します。
$ sudo -i
プロンプトがroot権限になるので以下のコマンドをを順に実行します。
# apt install -y curl
# curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
# distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
# curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
# apt update
# apt install -y nvidia-docker2
# systemctl daemon-reload
# systemctl restart docker
# curl -L https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# exit
最後の行(exit)を実行するとroot権限ではない一般ユーザーのプロンプトに戻ります。
(3) dockerイメージをビルドする
Terminalで以下のコマンドを実行します。
$ cd ~/limo_ros2_docker
$ sudo docker-compose build
インターネットから必要なファイルをダウンロードしてdockerイメージの作成が行われます。
この操作には10分以上かかる場合があります。
(4) ビルドしたイメージからdockerコンテナを作成・起動する
Terminalで以下のコマンドを実行します。
$ sudo docker-compose up -d
先ほど作成したイメージを基にlimo_foxy_devというコンテナが作成され、起動します。
5. docker上でのROS 2パッケージの実行
(0) dockerコンテナを起動する
上記のセットアップ手順(4)でdocker-compose up
を行うとコンテナの作成と起動が同時に行われますが、LIMOを再起動したりコンテナを手動で停止させた場合は、作成済みのコンテナを再度起動する必要があります。
停止しているコンテナを起動するには、LIMOのデスクトップ上でTerminalを開き、以下のコマンドを実行します。
$ cd ~/limo_ros2_docker
$ sudo docker-compose start
(1) dockerコンテナにGUIへのアクセス権限を付与する
docker内で実行されるRvizなどのアプリケーションの画面をデスクトップに表示出来るようにするには、権限を与える必要があります。
Terminalで以下のコマンドを実行します。
$ xhost +local:
この操作はLIMO本体を再起動するたびに必要となります。
~/.bashrcなどに上記のコマンドを記載することで自動的に実行させることも出来ます。
(2) dockerコンテナにアタッチする
docker内でコマンドを実行するためには、dockerコンテナにアタッチする(内部に入る)必要があります。
Terminalで以下のコマンドを実行します。
$ sudo docker exec -it limo_foxy_dev bash
実行すると、dockerコンテナ内のrootユーザーとしてのプロンプトが開きます。(root@agilex:~/ros2_ws#と表示される)
以下「別のプロンプトで」と記載されている場合は、新しいTerminalを開き上記のコマンドを実行してdockerコンテナ内でコマンドを実行することを意味します。
また、dockerコンテナからデタッチする(外のTerminalに戻る)際には、dockerコンテナ内のプロンプトで以下のコマンドを実行します。
# exit
(3) LIMOをキーボードで操作する
実際にROS 2 のパッケージを実行して、LIMOをキーボード操作にて操縦します。
まずLIMO本体が速度指令を受け取るためのベースノードを起動します。dockerコンテナ内で以下のコマンドを実行します。
# ros2 launch limo_bringup limo_start.launch.py
次に、キーボード操作で速度指令トピックを送るノードを起動します。別のプロンプトで以下のコマンドを実行します。
# ros2 run teleop_twist_keyboard teleop_twist_keyboard
画面に表示されるメッセージに従って、速度指令を送信しLIMOを操作することが出来ます。
スマートフォンアプリを接続していた場合は、ROS / ROS 2 による操作を有効にするために、アプリ内右上のボタンでアプリからの制御をオフにしてください。
起動しているノードを停止する際は、該当のプロンプトでCtrl+Cを押します。
(4) 2D Lidarによる地図作成
LIMO搭載の2D LiDARを使用してSLAMを行います。
まずLIMO本体が速度指令を受け取るためのベースノードを起動します。既に起動している場合は二重に起動させないようにしてください。
# ros2 launch limo_bringup limo_start.launch.py
次に、キーボード操作で速度指令トピックを送るノードを別のプロンプトで起動します。既に起動している場合は二重に起動させないようにしてください。
# ros2 run teleop_twist_keyboard teleop_twist_keyboard
続いて、地図を作成するノードを別のプロンプトで起動します。
# ros2 launch limo_bringup cartographer.launch.py
地図作成を開始したら、キーボード操作でLIMOを周囲で走行させます。
作成中の地図を確認するには、可視化ツールのRvizを使用します。別のプロンプトで以下のコマンドを実行してRvizを起動します。
# rviz2
Rvizが起動したら、/mapトピックを表示に追加します。
左下のAddボタンを押し、開いたウィンドウでBy topic→/map→Mapを選択しOKをクリックします。
ある程度走行したら、作成された地図をファイルに保存します。別のプロンプトで以下のコマンドを実行します。
# ros2 run nav2_map_server map_saver_cli -f /root/sample_map
コマンド末尾の/root/sample_map.yaml
の部分はマップの保存先を示す部分なので、適宜場所や名前を変更してください。
コマンドを実行すると、指定したディレクトリに.pgmと.yamlの2つのファイルが生成されます。(上のコマンドだと/root/sample_map.pgmと/root/sample_map.yamlの2つ)
作成した地図を用いて自律走行を行います。
RVizおよびキーボード操作や地図作成のノードが起動している場合は事前にCtrl+Cで停止させてください。
まず、LIMO本体が速度指令を受け取るためのベースノードを起動します。既に起動している場合は二重に起動させないようにしてください。
# ros2 launch limo_bringup limo_start.launch.py
次に、別のプロンプトでNavigation2パッケージのノード群を起動します。
# ros2 launch limo_bringup navigation2.launch.py map:=/root/sample_map.yaml
map:=の後の/root/sample_map.yaml
の部分は読み込む地図の場所を指定する部分なので、作成した地図の保存先に合わせて適宜変更してください。
可視化ツールのRvizが自動的に立ち上がるので、2D Pose Estimateをクリックした後に地図上でクリック&ドラッグして現在のLIMOの姿勢を与えてください。
次にNavigation2 Goalをクリックし、同様の手順で目的地の姿勢を与えると経路が生成されLIMOが走行を始めます。