RaspberryPi2からTurtleBot2（kobuki）をROSで動かす

# この記事の特色
* RaspberryPi2にUbuntu14.04をインストールし，USBドングルにて無線LAN接続できる
* RaspberryPi2にROSをインストールできる
* LinuxのCUI上で無線（有線）LANの設定ができるコマンド**wicd-curses**を知ることができる
* TurtleBot2を制御する為のPCが極小になって，コンパクトに運用できる！

![IMG_20150721_184338.jpg](https://qiita-image-store.s3.amazonaws.com/0/79509/94e4c8fe-e2db-b015-d01b-c2511bce2290.jpeg)


# 注意事項
* Ubuntuのバージョン，ROSのバージョンには注意しましょう．（今回は，Ubuntu14.04，ROSはIndigoを用います．）

# 使うもの

* Windows PC （SDフォーマット，OSイメージのバイナリダンプ）

* Raspberry Pi 2 Model B

![IMG_20150721_131829.jpg](https://qiita-image-store.s3.amazonaws.com/0/79509/c582f0ce-ec6b-736a-363c-02c12a5e1055.jpeg)

* microSD 16GB （RaspberryPi2用）

![IMG_20150721_131622.jpg](https://qiita-image-store.s3.amazonaws.com/0/79509/2f3ae1df-caf2-2b5a-f343-3016c1fe8b35.jpeg)

* 無線LAN USBドングル　WLI-UC-GNM（RaspberryPi2用）

![IMG_20150721_131816.jpg](https://qiita-image-store.s3.amazonaws.com/0/79509/a0498d7d-b14c-1595-1594-f35167fbfa23.jpeg)

* TurtleBot2 kobuki

![IMG_20150721_131947.jpg](https://qiita-image-store.s3.amazonaws.com/0/79509/a305fa86-7031-bb0a-64d7-27d45ac868f6.jpeg)

* RAspberryPi2に接続するものも必要<BR>
USBマウス<BR>
USBキーボード<BR>
電源ケーブル（microUSB）<BR>
有線LAN<BR>
HDMIケーブル<BR>
ディスプレイ<BR>

# Ubuntu14.04をRaspberryPi2にインストールする
## 0. インストールに失敗したSDカードをフォーマットする
最初に，WindowsのSDカードフォーマッターを使って，パーティション情報も含めて削除．
https://www.sdcard.org/jp/downloads/formatter_4/

論理サイズ調整ONにしてフォーマットし，
その後，windowsのエクスプローラから，
exFATでフォーマットしておくこと．
（FATでフォーマットしてあると，あとで困ることがある．SDカード容量拡張ができない）

## 1. UbuntuをmicroSDに入れる
### 1.1 Ubuntuマシンを使ってインストールする場合
[参考URL] https://wiki.ubuntu.com/ARM/RaspberryPi

### 1.2 Windowsマシンを使ってインストールする場合
[参考URL] http://raspi2.hateblo.jp/entry/2015/04/18/190427

#### 1.2.1 ARM/RaspberryPi - Ubuntu Wikiから、 2015-04-06-ubuntu-trusty.zip をダウンロードする
http://www.finnie.org/software/raspberrypi/2015-04-06-ubuntu-trusty.zip

#### 1.2.2 ダウンロードしたzipファイルを解凍する
解凍されたファイルの "2015-04-06-ubuntu-trusty.img" がOSのディスクイメージファイル

#### 1.2.3 OSディスクイメージの書き込み
* DD for Windows を起動する（右クリック→管理者として実行）<BR>
http://www.si-linux.co.jp/techinfo/index.php?DD%20for%20Windows
* 画面上のディスク選択ボタンでMicroSDカードのディスクを、ファイル選択ボタンで 2015-04-06-ubuntu-trusty.img を選ぶ

![DDfW.png](https://qiita-image-store.s3.amazonaws.com/0/79509/81411986-f529-71b7-5b48-7b3d67b53575.png)

【注意】ファイル読み込みの際に，「All files」を読み込み対象にしないと，.imgファイルが表示されません．
![DDfW_l.png](https://qiita-image-store.s3.amazonaws.com/0/79509/b6fdbbc7-09ca-9b8b-77a3-8359ad602bfc.png)

* 書込ボタンをクリックする
書き込みサイズなどについて注意事項が表示されますが，OKを押しましょう．

## 2. SDカードの容量をめいっぱい使う
[参考URL1] http://blog.hello-world.jp.net/raspberrypi/219/
[参考URL2] https://wiki.ubuntu.com/ARM/RaspberryPi
現在の状況では，microSDの容量に関係なく，ubuntuから見えるディスク容量のサイズは，OSが入っているパーティションのサイズになっています．（2015-04-06-ubuntu-trusty.imgのサイズ）
そこで，microSDのサイズいっぱいまで（今回の場合は16GB）使えるようにします．

RaspberryPi2に，microSDを挿して，（マウス，キーボード，ディスプレイも接続して），ログイン後，以下のコマンドを実行していきます．
標準のログインIDとパスワードは，どちらもubuntuです．

<!--UbuntuマシンにmicroSDを接続して，以下のコマンドを実行します．
（私は，WindowsPCのVMにUbuntu14.04を入れて，以下を実行しました．）-->

* df -h<BR>
microSDのデバイス名を見るため．（/dev/mmcblk0p1 とか，/dev/sdb1 とかになっているはず．）
* sudo fdisk /dev/mmcblk0<BR>
fdiskの起動．
* p　[pを入力]<BR>
パーティション情報を確認．システムが「Linux」となっている部分を以下で削除する．
* d　[dを入力]<BR>
* 2　[2を入力]<BR>
これで，パーティション2番を削除．
* n　[nを入力]<BR>
新規パーティション作成．
* p　[pを入力]<BR>
* 2　[2を入力]<BR>
* ENTER　[標準値を使用]<BR>
* ENTER　[標準値を使用]<BR>
* w　[wを入力]<BR>
これまでのパーティション設定値を書き込み
* OS再起動<BR>
今回の場合には，VMのゲストOS（ubuntu）を再起動
* sudo resize2fs /dev/mmcblk0p2<BR>
パーティション容量リサイズ

これで，容量が増えます．df -hコマンドで，デバイスの容量を確認してSizeがmicroSDの容量と一致していたら成功です．

## 3. RaspberryPi2上での設定
作成したmicroSDをRaspberryPi2に挿入し，キーボード，マウス，ディスプレイ，有線LANを接続し，最後に電源ケーブルを接続します．

### 3.1 ログイン方法
標準のログインIDとパスワードは以下のとおりです．
ID：ubuntu
パスワード：ubuntu

### 3.2 ユーザ作成
自分のアカウントを作成します．以下の例は，ID：yamagutiでの例です
$ sudo adduser yamaguti

管理者ユーザのパスワードを聞かれるので，ubuntuと入力します．
その後，新規ユーザのパスワードを聞かれるので，パスワードを設定してください．その後，確認の為の再入力があります．
その後，ユーザ情報の入力がありますが，Enterを押して飛ばしてOKです．

### 3.3 sudoグループにユーザを追加
% sudo gpasswd -a user_name sudo
ユーザ（user_name）を， sudo グループに追加します．

### 3.4 ユーザubuntuを削除
再起動して，新規ユーザ（yamaguti）でログインし，以下を実行
% sudo deluser ubuntu
% sudo rm -rf /home/ubuntu

### 3.5 apt-getのupdate
$ sudo apt-get update

### 3.6 Open ssh のインストール
$ sudo apt-get install openssh-server

#### 3.6.1【注意事項】warning: Setting locale failed. が出る問題への対処
[参考URL] http://d.hatena.ne.jp/tkrd/20120828/1346123699

sshで接続する際にローカルPCの環境変数がリモートホストに送信されているのが問題．
ローカルPC(Ubuntu)の/etc/ssh/ssh_configを確認すると、次の記述がある：

SendEnv LANG LC_*
この行をコメントアウトすると，問題が解決します．Macでも同じような設定になっています．
$ sudo nano /etc/ssh/ssh_config 
などとして，SendEnvの行の頭に#をつけてコメントアウトしてください．

### 3.7 無線LAN用USBドングルを使う
#### 3.7.0 無線LAN用USBドングルをRaspberryPi2に接続する
ここではまだ有線LANは抜かない！

#### 3.7.1 linux-firmwareパッケージをインストールします．
$ sudo apt-get install linux-firmware

#### 3.7.2 CUI上で無線LAN設定ができるソフト＆デーモンをインストール
$sudo apt-get install wicd-curses

#### 3.7.3 wicdコマンドで無線LAN設定
$ sudo /etc/init.d/wicd restart
$ sudo wicd-curses

#### 3.7.4 無線LAN設定
* カーソルキー上下でアクセスポイントを選択
* カーソルキー右でアクセスポイントに対する設定
* アクセスポイントがステルス（見えない）設定なら，Shift+I を押して，アクセスポイント名を入力
* Automatically connect to this network　を選択しておくと次回以降，ubuntu起動時に自動的に接続できる
* 設定終了後，F10を押して設定保存
* Shift+C で，選択しているアクセスポイントに接続
* 接続ができたら，Shift+Q でQuit

コンソール画面で，ifconfig コマンドをしてみて，wlan0 にIPが割り当っていたら成功．
有線LANは，切断されてIPが未割り当てになります．


# ROSをRaspberryPi2にインストールする
[参考URL] http://wiki.ros.org/indigo/Installation/UbuntuARM

## 1. インストール手順

### 1.1 ロケールの設定
$ sudo update-locale LANG=C LANGUAGE=C LC_ALL=C LC_MESSAGES=POSIX

### 1.2 sources.list の設定
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu trusty main" > /etc/apt/sources.list.d/ros-latest.list'

### 1.3 公開鍵の設定
$ wget https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -O - | sudo apt-key add -

### 1.4 apt-get updateの実行
$ sudo apt-get update

### 1.5 ROS-Base パッケージ（version：indigo）のインストール
ROSパッケージ，ビルド，通信ライブラリが含まれており，GUIツールは含まれていません．
$ sudo apt-get install ros-indigo-ros-base

### 1.6 rosdep のインストール
$ sudo apt-get install python-rosdep
$ sudo rosdep init
$ rosdep update

### 1.7 ROS用の環境設定
$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

### 1.8 rosinstallという名のパッケージをインストールする
$ sudo apt-get install python-rosinstall


## 2. ROSのテスト（環境がなければ飛ばしてOK）
turtlesimというROSでは代表的な，亀を使ったシミュレータを使って，ROSのテストを行います．テストは，ROSの入ったデスクトップPC（マスタ）でroscoreとturtlesimを起動し，そこにRaspberryPi2から接続する事で行います．

### 2.1 turtlesim のインストール
$ sudo apt-get install ros-indigo-turtlesim

### 2.2 各マシン（デスクトップPC,RaspberryPi2）で以下の設定をする
$ export ROS_MASTER_URI=http://(デスクトップPCのIP）:ポート

例）export ROS_MASTER_URI=http://192.168.100.15:11311

### 2.3 マスタ（デスクトップPC）でROSとturtlesimを起動
$ roscore
$ rosrun turtlesim turtlesim_node

### 2.4 RaspberryPi2でteleop_keyを起動
$ rosrun turtlesim turtle_teleop_key


# TurtleBot2（kobuki）をRaspberryPi2につないで使う
[参考URL1] http://wikiwiki.jp/naonaorange/?Turtlebot2%2FInstall
[参考URL2] http://www.rt-shop.jp/blog/archives/368

## 1. 各種パッケージのインストール

### 1.1 TurtleBot用のパッケージ，kobuki用のパッケージをインストール
$ sudo apt-get install ros-indigo-turtlebot ros-indigo-turtlebot-apps ros-indigo-turtlebot-interactions ros-indigo-kobuki-ftdi

### 1.2 kobuki用のドライバの設定
$ rosrun kobuki_ftdi create_udev_rules
ユーザのパスワードの入力が求められるので，入力する．

## 2. Kobukiと接続＆動作確認

### 2.1 Kobukiと接続
USBケーブルを用いて，kobukiとRaspberryPi2を接続

/dev/kobuki が出現すれば成功

RaspberryPi2にモバイルバッテリーをつなぎ，ネット接続を無線LANで行えば，この記事の冒頭にある写真のようなスッキリした状態で運用できます．

### 2.2 kobukiの動作確認（キーボード操作）
RaspbedrryPi2にsshで接続して，ROS関連コマンドを実行していきます．各コマンドの最後にアンパサンド（＆）を付けて，バックグラウンドで実行させています．

#### 2.2.1 roscore の起動
$ roscore &

#### 2.2.2 kobuki のコアライブラリの起動
$ roslaunch kobuki_node minimal.launch &

ここで，kobukiとの接続に成功している場合には，kobukiから「ピロリロリ」と音がなります．音がならない場合には，接続の設定がうまくいっていません．

#### 2.2.3 キーボード操作のノードを立ち上げる
$ roslaunch kobuki_keyop keyop.launch

キーボードのカーソルキーで動かし，スペースキーで停止，「q」キーで停止です．

### 2.3 kobukiの動作確認（ドッキングステーションで自動充電）

![IMG_20150721_191011.jpg](https://qiita-image-store.s3.amazonaws.com/0/79509/6855c595-5cf3-6f5d-a626-7a1d356aa70f.jpeg)

↓

![IMG_20150721_191025.jpg](https://qiita-image-store.s3.amazonaws.com/0/79509/2dc1676c-5471-e4f1-50cd-1df2e290a999.jpeg)


写真の様に，自動的にドッキングステーションに充電をしに行かせます．TurtleBotの正面にドッキングステーションがあると成功しますが，正面にないと，失敗する場合が多いようです．

#### 2.3.1 roscore の起動
$ roscore &

#### 2.3.2 kobuki のコアライブラリの起動
$ roslaunch kobuki_node minimal.launch &

#### 2.3.3 ドッキングステーション帰還のためのノードを起動
$ roslaunch kobuki_auto_docking minimal.launch &

#### 2.3.4 ドッキングさせるためのコマンド
$ roslaunch kobuki_auto_docking activate.launch