Ubuntu 20.10 (groovy) on Pi4 で raspistill と picamera を試してみた

のびのびラーニング
15 min readOct 28, 2020

Ubuntu 20.10 (groovy gorilla) の Desktop 版が正式に RasPi に対応したそうです。
https://raspida.com/ubuntu2010-rpi4

ラズパイダさん、良質な記事をいつもありがとうございます 🙇
しかも、raspistillraspivid コマンドが使えるとのことで、早速このゴリラを試してみました。

公式カメラモジュールが 64 bit OS では使えない問題

_

raspistill などの公式カメラモジュールで撮影する機能
https://www.raspberrypi.org/documentation/usage/camera/raspicam/raspistill.md
は、これまで Raspberry Pi OS の 64 bit 版では利用できませんでした。
https://www.raspberrypi.org/forums/viewtopic.php?t=285868

$ raspistill -o image.jpgErrors:
mmal: mmal_port_event_send: event lost on port 1,0 (buffer header callback not defined)
mmal: mmal_port_event_send: event lost on port 1,0 (buffer header callback not defined)
$ python3
Python 3.7.3 (default, Jul 25 2020, 13:03:44)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import picamera
Traceback (most recent call last):
...
OSError: libmmal.so: cannot open shared object file: No such file or directory
>>> quit()
$ find /usr/lib -name "libmmal.so"
$

上記で No such file or directorylibmmal.so は、32 bit 版の場合 /opt/vc/lib/ 以下にあります。

$ find /opt -name "libmmal.so"
/opt/vc/lib/libmmal.so
$ ls -lhF /opt/
total 12K
drwxr-xr-x 5 root root 4.0K Feb 19 2020 minecraft-pi/
drwxr-xr-x 3 root root 4.0K Feb 14 2020 pigpio/
drwxr-xr-x 6 root root 4.0K Feb 14 2020 vc/

64 bit 版では /usr/ 以下に変更されたはず
https://www.raspberrypi.org/forums/viewtopic.php?t=275370
なのですが、libmmal.so はずっと行方不明でした。

これが、64 bit Ubuntu で利用できるのであれば色々便利になります。

burn image -> first boot

_

早速 image を焼いて起動すると、Ubuntu ロゴのぐるぐるアニメーションの後、Groovy ゴリラさんのデスクトップが表示され、その後 Ubuntu のおなじみの初期設定が始まります。
preinstalled image なのですが、これはあるんですね。

初期設定が終わると、自動的に再起動します。
再起動後、普通の Ubuntu PC と同じようにログインします。

update && upgrade

_

ひとまずパッケージを更新します。

$ sudo apt update && sudo apt upgrade

...
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
cryptsetup-bin dctrl-tools dmeventd dmraid dpkg-repack
efibootmgr gir1.2-timezonemap-1.0 gir1.2-xkl-1.0 grub-common
grub-efi-arm64 grub-efi-arm64-bin grub-efi-arm64-signed
grub2-common kpartx kpartx-boot libdebian-installer4
libdevmapper-event1.02.1 libdmraid1.0.0.rc16 liblvm2cmd2.03
libreadline5 libtimezonemap-data libtimezonemap1 lvm2
os-prober python3-icu python3-pam rdate thin-provisioning-tools
これを削除するには 'sudo apt autoremove' を利用してください。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。

あら、いらないのがたくさんありますね。

$ sudo apt purge cryptsetup-bin dctrl-tools dmeventd dmraid dpkg-repack efibootmgr gir1.2-timezonemap-1.0 gir1.2-xkl-1.0 grub-common grub-efi-arm64 grub-efi-arm64-bin grub-efi-arm64-signed grub2-common kpartx kpartx-boot libdebian-installer4 libdevmapper-event1.02.1 libdmraid1.0.0.rc16 liblvm2cmd2.03 libreadline5 libtimezonemap-data libtimezonemap1 lvm2 os-prober python3-icu python3-pam rdate thin-provisioning-tools

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージは「削除」されます:
...
アップグレード: 0 個、新規インストール: 0 個、削除: 28 個、保留: 0 個。
この操作後に 44.9 MB のディスク容量が解放されます。
続行しますか? [Y/n]
(データベースを読み込んでいます ... 現在 137400 個のファイルとディレクトリがインストールされています。)
cryptsetup-bin (2:2.3.3-1ubuntu6) を削除しています ...
dctrl-tools (2.24-3) を削除しています ...
lvm2 (2.03.07-1ubuntu3) を削除しています ...
Warning: Stopping lvm2-lvmpolld.service, but it can still be activated by:
lvm2-lvmpolld.socket

えっ!?but it can still be activated!?
消したらまずかったかな…?

$ sudo reboot; exit

一応、再起動できたので、良かったということにしましょう。
(ご不安な方は、真似をされないようお願い致します。)

Raspberry Pi カメラモジュールの動作を確認

_

早速 raspistill にトライしてみます。

$ raspistill -o test.jpg
* failed to open vchiq instance

なんかエラーが出ます。
ググってみたところ、パーミッションの問題のようです。
https://stackoverflow.com/questions/42583835/failed-to-open-vchiq-instance

$ ls -lhF /dev/vchiq
crw-rw---- 1 root video 237, 0 9月 25 04:27 /dev/vchiq

