JetsonTX2でROSを使った加速度センシング

# 環境
デバイス：JetsonTX2
Jetpackバージョン：3.２
ROS：Kinetic
OS：Ubuntu16.04
加速度センサ：RT-USB-9AXIS-00（https://www.rt-shop.jp/index.php?main_page=product_info&products_id=3416）

# カーネル再コンパイル
JetsonTX2にはUSBデバイス認識するデバイスドライバのうちttyACM*などを認識するドライバがデフォルト入っていない。そのため、今回の加速度センサを認識するためにはカーネルを再コンパイルする必要がある。
#### カーネルの再コンパイル方法
以下のベージを参考にカーネルを再コンパイルする。動画を参考にして実施すれば問題なくカーネルを再コンパイルすることができる。
https://www.jetsonhacks.com/2017/07/31/build-kernel-ttyacm-module-nvidia-jetson-tx2/


# 加速度センサのセットアップ
今回選定した加速度センサはROSパッケージがshutdowntest.bag.active 付属する。しかし、出荷時の状態ではバイナリー出力モードが設定されており、このモードではROSのパッケージを使ったロギングはできない。そのため、まずはバイナリモードからASCIIモードへ設定を変更し、ROSパッケージを実行する。
センサのマニュアル：https://github.com/rt-net/RT-USB-9AXIS-00/blob/master/manual/USB%E5%87%BA%E5%8A%9B9%E8%BB%B8IMU%E3%82%BB%E3%83%B3%E3%82%B5ver2.0%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB.pdf

#### バイナリーモードからASCIIモードへ変更
まずはセンサーをJetsonへUSB接続する。上記のカーネルの再コンパイルを実施していれば、加速度センサはdev/ttyAMC0として認識されるはずである。

```bash
cat /dev/ttyACM0
```
を実行すると、センサーの出力値を確認することができる。工場出荷状態ではバイナリー出力モードに設定されているため、このままではROSを使ってセンシングすることができない。この状態でマニュアルのP12に従ってセンサーの出力モードをASCIIモードへ変更する。


# ROSを使ったロギング
### ROSの環境構築
JetPack3.2に対応するROSバージョンはKinetic。以下のページを参考にROSをインストールする。動画を参考にして実施すれば問題なく環境を構築できる。
https://www.jetsonhacks.com/2017/03/27/robot-operating-system-ros-nvidia-jetson-tx2/

### 加速度センサー（RT-USB-9AXIS）用のROSパッケージのインストールと実行
本加速度センサーは提供元のRTがROSパッケージも提供しており、ROSパッケージを導入することで、ROSを使ってセンサー値をROSTopicとして扱うことができる。
https://github.com/rt-net/rt_usb_9axisimu_driver/wiki
に従い、パッケージの導入とパッケージを実行する。

パッケージのインストール

```bash
$ cd ~/catkin_ws/src
$ git clone https://github.com/rt-net/rt_usb_9axisimu_driver.git
$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash
```
ttyACM0(ポート)の権限変更

```bash
$ sudo chmod 666 /dev/ttyACM0
```

### rosbagを使ったセンサのロギング及び可視化
センサー値のロギングにはrosbagを使う。
参考：https://qiita.com/srs/items/f6e2c36996e34bcc4d73
以下に実行例を示す。

#### 前準備

```bash:Tearminal1
$ roscore
```
```bash:Tearminal2
$ rosrun rt_usb_9axisimu_driver rt_usb_9axisimu_driver
```
```bash:Tearminal3
$ cd catkin_ws
$ mkdir rosbag
$ cd rosbag
```

#### ログをレコードする
bagファイルを保存したいディレクトリで以下を実行する。Ctrl + Cで停止。

```bash:Tearminal3
/catkin_ws/rosbag$ rosbag record -a  -O test_imu
[ INFO] [1572060408.228802091]: Recording to test_imu.bag.
[ INFO] [1572060408.229535499]: Subscribing to /imu/temperature
[ INFO] [1572060408.238371784]: Subscribing to /imu/mag
[ INFO] [1572060408.247299908]: Subscribing to /rosout
[ INFO] [1572060408.255613473]: Subscribing to /rosout_agg
[ INFO] [1572060408.283773046]: Subscribing to /imu/data_raw
```

