ROS Navigation 調査中

f:id:otomon10:20190629235817p:plain

rtabmapとmove_baseの連携はできているようで、目的地を指定するとcmd_velが飛ぶようにはなった。ただし、以下の問題があり行動計画が作成できず移動できない。

  • ZED-MステレオカメラのPointCloud2を利用して生成するコストマップが荒すぎ
  • 障害物領域(青色部分)が広すぎ

パラメタ調整等で対応できるとは思うので、継続して調べてみる。 (本当はレーザーセンサでコストマップを作ったほうがいいんだろうけど…)

小さな革財布を購入

f:id:otomon10:20190617221338j:plain

趣味の話。

小さくてもメイン財布として使える革財布を調査したところ、WILDSWANS PALM(パーム)が私の好みに非常にマッチした。

シェルコードバンも良かったのだけれど、傷に弱く普段遣いで気を使ってしまいそうなので、ガシガシ使っても問題なさそうなフルグレインブライドルを選択した。

予約注文して約1ヶ月、できたてホヤホヤのパームの姿を写真と動画で記録しておく。 これからのエイジングが楽しみだ。


f:id:otomon10:20190617223313j:plain

f:id:otomon10:20190617223320j:plain

f:id:otomon10:20190617223356j:plain

www.wildswans.jp

CTI Orbitty Carrier for JetsonTX1のカーネルビルド、およびスワップ有効化

背景

Jetson TX1のキャリアボードとして、Connect Tech Inc.(CTI)のOrbitty Carrierを使用している。 connecttech.com

ROSでマップ生成(rtabmap)をしたいのだがTX1だと4GBしかメモリがないのでメモリ不足で満足な動作ができない。暫定の回避策として(寿命的にすべきでないが)USBメモリスワップを作ってメモリ不足を解消したいのだが、どうやらキャリアボード付属のLinuxカーネルではスワップ(CONFIG_SWAP)が無効になっていた。(フラッシュメモリの寿命対策かもしれない)

キャリアボードのBSPにはカーネルイメージしか含まれていないので、CTIのサポートにメールで連絡したところ、BSPのカーネルソースを提供して頂けた! ので、それを使ってカーネルをビルドした。

ツールチェーン(クロスコンパイラ)の入手

CTI-BSPのバージョンと同じJetPackTegra 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_DIRCTI-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を押して戻る。

f:id:otomon10:20190615140319p:plain

項目を選択してスペースキーを押して[*]の状態にする(カーネルイメージに組み込まれる)。

f:id:otomon10:20190615140536p:plain

<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メモリスワップを作る

フォーマットした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

スワップが有効化された!

f:id:otomon10:20190615152623p:plain

起動時に自動的にスワップが有効になるように/etc/fstabに上記UUIDを追記する。

$ vi /etc/fstab

# 以下を追記
UUID=3be61ae7-a487-4f9e-8872-a1b2925f673a none swap sw 0 0

以上で完了。

参考

ROS Navigation勉強中

とりあえずモーターは動かせので、次は目的地まで自動で移動してもらいたい。ROSのNavigationを使えばできそうなことはわかったので、いろいろと調査中。 ただ、JetsonTX1だとメモリが4GBしかなく、RTAB-MAPがメモリ不足で動作しない。JetsonTX2欲しい…。

zed_wrapperが公開しているノード情報

ROS - The ZED Node | Stereolabs

ROS Navigation関連情報

move_base - ROS Wiki

Navigation Stack を理解する - 2.2 move_base: ソフトウェア構成をみる - Qiita

ROSのナビゲーションmove_baseについて理解を深めてみる – MY ROBOTICS

パラメータを調整する · TukamotoRyuzo/rostest Wiki · GitHub

navigation/Tutorials/RobotSetup - ROS Wiki

JetsonTX1 ROSで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]
---

ロボット(名称未定)の進捗報告(2019/02/11)

制作しているロボットの進捗報告。

  • 完了
    • ケース作成
    • バッテリー駆動
    • モーター制御ソフト実装
    • PS3無線コントローラーによる操作対応
  • 未完了(やりたいこと)