RaspberryPi3にROSとRoomba用ROSモジュールをインストールして動かしてみる

はじめに
====================

Raspberry Pi 3 に Ubuntu-16.04, ROS Kinetic をインストールして、サンプルを動かしてみました。

### 概要

- Ubuntu-16.04のインストール
- OSの初期設定
- ROS kineticのインストール
- roomba_500_seriesのインストール
- パッケージ作成
- 動かしてみる

手順
====================

Ubuntu-16.04のインストール
--------------------

### ダウンロード＆解凍

参考：[Raspberry Pi 2でUbuntu14.04を使う](http://qiita.com/rytmrt/items/9c4601586479fff6d77c)
参考：[Mac OS X で Raspberry PiのOSイメージを焼く - @ledsun blog](http://ledsun.hatenablog.com/entry/2014/10/26/174712)

下記よりUbuntu-16.04のイメージ（ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz）をダウンロード
[ARM/RaspberryPi - Ubuntu Wiki](https://wiki.ubuntu.com/ARM/RaspberryPi)


下記で解凍。

```sh-session
$ xz -dv ubuntu-16.04-preinstalled-server-armhf+raspi3.img.xz
```


### SDカードの特定、焼き込み

`diskutil list`などにより、SDカードを特定。今回は`/dev/disk2`

SDカードへ焼き込み。

```sh-session
$ diskutil unmountDisk /dev/disk2
$ sudo dd if=ubuntu-16.04-preinstalled-server-armhf+raspi3.img of=/dev/rdisk2 bs=1m
```


SSHで接続、初期設定
--------------------

### 無線LAN設定

Roomba用RPiのIPアドレスは`192.168.0.1`に固定する想定。

```sh-session
$ sudo apt-get install -y wpasupplicant wireless-tools linunx-firmware
$ sudo vi /etc/network/interfaces.d/wlan.cfg
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
$ sudo vi /etc/default/networking
$ sudo ifup wlan0
```

```text:/etc/network/interfaces.d/wlan.cfg
auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
    address 192.168.0.1
    netmask 255.255.255.0  # 各自の環境に
    gateway 192.168.0.254  # 合わせて設定する
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

```text:/etc/wpa_supplicant/wpa_supplicant.conf
update_config=1
network={
	proto=WPA2
	key_mgmt=WPA-PSK
	pairwise=CCMP TKIP
	group=CCMP TKIP
	ssid="your_ssid"
	psk=**************** # 下記参照
}
```

```text:/etc/default/networking
CONFIGURTE_INTERFACES=no
```


**参考** パスフレーズの生成は下記の通り

```
$ sudo sh -c "wpa_passphrase your_ssid > /etc/wpa_supplicant/wpa_supplicant.conf"
# reading passphrase from stdin
pass_phrase
network={
	ssid="your_ssid"
	#psk="pass_phrase"
	psk=****************
}
```


ROSのインストール
--------------------

参考：[RaspberryPi3のUbuntu16.04LTSにROSのkineticをインストールする | GarretCafe](http://garretcafe.com/blog/3222)


[仮想マシン上で手軽にROSのサンプルを動かしてみる](http://qiita.com/ryskiwt/items/13451d46805ac2e9459c)とほぼ同じ。


### 時刻設定

```sh-session
$ sudo apt-get update
$ sudo apt-get install -y chrony ntpdate
$ sudo ntpdate ntp.nict.jp
```


### ROSリポジトリと公開鍵を追加

```sh-session
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ wget http://packages.ros.org/ros.key -O - | sudo apt-key add -
```


### ROSインストール

```sh-session
$ sudo apt-get update
$ sudo apt-get install -y ros-kinetic-ros-base # No GUI tools
$ sudo rosdep init
$ rosdep update
$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
$ sudo apt-get install -y python-rosinstall
```


### ワークスペースの設定

```sh-session
$ source /opt/ros/kinetic/setup.bash
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin_init_workspace
$ cd ~/catkin_ws/
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash
```


### ROS環境設定

```sh-session
$ vi ~/.bashrc
$ source ~/.bashrc
```

```sh:.bashrc
source /opt/ros/kinetic/setup.bash
source ~/catkin_ws/devel/setup.bash

export ROS_IP=192.168.0.1
export ROS_MASTER_URI=http://${ROS_IP}:11311
export DISPLAY=:0

alias cw='cd ~/catkin_ws'
alias cs='cd ~/catkin_ws/src'
alias cm='cd ~/catkin_ws && catkin_make'
```

roomba_500_seriesのインストール
--------------------

参考：[ROSでRoombaを動かす(catkin対応) - cryborgのRoboticsブログ](http://cryborg.hatenablog.com/entry/2016/09/19/200510)
参考：[catkin超入門（その３）・rosbuildパッケージを使う: 花岡ちゃんに花束を](http://cyberworks.cocolog-nifty.com/blog/2013/08/catkinrosbuild-.html)

リポジトリ：https://github.com/NetBUG/roomba_500_series

1回だと`catkin_make`とか`catkin_make install`がfailedするけど、何度か繰り返し実行すると最終的に成功する。

```sh-session
$ cd ~/catkin_ws/src
$ git clone https://github.com/NetBUG/cereal_port
$ git clone https://github.com/NetBUG/roomba_500_series
$ rosdep install cerial_port
$ rosdep install roomba_500_series
$ cd ~/catkin_ws
$ catkin_make
$ catkin_make install
```

パッケージの作成
--------------------

### パッケージ作成

```sh-session
$ cd ~/catkin_ws/src
$ catkin_create_pkg roomba rospy std_msgs
```

### roslaunchファイルと操作プログラムの作成

roscoreは記載しなくても勝手に起動する。

```sh-session
$ roscd roomba
$ mkdir launch
$ mkdir scripts
$ vi launch/roomba.launch
$ vi scripts/sample.py
```

```xml:roomba.launch
<launch>
	<node pkg="roomba_500_series" name="roomba560_node" type="roomba560_node" />
</launch>
```

```py:sample.py
#!/usr/bin/env python

import rospy
from geometry_msgs.msg import Twist

rospy.init_node("sample")

pub = rospy.Publisher("cmd_vel", Twist, queue_size=10)

while not rospy.is_shutdown():
    vel  = Twist()

    direction = raw_input("f: forward, b: backward, l: left, r: right, s: stop,  q: quit > ")

    if "f" in direction:
        vel.linear.x = +0.1

    if "b" in direction:
        vel.linear.x = -0.1

    if "l" in direction:
        vel.angular.z = +1.0

    if "r" in direction:
        vel.angular.z = -1.0

    if "s" in direction:
        vel.linear.x = 0.0
        vel.angular.z = 0.0

    if "q" in direction:
        break

    print vel

    pub.publish(vel)
```

### 実行権限をつける

```sh-session
$ roscd roomba_ctl/scripts
$ chmod 755 sample.py
```

### catkin_make

```sh-session
$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash
```





動かしてみる
--------------------

roslaunch

```sh-session
$ roslaunch roomba roomba.launch
```

rostopicの直接送信

```sh-session
$ export ROS_IP=<自分のIPアドレス> # ifconfigで確認しておく
$ rostopic pub -1 cmd_vel geometry_msgs/Twist "[0, 0, 0]" "[0, 0, 0.1]" && rostopic pub -1 cmd_vel geometry_msgs/Twist "[0, 0, 0]" "[0, 0, 0]"
```

または下記（sample.pyから操作）

```sh-session
$ export ROS_IP=<自分のIPアドレス> # ifconfigで確認しておく
$ roscd roomba
$ ./sample.py
```