#### rosbagの確認
rosbag infoコマンドでどのようなデータが保存されているか概要を確認することができる。以
下に実行例を示す。

```bash:Terminal3
~/catkin_ws/rosbag$ rosbag info test_imu.bag 
path:        test_imu.bag
version:     2.0
duration:    28.7s
start:       Oct 26 2019 12:26:48.29 (1572060408.29)
end:         Oct 26 2019 12:27:16.95 (1572060436.95)
size:        1.7 MB
messages:    8443
compression: none [3/3 chunks]
types:       rosgraph_msgs/Log         [acffd30cd6b6de30f120938c17c593fb]
             sensor_msgs/Imu           [6a62c6daae103f4ff57a132d6f95cec2]
             sensor_msgs/MagneticField [2f3b0b43eed0c9501de0fa3ff89a45aa]
             std_msgs/Float64          [fdb28210bfa9d7c91146260178d9a584]
topics:      /imu/data_raw      2813 msgs    : sensor_msgs/Imu          
             /imu/mag           2813 msgs    : sensor_msgs/MagneticField
             /imu/temperature   2813 msgs    : std_msgs/Float64         
             /rosout               4 msgs    : rosgraph_msgs/Log         (2 connections)
```

#### rosbagの可視化
以下のコマンドを実行すると以下のようなウィンドウが出てきる。縦にrosbagに入っているROSトピックがならなんでいて、青い縦線はその時間にpublishされたことを示している。

```bash
$ rqt_bag test_imu.bag
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327375/6b6c6202-df3c-763e-e4e7-2d4359d4a2c7.png)
各トピックを右クリックしてview-> plotを選択するとグラフの表示ができます。これで各データを見比べたりできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327375/c2e89f64-fd21-e7af-7a52-f9bae01267d5.png)


#### rosbagのCSV出力
以下のコマンド実行することで、加速度データ、速度、回転角度などのログをCSVファイルとして出力
できる。

```bash
rostopic echo -b test_imu.bag -p /imu/data_raw > test_imu_data_raw.csv
```

### rosbag record中のコンピュータシャットダウン
rosbag record中にコンピュータがシャットダウンするもしくは、プロセスがKillされた場合、rosbagファイル正常に作成されない。そのため、本来取得できるはずの~.bagファイルは生成されず、~.bag.activeというファイルが生成される。
この状態では、bagファイルとして扱うことは出来ない。
しかしredindexコマンドを用いることで再度indexを付与し、bagファイルとして復活させることができる。
参考：https://answers.ros.org/question/40116/rosbag-file-cannot-be-made-bagactive/
#### rosbagの復元方法
Record中にシャットダウンが発生し、bag.activeファイルが生成されたいる状況を想定し、以下にシャットダウン後の復帰方法を示す。
まずは、rosbagファイルを保存したディレクトリへ移動し、以下のコマンドを実行

```bash
/catkin_ws/rosbag$ rosbag reindex shutdowntest.bag.active 
 shutdowntest.bag.active                     100%              1.0 MB 00:00    
```
実行すると、bag.orig.activeとbag.activeが生成される。

```bash
$ ls -artl
total 1876
-rw-rw-r-- 1 nvidia nvidia 1060864 Oct  8 20:05 shutdowntest.bag.orig.active
-rw-rw-r-- 1 nvidia nvidia  847507 Oct  8 20:05 shutdowntest.bag.active
```
このうち、bag.orig.activeではなく、bag.activeの方がリペアされたbagファイルとなるため、従来のbagファイルと同様に扱うことが可能となる。試しに以下のコマンドを実行してbagファイルを可視化してみると
、問題なくrogが可視化できることを確認できる。

```bash
$ rqt_bag shutdowntest.bag.active 
```