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インストールまでの流れ

以下の流れでインストールを行いました。

  1. Linux (Raspbian Jessie)をマイクロSDカードにインストール
  2. 各種Linuxの設定
  3. Raspberry Pi 3上でROS Indigoのソースをダウンロード、ビルド、インストール

インストールする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のインストールは完了です。

メモ:Raspberry Pi 3 でWiFi 12ch, 13chを使えるようにする

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も使えるようになりました。