このレポジトリでは、つくばチャレンジのCoderDojo武蔵小杉チームが開発するCub2とmCub向けのソフトウェアを管理している。
- Cub2またはmCubを用意
- UbuntuやWSLgやmacOS等、ここのサポート環境の項目にあるパソコンでも利用可能
- このレポジトリをClone
cd ~
(gitレポジトリをホームディレクトリ直下へ配置することを前提に解説するが、他のディレクトリでも問題ない)git clone https://github.com/CoderDojoMusashikosugi/Cub_ROS.git
cd ~/Cub_ROS
(以降はこのディレクトリ内で実行することを前提に解説する)git submodule update --init
- 実行に必要なソフトウェアをインストール
- Dockerをインストール
./docker/install.sh
- 環境によってはインストール出来ない。その場合は自力で。
- 再起動の指示が出たら、再起動して
cd ~/Cub_ROS
に自力で帰り、次の手順を続ける。この項目の最後の再起動でまとめてやっても大丈夫。
- Cub2の場合 Cub2向けデバイス設定をインストール
./scripts/install_host_settings.sh
- mCubの場合 mCub向けデバイス設定をインストール
./scripts/mcub_host_settings.sh
- Dockerをインストール
- 設定
- Cub2の場合 target.envを
CUB_TARGET=cub2
にする (デフォルトでそうなっているので基本的には対応不要) - mCubの場合 target.envを
CUB_TARGET=mCub
にする。ここ変更しないとmCubで立ち上がらないので注意。
- Cub2の場合 target.envを
- 再起動する
- 再起動後
cd ~/Cub_ROS
に返ってくるのをお忘れなく。
- 再起動後
- m5atom/README.mdの内容の通りにM5 Atomにプログラムを書き込む。
- Cub2やmCubをGUI操作可能な画面を用意し、そこでターミナルを立ち上げて
./run.sh
を実行- 言い換えれば、コンピュータ起動後最初の./run.shはssh経由でやらないほうが良い。やるとGUIにRViz等が出なくなってしまう。もしsshから初回起動してしまった場合は、一旦
exit
して./stop.sh
の後再度./run.sh
すべし。- こうなるのは、dockerコンテナを立ち上げた際の画面にGUIを出す設定となっているため。一度stopすると良いというのは、dockerコンテナを立ち下げる操作であるため。
- MacはVNC環境側に画面を出すため、どこで起動しても大丈夫。
- 初回は10GB程度のダウンロードが入る。完了までひたすら待つ。
- 言い換えれば、コンピュータ起動後最初の./run.shはssh経由でやらないほうが良い。やるとGUIにRViz等が出なくなってしまう。もしsshから初回起動してしまった場合は、一旦
- 完了したらDocker環境に入れる。
- もしこのシェルを
exit
しても、コンテナ自体は立ち上がり続けている。再度./run.sh
すれば再度入れる。
- もしこのシェルを
- 他のターミナルを開いて同様に./run.shすればもっとシェルを増やせる。
- GUIのアプリをssh経由で立ち上げようとも、画面はCub2/mCub側に出る。
- 以降はこの./run.shまで実行されていることを前提に解説する。
- RViz2(
rviz2
で起動する)等のGUIは基本的にはデスクトップ上に出るが、macでだけ出せないので代わりにwebブラウザから http://localhost:6080 にアクセスした先に出す。詳しくはTiryoh/docker-ros-desktop-vncを参照。
- ビルドを実行する
cd colcon_ws
colcon build --symlink-install
- (↑を入力するのが長くて面倒なので、一応
cb
というエイリアスで上記を一気に実行して元のディレクトリに戻れるようにしてある。)
- もし
colcon build --symlink-install
がエラー終了する場合は↓- 依存するライブラリが不足していそうな場合は、一度./run.shの環境から
exit
して、./stop.sh
してから再度./run.sh
するとビルドが通るようになっている場合がある。(コンテナ立ち上げ直し) - メモリ不足で止まっていそうな場合は、
MAKEFLAGS="-j 1" colcon build --symlink-install
のようにして1並列でビルドさせることでメモリ使用量を削減可能。- ここで、1の部分が並列数なので2や3にしていくとメモリ使用量が増えてビルドは早くなる。
- 依存するライブラリが不足していそうな場合は、一度./run.shの環境から
- もしパッケージ単体でビルドしたければ(cub_bringupを例に)
colcon build --symlink-install --packages-select cub_bringup
- ここで、cub_bringupの部分が選択するパッケージなので、ここをお好みのパッケージ名にする。
- (↑を入力するのが長くて面倒なので、
cbs cub_bringup
で同じ操作が可能にしてある。)
source ~/.bashrc
を実行してビルド結果をbashから呼び出せるようにする。- (↑を入力するのが長くて面倒なので、
bashrc
で同じ操作が可能にしてある。) - これはcolcon buildごとに実行する必要は必ずしも無くて、パッケージ追加時やパッケージへのファイル追加時に実行すると吉。
- (↑を入力するのが長くて面倒なので、
- Cub2の場合 センサやアクチュエータを
ros2 launch cub_bringup hardware_cub2.launch.py
で立ち上げる- これは通信系のプロセスを一度落とすと再度立ち上がらなくなるバグへの対応。一度起動したら、ロボットの電源を落とすまでずっと立ち上げておくことを推奨する。
- mCubの場合 センサやアクチュエータを
ros2 launch cub_bringup hardware_mcub.launch.py
で立ち上げる- これは通信系のプロセスを一度落とすと再度立ち上がらなくなるバグへの対応。一度起動したら、ロボットの電源を落とすまでずっと立ち上げておくことを推奨する。
- Cub2/mCub向けのROS2ノードを実行する
ros2 launch cub_bringup cub.launch.py
- ここでCub2/mCubの選択が不要なのは、内部でtarget.envの値を見て仕分けているから(hardware_〇〇.launch.pyはまだこの仕組みを入れておらず・・・)
- ここまで実行すれば、DualSenseで操作が可能になっている
- L2(今はL1も同様の機能)を押しながら左スティック前後左右で、前後移動と左右回転ができる。
- DualSenseの矢印ボタン上下で0.1m/sずつ最高速度の変更ができる。デフォルトでは1.2m/s。
- L2は自律走行時にも重要なコマンド。自律走行のコマンドを手動操縦で上書きできるため、危険な場合の操作オーバーライドに使える。ただしL2離せば元通りなのに注意。
- DualSenseが無い場合の手動操縦には、
ros2 run teleop_twist_keyboard teleop_twist_keyboard cmd_vel:=cmd_vel_atom
等で/cmd_vel_atom
にデータを流すと動く。
- 機体を手動で初期位置に持って行く
- 理由は後述するが、地図作成開始時にオドメトリが原点のままである場合、その後の作業が楽で大変おすすめ。リセットにはcub.launch.pyを立ち上げ直す。
- 地図作成用ノードを立ち上げ
ros2 launch cub_bringup 2d_mapping.launch.py
- 正しく起動できていれば、RVizに地図が出来上がっていく。手動操縦して生成される地図の範囲を広げていこう。
- 最後に地図を保存する
mkdir ~/maps/map1 && ros2 run nav2_map_server map_saver_cli -f ~/maps/map1/map --ros-args -p save_map_timeout:=1000.0
- これで
~/maps/map1
ディレクトリに地図が保存される。
- 地図データを確認する
- 画像データなので普通に開ける。
- 全て完了したら、立ち上げたノードを(hardware_〇〇.launch.py以外)全部落とす
- ロボットを地図作成開始時の初期位置に持っていく
- ロボットを起動
ros2 launch cub_bringup cub.launch.py
- 自己位置推定とナビゲーション用ノードを起動、地図のディレクトリ指定を添えて
ros2 launch cub_navigation cub_navigation.launch.py map:=/home/cub/maps/map1/map.yaml
- ↑の操作で新しく立ち上がったRVizの画面に初期姿勢を指定する
- cub.launch.pyが立ち上げたRVizもあるので取り違えに注意
- こちらの記事の「Navigation2の実行」の項目を参考に、初期姿勢に2D Pose Estimateの矢印を置く。この初期姿勢は、今までの手順を守れば地図の原点で向きは赤い棒の方向に設定すれば良くなって便利。
- ゴールを設定する
- 上記記事の通りにNavigation2 Goalを設定すると、そこに向けてロボットが走っていくはず。
- 走らせ飽きたら、立ち上げたノードを(hardware_〇〇.launch.py以外)全部落とす
- ストレージが一杯の時は
- Dockerイメージがストレージを圧迫している場合は、
./docker/remove.sh
で最新の以外を削除できる。
- Dockerイメージがストレージを圧迫している場合は、