user はデフォルトでは video グループに所属していないため、所属させます。
(ユーザー名を、仮に ubuntu としています)

$ sudo gpasswd -a ubuntu video
[sudo] password for ubuntu:
Adding user ubuntu to group video

ターミナルを一旦 exit してから再度 raspistill を実行すると…

$ raspistill -o test.jpg

今度はきちんと撮影できました!感激!!

Python で使う

_

Ubuntu には apt の python3-picamera のパッケージが無いので、
公式ガイド
https://picamera.readthedocs.io/en/latest/install.html
の記述にしたがって、pip で install します。

$ sudo apt install python3-venv

パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
python-pip-whl python3-distutils python3.8-venv
以下のパッケージが新たにインストールされます:
python-pip-whl python3-distutils python3-venv python3.8-venv
アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 0 個。
1,990 kB のアーカイブを取得する必要があります。
この操作後に追加で 3,343 kB のディスク容量が消費されます。
続行しますか? [Y/n]

picamera 用の仮想領域を作ります。

$ mkdir ~/venv
$ cd ~/venv/; python3 -m venv --system-site-packages picamera
$ source ~/venv/picamera/bin/activate
(picamera) $

仮想領域の PyPI のパッケージを pip コマンドで install していきます。

(picamera) $ pip3 install -U pip
(picamera) $ pip3 install -U setuptools
...
launchpadlib 1.10.13 requires testresources, which is not installed.

$ dpkg -l | grep launchpad
ii python3-launchpadlib 1.10.13-1
$ dpkg -l | grep testresources

本件とは関係ありませんが、launchpadlibtestresources が要るよと言っているので一応入れておきます。

$ sudo apt install python3-testresources
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
python3-linecache2 python3-pbr python3-setuptools python3-traceback2 python3-unittest2
提案パッケージ:
python-setuptools-doc
以下のパッケージが新たにインストールされます:
python3-linecache2 python3-pbr python3-setuptools python3-testresources python3-traceback2
python3-unittest2
アップグレード: 0 個、新規インストール: 6 個、削除: 0 個、保留: 0 個。
649 kB のアーカイブを取得する必要があります。
この操作後に追加で 3,296 kB のディスク容量が消費されます。
続行しますか? [Y/n]

改めてガイドに従って picamera を入れます。
が、picamera で array を利用する場合は numpy が必要なよう
https://github.com/waveform80/picamera/blob/release-1.13/setup.py#L88
なので、先に apt で numpy を入れます。

$ sudo apt install python3-numpy
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
libblas3 libgfortran5 liblapack3
提案パッケージ:
gcc gfortran python-numpy-doc python3-dev python3-pytest python3-numpy-dbg
以下のパッケージが新たにインストールされます:
libblas3 libgfortran5 liblapack3 python3-numpy
アップグレード: 0 個、新規インストール: 4 個、削除: 0 個、保留: 0 個。
5,266 kB のアーカイブを取得する必要があります。
この操作後に追加で 28.1 MB のディスク容量が消費されます。
続行しますか? [Y/n]

気を取り直して picamera を入れます。

(picamera) $ pip3 install -U "picamera[array]"
WARNING: Keyring is skipped due to an exception: Failed to unlock the collection!
Collecting picamera[array]
Using cached picamera-1.13.tar.gz (143 kB)
Requirement already satisfied, skipping upgrade: numpy in ./picamera/lib/python3.8/site-packages (f\
rom picamera[array]) (1.19.2)
Using legacy 'setup.py install' for picamera, since package 'wheel' is not installed.
Installing collected packages: picamera
Running setup.py install for picamera ... done
Successfully installed picamera-1.13

Python から picamera を使ってみます。

$ python3
Python 3.8.6 (default, Sep 25 2020, 09:36:53)
[GCC 10.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> import picamera
>>> pc = picamera.PiCamera()
mmal: mmal_component_create_core: could not find component 'vc.camera_info'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/pi/venv/picamera/lib/python3.8/site-packages/picamera/camera.py", line 367, in __init\
__
with mo.MMALCameraInfo() as camera_info:
File "/home/pi/venv/picamera/lib/python3.8/site-packages/picamera/mmalobj.py", line 2346, in __in\
it__
super(MMALCameraInfo, self).__init__()
File "/home/pi/venv/picamera/lib/python3.8/site-packages/picamera/mmalobj.py", line 631, in __ini\
t__
mmal_check(
File "/home/pi/venv/picamera/lib/python3.8/site-packages/picamera/exc.py", line 184, in mmal_chec\
k
raise PiCameraMMALError(status, prefix)
picamera.exc.PiCameraMMALError: Failed to create MMAL component b'vc.camera_info': Function not imp\
lemented

だめでしたね… 🗿

raspistill が動いているので、やりようはありそうですが、picamera は 2017 年以降はリリースが停止している
https://github.com/waveform80/picamera/releases
ため、公式な対応は期待薄かもしれません。

まとめ

_

残念ながら今回は Python から利用する所までは行けませんでしたが、Raspberry Pi OS 64 bit では使えなかった公式カメラモジュールが利用できるだけでもすばらしい進展です。

同様の悩みを抱えておられた方は、ぜひゴリラをお試しください。
https://ubuntu.com/download/raspberry-pi

本日の内容は以上です。
ご精読頂き、まことにありがとうございます。

--

--