Jetson Nano/PC間でROS接続する

Jetson NanoとPC間でROSで通信できるか確認した際の備忘録です
（Jetsonを使っていますが、基本的には従来のROS接続方法と同じ）

## 構成

PC側にROS_MASTERを置きます

![スクリーンショット 2020-12-30 16.11.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/20b64131-b2ad-aa2e-ad19-27029a4c6f0c.png)



## 各マシンのIPアドレスを事前確認

- PC(ROS_MASTER)側 IPアドレス

```
ubuntu@ubuntu:~$ hostname -I | cut -d' ' -f1
192.168.179.6
```

- Jetson側 IPアドレス

```
jetson@jetson-desktop:~$ hostname -I | cut -d' ' -f1
192.168.179.8
```

## 環境変数の設定

- PC(ROS_MASTER)側に、ROS_MASTER/ROS_IPを設定

```
export ROS_MASTER_URI=http://192.168.179.6:11311  # ROS_MASTER側のアドレスを設定
export ROS_IP=192.168.179.6                       # 自分のIPアドレスを設定
```

- Jetson側、ROS_MASTER/ROS_IPを設定

```
export ROS_MASTER_URI=http://192.168.179.6:11311  # ROS_MASTER側のアドレスを設定
export ROS_IP=192.168.179.8                       # 自分のIPアドレスを設定
```

## roscore/turtlesim起動

- PC(ROS_MASTER)側、roscore/turtlesim_nodeを起動

```
roscore
```

```
rosrun turtlesim turtlesim_node
```

- Jetson側、turtle_teleop_keyを起動

以下でturtleを操作できればOK

```
rosrun turtlesim turtle_teleop_key
```

正しく設定できていると、`turtlesim`のrosnodeがnode一覧にある

```
$ rosnode list
/rosout
/turtlesim
```

## 備考

### 環境変数の設定
環境変数の設定は各ターミナル毎にする必要があるので手間が掛かる。
`~/.bashrc`に記載しておきたい。
ただIPアドレスが変わるとやはり設定をやり直す必要があるので簡単化したいところ。

以下コマンドを使ってみたい
[rosaddress コマンドを更新した話](https://qiita.com/RyodoTanaka/items/0791044a4780543f58fa#_reference-25aeb4b4049b1195b4e1)

### 画像データは圧縮して扱った方が良さそう

無線だと通信帯域が狭いので圧縮しないと厳しいです
[wifi経由でトピック通信する時、画像データは圧縮して扱った方が良さそう](https://qiita.com/seigot/items/5ff53f39946f154f8900)

### PC間の通信速度を確認する方法

以下を参考
[iperfを使ってPC間の通信速度を確認する](https://qiita.com/seigot/items/4f5a281d8e72c75cb85e)

### PC間でのトピック通信確認用コマンド(`/cmd_vel`を送信)

```
rostopic pub -1 /cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
```

### PC側からjetson側にパスワードなしでリモートログイン

リモートログインする際に毎回パスワードを実行するのは手間なので以下設定を行う。（通常の手順と変わらないが念のためメモ）

```
ssh jetson@192.168.179.8
```

PC側で秘密鍵/公開鍵ペア生成する

```
$ cd ~/.ssh
$ ssh-keygen -t rsa -b 4096  # 秘密鍵/公開鍵ペア生成（鍵の名前を"jetson"にしておく）
$ ls 
jetson       # 秘密鍵
jetson.pub   # 公開鍵
```

PC側の`~/.ssh/config`の中身を更新する

```
Host 任意の名称（こちらの名称が接続時に使用できます）
    Hostname 接続先のIPアドレス/ドメイン名
    User ユーザ名
    Port ポート番号
    Identityfile 鍵ファイルのパス
    ServerAliveInterval 秒（自動切断防止設定。後述）
```

例えば以下

```
Host jetson
    Hostname 192.168.179.8
    User jetson
    Port 22
    Identityfile ~/.ssh/jetson
    ServerAliveInterval 60
```

その後、jetson側にPC側で作成した公開鍵をコピーした後にjetson側の`authorized_keys`に登録しておく。
例えば以下。

```
cd ~/.ssh/
cat jetson.pub >> authorized_keys
```

これでPC側から、以下コマンドでjetsonにパスワードなしでリモートログインできる。

```
ssh jetson
```

[SSHコマンドがだるすぎる、、、公開鍵認証&ssh configで楽にしましょう](https://takakisan.com/ssh-public-key-config/)
[~/.ssh/configでSSHコマンドを快適化](https://odaryo.hatenablog.com/entry/2020/01/23/011253)
[SSH経由でコマンド実行すると環境変数を読まないでござる](http://april.fool.jp/blogs/2013/07/25/freebsdlinux-ssh経由でコマンド実行すると環境変数を読まな/)

# 参考
[NVIDIA JETSON NANO](https://www.nvidia.com/ja-jp/autonomous-machines/embedded-systems/jetson-nano/)
[ROS講座20 複数のPCでROS接続1](https://qiita.com/srs/items/7d4aeb5e44138f97c770)
[Dockerで ROS Kinetic 環境を扱う](https://qiita.com/seigot/items/9a3a101dbbd7828ee00b)
[http://wiki.ros.org/ja/ROS/EnvironmentVariables](http://wiki.ros.org/ja/ROS/EnvironmentVariables)