rtabmapとmove_baseの連携はできているようで、目的地を指定するとcmd_velが飛ぶようにはなった。ただし、以下の問題があり行動計画が作成できず移動できない。
- ZED-MステレオカメラのPointCloud2を利用して生成するコストマップが荒すぎ
- 障害物領域(青色部分)が広すぎ
パラメタ調整等で対応できるとは思うので、継続して調べてみる。 (本当はレーザーセンサでコストマップを作ったほうがいいんだろうけど…)
rtabmapとmove_baseの連携はできているようで、目的地を指定するとcmd_velが飛ぶようにはなった。ただし、以下の問題があり行動計画が作成できず移動できない。
パラメタ調整等で対応できるとは思うので、継続して調べてみる。 (本当はレーザーセンサでコストマップを作ったほうがいいんだろうけど…)
Jetson TX1のキャリアボードとして、Connect Tech Inc.(CTI)のOrbitty Carrierを使用している。 connecttech.com
ROSでマップ生成(rtabmap)をしたいのだがTX1だと4GBしかメモリがないのでメモリ不足で満足な動作ができない。暫定の回避策として(寿命的にすべきでないが)USBメモリにスワップを作ってメモリ不足を解消したいのだが、どうやらキャリアボード付属のLinuxカーネルではスワップ(CONFIG_SWAP)が無効になっていた。(フラッシュメモリの寿命対策かもしれない)
キャリアボードのBSPにはカーネルイメージしか含まれていないので、CTIのサポートにメールで連絡したところ、BSPのカーネルソースを提供して頂けた! ので、それを使ってカーネルをビルドした。
CTI-BSPのバージョンと同じJetPackのTegra Linux Driver Package Development Guideによると、L4TのツールチェーンはAARCH64 toolchainを使っているようなので、ダウンロードしておく。
以下のディレクトリに格納した。
$ cd ~/JetPack/64_TX1 $ tar -zxvf gcc-4.8.5-aarch64.tgz $ mv install gcc-4.8.5-aarch64
ビルド用の環境変数を設定する。パスは環境依存なので適宜読み替える。
TEGRA_KERNEL_OUT
:カーネルビルド結果の出力先
L4T_ROOT_DIR
:CTI-L4Tのフォルダパス
CROSS_COMPILE
:クロスコンパイラのプレフィックス
ARCH
:アーキテクチャ指定
export TEGRA_KERNEL_OUT=~/JetPack/64_TX1/Linux_for_Tegra/CTI-L4T/out export L4T_ROOT_DIR=~/JetPack/64_TX1/Linux_for_Tegra/CTI-L4T export CROSS_COMPILE=~/JetPack/64_TX1/gcc-4.8.5-aarch64/bin/aarch64-unknown-linux-gnu- export ARCH=arm64
CTIのBSPに使用されているカーネルコンフィグファイルはsources/kernel/kernel-4.4/arch/arm64/configs/tegra21_cti_defconfig
にある。menuconfigで変更する前に、まずは以下のコマンドで.config
ファイルを作成する。
$ make ARCH=arm64 O=$TEGRA_KERNEL_OUT tegra21_cti_defconfig
$TEGRA_KERNEL_OUT
に.config
ファイルが生成されていればOK。(隠しファイルなのでnautilusでCtrl+Hで確認するか、ls -laで確認するとよし)
menuconfigでカーネル設定を変更する。cursesを使うのでインストールしておくこと。
$ sudo apt-get install libncurses5-dev $ make ARCH=arm64 O=$TEGRA_KERNEL_OUT menuconfig
スワップの項目を探す。/
キーを押した後、SWAP
と入力する。
General setup
の中のSupport for paging of anonymous memory (swap)
という項目であることがわかる。Esc
を押して戻る。
項目を選択してスペースキーを押して[*]
の状態にする(カーネルイメージに組み込まれる)。
<Save>
を選択して終了する。
$TEGRA_KERNEL_OUT/.config
ファイルが更新される。
CTIから提供されたカーネルソースのディレクトリに移動してビルドする。
$ ~/JetPack/64_TX1/Linux_for_Tegra/CTI-L4T/sources/kernel/kernel-4.4 $ mkdir -p $TEGRA_KERNEL_OUT $ ./make_script.sh
ビルドされたカーネルイメージ、カーネルモジュールは以下に格納される。
$TEGRA_KERNEL_OUT/arch/arm64/boot/Image $TEGRA_KERNEL_OUT/arch/arm64/boot/zImage $L4T_ROOT_DIR/built_modules
カーネルイメージとカーネルモジュールを差し替える。コピーにはJetson側でrsync -a
を利用する、scp
だとシンボリックリンクが、リンクではなく元のファイルをコピーしてしまうため。
$ cd ~ # カーネルイメージの差し替え $ rsync -av ubuntu@192.168.0.15:~/JetPack/64_TX1/Linux_for_Tegra/CTI-L4T/out/arch/arm64/boot . $ sudo cp -f ./boot/Image /boot $ sudo cp -f ./boot/zImage /boot $ rm -rf ./boot # カーネルモジュールの差し替え $ rsync -av ubuntu@192.168.0.15:~/JetPack/64_TX1/Linux_for_Tegra/CTI-L4T/built_modules/lib . $ sudo cp -rf ./lib / # 再起動する $ sudo reboot
以上でカーネル、カーネルモジュールの差し替え完了。
* この後、起動に1分30秒程度かかるようになってしまった、要調査。
フォーマットしたUSBメモリをJetsonTXに接続しておく。以下のコマンドでスワップパーティションを作成する。
$ umount /dev/sda1 $ sudo mkswap /dev/sda1 mkswap: /dev/sda1: warning: wiping old vfat signature. Setting up swapspace version 1, size = 7.5 GiB (8018456576 bytes) no label, UUID=3be61ae7-a487-4f9e-8872-a1b2925f673a $ sudo swapon /dev/sda1
スワップが有効化された!
起動時に自動的にスワップが有効になるように/etc/fstab
に上記UUID
を追記する。
$ vi /etc/fstab # 以下を追記 UUID=3be61ae7-a487-4f9e-8872-a1b2925f673a none swap sw 0 0
以上で完了。
とりあえずモーターは動かせので、次は目的地まで自動で移動してもらいたい。ROSのNavigationを使えばできそうなことはわかったので、いろいろと調査中。 ただ、JetsonTX1だとメモリが4GBしかなく、RTAB-MAPがメモリ不足で動作しない。JetsonTX2欲しい…。
zed_wrapperが公開しているノード情報
ROS - The ZED Node | Stereolabs
ROS Navigation関連情報
Navigation Stack を理解する - 2.2 move_base: ソフトウェア構成をみる - Qiita
ROSのナビゲーションmove_baseについて理解を深めてみる – MY ROBOTICS
PS3コントローラーでモーターを制御するパッケージを作成した。
事前にPS3コントローラーを使用できるようにしておく。
Jetson TX1でPS3コントローラーを無線で利用する - Qiita
JetsonTX1に以下のパッケージをインストールする。
$ sudo apt install ros-kinetic-joy $ sudo apt install ros-kinetic-ps3joy
以下のlaunchファイルでノードを実行する。
$ roslaunch ps3joy ps3.launch
トピックの情報を表示して値が表示されていれば通信できている。
$ rostopic echo joy --- header: seq: 3400 stamp: secs: 1557927225 nsecs: 946680626 frame_id: '' axes: [-0.0, -0.0, -0.0, -0.0, -0.0, 0.028956517577171326, 1.0, 0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, -0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ---