香港島 自転車紀行

香港と言えば、西は堅尼地城 (Kennedy Town) 、東は柴灣(Chai Wan)、北は維港を跨いで九龍の太子(Prince Edward)あたりまでの範囲が一般的によく知られています。

海と山に囲まれた細長い市街地に高層建築物が隙間なく林立する光景は、きわめて特徴的で象徴的ですらあります。

それでは活気に溢れた中心市街地を少し離れると何があるのでしょう。

人によっては「何もない」が答えかもしれませんし、また別の人は「坂がある」と回答されるかもしれません。

いずれにせよ、市街地を少し離れた場所には定住者のいない(そして大抵は傾斜のきつい)緑地帯が広がっています。

国際金融中心として名高い中環(Central)から、わずか 5km ほど離れただけで別世界のような光景が広がります。

まるで高原リゾート地帯にでもやって来たかのような山岳風景に驚くばかりですが、これでも急峻な山道や非日常的な絶景という意味では、ほんの序の口に過ぎません。

高度に都市化されているように見える港島(Hong Kong Island)でも南に向かうほど、緑地や自然海岸線の割合が増え、それに比例するかのように道路もアップダウンを増していきます。

それでも港島は九龍や離島に比べれば傾斜の緩やかな坂(斜度 6-9% 程度)が多いので、ロードバイクやマウンテンバイクで走り慣れている人であれば半周することは難しくはありません。

中環から赤柱 (Stanley) や石澳(Shek O)まで西回りで訪れても距離は片道 26 – 33 km 程度にしかなりませんので、私のように始業前や終業後に走りに出かけて港鐵(MTR)で輪行しながら帰ってくることも不可能ではありません。

ただし Gap Road と名前の付いている道路だけは例外で、どこも斜度 15% を超える急勾配が当たり前のように出てきますので注意が必要です。




話を戻しまして、西岸の摩星嶺(Mount Davis)や薄扶林(Pok Fu Lam)といった山岳地帯を超えていくと、港島の南岸へと向かう長いダウンヒルが始まります。

遠くに海を見渡しながら坂を駆け下りたさきには、対岸とよく似た高層建築物の建ち並ぶ市街地が広がっています。香港仔(Aberdeen)と呼ばれる南部の代表的な市街地です。

この辺りの1號幹線(Route 1)は通行車両の平均速度が異様に高く、自転車進入禁止の高架入口が複数ヶ所あり、概して道幅も狭いので注意が必要です。その一方で港鐵(MTR)の駅が近くにありますので、知っておくと輪行に便利でもあります。

香港仔を通り抜けて、海洋公園から香島道(Island Rd)に入ると再び景色が大きく変わります。いよいよ海洋に浮かぶ島らしくなってきました。

片側1車線は維持し続けているものの、歩道は部分的にしか存在せず、道幅も狭くて見通しも良くない道路が続きます。豊富なアップダウンに、切土に、崖道に、落石注意と、おおよそ亞洲國際都會が出して良いような雰囲気ではない険しい山道の連続です。

その反面、周辺の光景は息を呑むほどの美しさです。

ほどなくして、大潭道と赤柱村道の分岐点へと到着します。ここを直進すれば石澳、右折すれば赤柱が見えてきます。

石澳と赤柱。どちらも良い場所ですが、初めて訪れるのであれば赤柱のほうが良いかもしれません。

赤柱は雰囲気の明るい観光地でセブンイレブンやマクドナルドを始めとした補給地点が豊富にあります。ちょうど疲れてきた頃に、冷たい飲み物が頂けるのはありがたいものです。

ここまででも刺激的で変化に富んだライドを楽しめましたが、香港の名物でもある豊富なフェリー航路と港鐵路線を組み合わせると、およそ 200 もの島嶼と新界を組み合わせた「ちょっとした冒険」を気軽に楽しめるようになります。

その内容も南国のビーチリゾートから野生の牛が暮らす山林、数十kmにも及ぶ長大なサイクリングロードまでと多様性と意外性に満ちています。

自転車に乗って香港を走ってみると、この都市がいかにさまざまな顔を持っているか、徒歩で行ける範囲だけでは分からない全容が見えてくるのでオススメです。

Raspberry Pi にカメラを接続して画像を NAS に転送

画像認識のための Raspberry Pi セットアップもいよいよカメラ設置段階まで進みました。今回の目標は Raspi でデジタルカメラを動作させて、得られた画像データをネットワークHDD (NAS) に転送することです。

ストレージも USB ポート数も何もかもが不足している Raspi の弱点はネットワーク接続機器を使って補います。

カメラモジュール
一般的に Raspi でカメラと言えば、カメラモジュールを用います。私も「ちょっと珍しいから」という理由で赤外線カメラモジュールを購入しました。


Raspberry Pi Camera Module V2 カメラモジュール

後述する理由から一般的なカメラモジュールは購入を見送りましたが、赤外線カメラでも接続方法は変わるところはありません。

モジュールに繋がっているフレキシブルケーブル (FFC)を Raspi 回路基板のクリップに差し込めば接続完了です。

Raspberry Pi Zero W の場合にはモジュール付属ケーブルの形状が合いませんので、モジュールからフレキケーブルを引き抜いて、対応するケーブルに差し替える必要があります。

このケーブルは専用ケースの付属品になっていますので、ケースを購入すると一緒に入手できます。


Raspberry Pi Zero W公式シェル新品

このモジュールを接続した状態で、ターミナルから以下のコマンドを打ち込むと動作確認ができます。

$ raspistill -o ~/Desktop/cam.jpg

さらに画像の上下を反転させたり、ビデオやタイムラプスを撮影することも可能です。詳しくは公式のドキュメントに詳細が書いてあります。




WEBカメラ
カメラモジュールは簡単に使えて便利なのですが、私のそもそもの目的はコンベアベルトを作成することです。

この目的であれば、電子部品としては高額であまり入手性もよくない公式モジュールを使用しなくても十分な可能性があります。

また、モジュールに付属するフレキケーブル (FFC) やフレキ基盤 (FPC) も本音を言えば、あまり積極的に使いたい部品ではありません。繊細で壊れやすいためです。

市販品のデジタルカメラにも使用されている部品ですが、故障品を修理に出したときに補修部品としてよく見かける印象があります。

さらには学生時代にレンズスパナレンチを使ってオートフォーカスレンズを分解したときにも、自身で誤って破断させました。苦い経験です(※保証対象外になりますので真似しないでください)。

そこで、できればフレキケーブルは使用しておらず、複数個を調達することを考えて、もっと安価かつ入手性の良いカメラを探して行き着いた先が WEB カメラです。

こちらは USB ケーブルに Micro USB 変換コネクタを噛ませて Raspi の USB ポートに接続すれば、使用できるようになります。当然ながら Raspi 以外の普通の Linux デスクトップ PC でも問題なく使用できます。

使い方も lsusb コマンドで接続を確認、fswebcam コマンドで静止画キャプチャを作成、ffmpeg コマンドでビデオを録画といった具合に Linux マシンでいつもやっていることと変わりません。

$ lsusb
Bus 001 Device 002: ID 058f:6366 Alcor Micro Corp. Multi Flash Reader
Bus 001 Device 005: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

$ fswebcam -d /dev/video0 -r 1280x720 ~/Desktop/cam.jpg

$ ffmpeg -t 30 -f v4l2 -framerate 25 -i /dev/video0 ~/Desktop/output.mkv

これでファイル作成に成功していれば、画像認識用のプログラムからでも問題なく呼び出せるはずです。なんだか、こちらの方が使い慣れていて安心感がありますが、画質の面ではピクセル数 3280 × 2464 の SONY IMX219 を搭載した Raspi カメラモジュール(Camera Module v2) の方に利があります。


ロジクール ウェブカメラ C270n 国内正規品 2年保証

カメラから静止画像やビデオが取り込めるようになりましたら、次に問題になるのはストレージです。

画像認識の学習用データを自作しようと思ったら、どれだけ容量の大きなSDカードを用意したところで気休め程度にしかなりません。

むしろSDカードを補助記憶装置がわりに使用する Raspi の性質を考慮すると、学習データごときで容量を圧迫するのは「もったいない」とすら思えてきます。そこでデータの保存には無線接続されたハードディスク(NAS)をすることを考えます。

NAS(ネットワーク接続ストレージ)
一般的に市販されている NAS を購入してきて無線 LAN ルータやハブに接続すると、機器の内部ではローカル IP アドレスという 32bits のユニークな整数値が割り当てられます(※表示としては10進法に変換されて4桁ごとにドットで区切られたものが用いられます)。

このIPアドレスに同じネットワークに繋がっているパソコンやスマートフォンから接続すると、データを転送して保存したり、読み込んだりすることができるようになります。

Raspi を含む Linux マシンからローカル IP アドレスを調べるには、ずばりネットワーク自体のアドレスに対してホストスキャンをかければ一覧が表示されます。ネットワーク(※正確にはクラスCネットワークといいます)自体のアドレスは 192.168.1.0 に決まっているので対象の IP アドレスは 192.168.1.0 です。

$ sudo apt -y install nmap
$ sudo nmap -sn 192.168.1.0/24
[sudo] password for Goddard: 
Starting Nmap 7.60 ( https://nmap.org ) at 2019-08-31 13:04 JST
Nmap scan report for _gateway (192.168.1.1)
Host is up (0.00036s latency).
MAC Address: 00:00:00:00:00:00 (Mitsubishi Electric)
Nmap scan report for 192.168.1.3
Host is up (0.044s latency).
MAC Address: 00:00:00:00:00:00 (Sony Mobile Communications AB)
Nmap scan report for 192.168.1.6
Host is up (0.12s latency).
MAC Address: 00:00:00:00:00:00 (Asustek Computer)
Nmap scan report for 192.168.1.10
Host is up (0.11s latency).
MAC Address: 00:00:00:00:00:00 (Hon Hai Precision Ind.)
Nmap scan report for 192.168.1.11
Host is up (0.11s latency).
MAC Address: 00:00:00:00:00:00 (Raspberry Pi Foundation)
Nmap scan report for 192.168.1.13
Host is up (0.00024s latency).
MAC Address: 00:00:00:00:00:00 (I-O Data Device)
Nmap scan report for Ganymede (192.168.1.7)
Host is up.
Nmap done: 256 IP addresses (7 hosts up) scanned in 6.56 seconds

ここで私が使用している NAS は I-O DATA LAN DISK なので、目的のローカル IP アドレスは 192.168.1.13 と言うことがわかります。


I-O DATA NAS 4TB RAID 1/デュアルコアCPU/高速モデル/2ドライブ/日本製 3年保証

I-O DATA もしくは組み込み Linux と Samba で動いている NAS をお持ちの方は、試しにウェブブラウザから NASのローカルIPアドレス(私の場合では http://192.168.1.13/) にアクセスされると、そのまま設定画面にアクセスできちゃったりします。

この IP アドレスの SMB/CIFS ファイルシステムにある任意のディレクトリを Raspi にマウントしてしまえば、ターミナルやファイルシステムから自由にアクセスできるようになります。

ここではルート直下にある disk1 ディレクトリをマウントします。お使いの環境によっては share だったり Public だったりと言った別の名前がつけられているかもしれませんので、適宜改編してください。

$ sudo apt install cifs-utils
$ sudo mkdir /mnt/iodata && chmod 755 /mnt/iodata
$ sudo mount -t cifs //192.168.1.13/disk1 /mnt/iodata -o username=PI,password=RASPBERRY,iocharset=utf8

うまく実行できましたら、カメラから取得したデータを実際に保存してみます。うまく保存できていれば成功です。

$ sudo mkdir /mnt/iodata/raspberryPi/
$ sudo fswebcam -d /dev/video0 -r 1280x720 /mnt/iodata/cam.jpg

再起動時に毎回マウントすることが面倒であれば、あらかじめ設定しておけば起動時に自動的にマウントされます。

$ sudo vi /etc/fstab
//192.168.1.13/disk1 /mnt/iodata cifs username=PI,password=RASPBERRY,file_mode=0755,dir_mode=0755,iocharset=utf8,

これでようやくカメラを使って画像認識をはじめる準備が整いました。ここまで来て、ようやく学習データづくりとソフトウェアの着手に取り掛かれます。

まだまだ先は長いのです。

Android タブレットを Raspberry Pi モニタ代わりに使用する

Raspberry Pi Zero W V1.1 の出力装置として Android タブレットを使用することを考えます。

HDMIケーブルを用いて Raspberry Pi をディスプレイモニタに接続すれば Linux デスクトップPCとして Raspi を使用することは可能です。

この方法では、しかし、モニタの設置点に作業場所が固定されるなどの不都合が生じます。そこで Android タブレットをモニタに転用することで問題を解消します。

少し検索すると Microsoft Remote Desktop Protocol 準拠の xrdp サーバを利用する方法がよく出てきますが、過去にパッケージのインストール順序と設定で苦労した覚えがありますので、ここでは Virtual Network Computing (VNC) を利用して無線LAN経由で遠隔操作する方針を取ります。

まずは X11vnc をインストールするために Raspi にキーボードを接続して CTRL + Alt + T キーを同時に押してターミナルを立ち上げます。これは Ubuntu 派生の Linux ディストロで有効なキーボード・ショートカットです(※ デフォルト状態の Debian では無効です) 。

ターミナルが立ち上がりましたら、次のコマンドを打ち込んで必要なパッケージをインストールします。

$ sudo apt update
$ sudo apt -y upgrade
$ sudo apt -y install x11vnc

インストールが完了しましたら Raspi のIPアドレスを調べて、その後に X11vnc にパスワードを設定して実行します。

$ ifconfig wlan0
eth0: flags=4163 mtu 1500
inet 192.168.1.11 netmask 255.255.255.0 broadcast 192.168.1.255

$ x11vnc -storepasswd
Enter VNC password: 
Verify password:    
Write password to /home/pi/.vnc/passwd?  [y]/n 
Password written to: /home/pi/.vnc/passwd

$ x11vnc -usepw -forever -display :0

この状態で Android タブレット側の VNC クライアントを用いて Raspi に接続するとタブレットから遠隔操作を行えるようになります。

私の環境では Raspi の IP アドレスは 192.168.1.11 であり VNC で使用されるポート番号は TCP/5900 なので接続先は 192.168.1.11:5900 となります。これを指定して接続を行えばいいというわけです。

うまく接続できれば、タブレット画面に Raspi の出力が表示されるようになります。




ただし、ここで問題となるのは、この画面が表示されるのは X11vnc が起動しているときだけで、一度 Raspi の電源を落とすと再度 HDMI ケーブルを使用してモニタに接続する必要があることです。

このままでは不便なので Raspi の OS が立ち上がったときに自動的に X11vnc が実行されるように設定ファイルを作成します。

$ mkdir -p ~/.config/autostart
$ vi ~/.config/autostart/x11vnc.desktop

ファイルの内容は最低限これだけあれば十分です。必要に応じて、適宜改編してください。


[Desktop Entry]
Encoding=UTF-8
Type=Application
Name=X11VNC
Comment=
Exec=x11vnc -usepw -forever -display :0
StartupNotify=false
Terminal=false
Hidden=false


設定ファイルが用意できましたら、Raspi を再起動して設定ファイルが機能しているかどうかを調べます。

$ sudo reboot 

これで Raspi の再起動後に VNC クライアントから再接続できるようになっていれば自動起動は成功です。ここまで完了すれば、取り敢えずは Raspi からディスプレイモニタを取り外してしまっても何とかなります。

さて、次回はいよいよカメラを接続して画像認識の第一歩をはじめます。

つづき: Raspberry Pi にカメラを接続して画像を NAS に転送