Raspberry Pi 3
Raspberry Pi 3 Model B は、手のひらサイズのシングルボード・コンピュータで、定価$35、日本でも6000円程度で購入可能です。
ARM Cortex-A53( 4コア、1.2GHz), RAM 1GBを搭載しておりLinuxをインストールしてストレスなく使うことができます。
サイズ、価格、性能ともにロボットに搭載するにはぴったりです。
Raspberry Pi 2とPi 3の違い
Raspberry Pi 3 Model B は Raspberry Pi 2 Model B の後継機種にあたります。
機能としてはプロセッサの性能UP、WiFi, Bluetoothの搭載が大きな違いです。
その他、外形サイズなどは同じということになっていますが、実際に手にしてみるとわかる若干の違いがあります。
小さな違いですがケースに入れるときは注意が必要です。
電源は、相変わらずマイクロUSBコネクタから供給するようになっており(別途電源ピンを正式に用意して欲しかった!)、5V, 2.5Aの電源が必要とされています。実際に使ってみたところ、Linuxブート時では250mAくらいしか流れませんでしたが、GPUやCPUに目一杯負荷をかけると2A以上食うのでしょうか?
ROSインストールまでの流れ
以下の流れでインストールを行いました。
インストールするLinuxのdistributionは、注意して選ぶ必要があります。
Ubuntu Mateなども試したのですが、Head-less(ディスプレイとキーボードをつながない)でロボットに搭載する用途に使うには、面倒なことが多くありそうです。またRaspberry Pi 3は、現時点では発売間もないので正式サポートのRaspbianをインストールすることにしました。
なお、Raspberry Pi 2でLinux+ROSを使う場合は、ここで説明するような手順ではなく、ここに書いてあるようにUbuntu 14.04LTSをインストールし、ROSのパッケージはここに書いてあるようにarmhf用のバイナリをインストールしてしまった方が断然速く楽にできるはずです。ただしUbuntuがよければの話です。
手順で最も時間のかかるのは、ROSのダウンロード~インストールです。全部のインストールで1~2時間くらいかかりましたが、ROSをビルドしている間はほったらかしておけばよいので、それほど苦になることでもありません。
Raspbian Jessieのインストール
下記のオフィシャルサイトの説明に従ってマイクロSDカードにRaspbianをインストールします。
Jessieをインストールしました。「NOOBSを使って簡単にインストールできる」との説明がありますが、自動的に(勝手に)色々設定されてあとでそれを修正するのが嫌なので、NOOBSを使わずにイメージ(.img)をSDカードに書き込みました。
# ddrescue -D --force 2016-03-18-raspbian-jessie.img /dev/sdc
次に、fdiskでLinuxパーティションのサイズをSDカード一杯まで広げます。
# fdisk /dev/sdc
コマンド (m でヘルプ): p
ディスク /dev/sdc: 7969 MB, 7969177600 バイト
ヘッド 246, セクタ 62, シリンダ 1020, 合計 15564800 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク識別子: 0x8f1eafaf
デバイス ブート 始点 終点 ブロック Id システム
/dev/sdc1 8192 131071 61440 c W95 FAT32 (LBA)
/dev/sdc2 131072 7878655 3873792 83 Linux
コマンド (m でヘルプ): d
パーティション番号 (1-4): 2
コマンド (m でヘルプ): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
パーティション番号 (1-4, 初期値 2): 2
開始 セクタ (2048-15564799, 初期値 2048): 131072
Last セクタ, +セクタ数 or +size{K,M,G} (131072-15564799, 初期値 15564799):
初期値 15564799 を使います
コマンド (m でヘルプ): p
ディスク /dev/sdc: 7969 MB, 7969177600 バイト
ヘッド 246, セクタ 62, シリンダ 1020, 合計 15564800 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスク識別子: 0x8f1eafaf
デバイス ブート 始点 終点 ブロック Id システム
/dev/sdc1 8192 131071 61440 c W95 FAT32 (LBA)
/dev/sdc2 131072 15564799 7716864 83 Linux
コマンド (m でヘルプ): w
パーティションテーブルは変更されました!
ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
そしてresize2fsでサイズを変更します。
# resize2fs /dev/sdc2
シリアルコンソールの設定
以上で、Raspbianのインストールは完了しRaspberry PiにSDカードを挿入して電源を入れれば起動するはずです。
しかし、今回はHead lessで使用したいので、シリアルコンソールの設定を行います。Raspberry PiにUSB TTL Serial Cableを接続すれば、TeraTermなどのシリアル端末からログインできるようになります。
SDカードをmountして/bootパーティションのファイルを修正します。
# vi boot/config.txt
-----------------
core_freq=250 <--追加
-----------------
現時点では、これを追加しないとシリアルポートのボーレートが正しく設定されませんでした。
# vi boot/cmdline.txt 以下のように修正
-----------------
dwc_otg.lpm_enable=0 console=ttyS0,115200 kgdboc=ttyS0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
-----------------
RaspberryPi3では、ヘッダに出ているシリアルポートがttyS0となっています。(Pi2ではttyAMA0でした)
RaspberryPi3とPCをUSB-TTL Serial Cableで接続し、Pi3にSDカードを挿入して電源を入れると、Linuxが起動してログインできるようになります。
login: pi, password raspberryでログインできます。
Linuxの各種設定
ここで、最低限必要なLinuxの設定を行っておきます。
SSHでLANから接続できるように、以下のように設定しました。 ROSをインストールするために、Raspberry Piがインターネットに接続できるようにしておきます。
# vi /etc/dhcpcd.conf <-- 固定IPに設定する
追加-----------------------------
interface eth0
static ip_address=192.168.1.70
static routers=192.168.1.1
static domain_name_servers=192.168.1.1
---------------------------------
# adduser USERNAME
# gpasswd -a USERNAME sudo
# gpasswd -d pi sudo
# visudo
-------------------------------
#pi ALL=(ALL) NOPASSWD: ALL
-------------------------------
# vi /etc/hostname <--ホスト名を変更する
# vi /etc/hosts
-------------------------------
127.0.1.1 HOSTNAME <-- ホスト名
-------------------------------
Raspberry Piにキーボードとマウス、ディスプレイを接続して起動すれば、GUIが使える状態になっています。GUIは使わないので、CLIで起動するように設定します。
参考: Change default target to boot into
# systemctl get-default
# systemctl set-default multi-user.target
ROS Indigoのインストール
いよいよROSをインストールします。
手順は、Installing ROS Indigo on Raspberry Piに詳しく書かれています。
ここには説明が長々と書かれていますが、実際に行うのは下記の手順だけです。
インストールするROSのパッケージは、ROS_CommとDesktopとがありますが、ロボットに搭載するコンピュータなので、ROS_Commを選択しました。
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu jessie main" > /etc/apt/sources.list.d/ros-latest.list'
$ wget https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -O - | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install python-pip python-setuptools python-yaml python-distribute python-docutils python-dateutil python-six
$ sudo pip install rosdep rosinstall_generator wstool rosinstall
$ sudo rosdep init
$ rosdep update
$ mkdir ~/ros_catkin_ws
$ cd ~/ros_catkin_ws
ROS-Commonのインストール
$ rosinstall_generator ros_comm --rosdistro indigo --deps --wet-only --exclude roslisp --tar > indigo-ros_comm-wet.rosinstall
$ wstool init src indigo-ros_comm-wet.rosinstall
$ rosdep install --from-paths src --ignore-src --rosdistro indigo -y -r --os=debian:jessie
$ sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/indigo
ビルドの途中でメモリ不足となり止まったので、-j 2オプションを追加して再実行
$ sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/indigo -j2
$ source /opt/ros/indigo/setup.bash
$ echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
ながら作業だったので正確な時間はわかりませんが、1時間くらいかかったでしょうか。
試しにroscoreを起動してみます。
これでROSのインストールは完了です。
RaspberryPi3のWiFiでアクセスポイントに接続しようとしました。しかし#iwlist wlan0 scan | grep SSID
で私のアクセスポイントが現れません。
そこで、# iwlist wlan0 channel
で調べると、WiFiのchannelが11までしかありません。 12ch, 13chが使えていません。
調べてみると、このページ: Getting access to Channel 13 on a Raspberry Pi 3がみつかりました。
どうやらファームウエアを更新すれば良いらしいです。
# apt-get update
# apt-get upgrade
# apt-get dist-upgrade
# rpi-update
# reboot
# rpi-update 41f8b4812ad653abf321b8c54cb4bee57ebdb129
# reboot
これでWiFiの12ch, 13chも使えるようになりました。