Raspberry Pi 3 Model B + Camera V2.1 docker クロス開発 [プログラミング]
前回は、ラズパイでdockerを動作させるところまで記録した。今回は、Windowsでラズパイのdockerコンテナを開発することに挑戦する。
肝はこれだと思う。
docker buildx build . -t pxosdk:0.1 --platform linux/arm64 -o type=docker,dest=- > myimage.tar
しかし、このtarをラズパイにコピーし、docker loadしてもエラーが起きてしまう。
$ docker load < myimage.tarError processing tar file(exit status 1): archive/tar: invalid tar header
dest=-として標準出力にtarの中身を吐き出しているようだが、windowsでは標準エラーも同じところに出力してしまうので、tarにゴミが混じると推測した。そこで、destに直接ファイル名を指定することで解決した。
>docker buildx build . -t hello_rp:0.1 --platform linux/arm64 -o type=docker,dest=hello_rp.tar[+] Building 2.8s (8/8) FINISHED docker-container:mybuilder=> [internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 101B 0.0s=> [internal] load metadata for docker.io/library/python:3.9-slim-buster 2.3s=> [auth] library/python:pull token for registry-1.docker.io 0.0s=> [internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [internal] load build context 0.0s=> => transferring context: 25B 0.0s=> [1/2] FROM docker.io/library/python:3.9-slim-buster@sha256:320a7a4250aba4249f458872adecf92eea88dc6abd2d76dc5c0f01cac9b53990 0.0s=> => resolve docker.io/library/python:3.9-slim-buster@sha256:320a7a4250aba4249f458872adecf92eea88dc6abd2d76dc5c0f01cac9b53990 0.0s=> CACHED [2/2] COPY a.py 1.py 0.0s=> exporting to docker image format 0.4s=> => exporting layers 0.0s=> => exporting manifest sha256:17d61a2254f3fdfc7419608ac1a60a7e3b67c7a91e98ea6cc696a8d36bf5e2de 0.0s=> => exporting config sha256:1fc37e61be263a22d171472e011a7a9e5d92625f12ae3b94a52c3052dcbeec0a 0.0s=> => sending tarball
ラズパイに転送して、実行できることを確認した。
$ docker load < hello_rp.tarLoaded image: hello_rp:0.1$ docker run hello_rp:0.1Hello, world!
ちなみに、おなじtarをwindowsにloadしても実行できた。
>docker load < hello_rp.tar87bc36f72cf5: Loading layer [==================================================>] 25.92MB/25.92MBdcbd2252343f: Loading layer [==================================================>] 2.647MB/2.647MB6e4f4f2a1b40: Loading layer [==================================================>] 11.13MB/11.13MBcd49bcee103a: Loading layer [==================================================>] 242B/242Be563f3050990: Loading layer [==================================================>] 3.136MB/3.136MBd107005ea74e: Loading layer [==================================================>] 128B/128BLoaded image: hello_rp:0.1>docker run hello_rp:0.1WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64/v3) and no specific platform was requestedHello, world!!
WARNINGが出ているので、ラズパイ用であることは間違いなさそうだが、動くのはなぜだろう?
pythonスクリプトが動いたので、次回は外部ライブラリが動くことを目指す。
Raspberry Pi 3 Model B + Camera V2.1 Debian 1:6.1.54-1+rpt2 (2023-10-05) [プログラミング]
先週起動ディスクと作るところから始めたラズパイだが、さっき起動ディスクを作り直したら、Camera V2.1がデフォルトで使えるようになってて驚いた。
OSバージョンはこちら。
$ uname -aLinux raspberrypi 6.1.0-rpi4-rpi-v8 #1 SMP PREEMPT Debian 1:6.1.54-1+rpt2 (2023-10-05) aarch64 GNU/Linux
~ $ libcamera-still -o test.jpgPreview window unavailable[0:04:25.367545312] [1453] INFO Camera camera_manager.cpp:284 libcamera v0.1.0+52-a858d20b[0:04:25.497665380] [1456] WARN RPiSdn sdn.cpp:39 Using legacy SDN tuning - please consider moving SDN inside rpi.denoise[0:04:25.501860671] [1456] WARN RPI vc4.cpp:333 Mismatch between Unicam and CamHelper for embedded data usage![0:04:25.503678839] [1456] INFO RPI vc4.cpp:387 Registered camera /base/soc/i2c0mux/i2c@1/imx219@10 to Unicam device /dev/media3 and ISP device /dev/media0Stream configuration adjusted[0:04:25.505581590] [1453] INFO Camera camera.cpp:1213 configuring streams: (0) 1640x1232-YUV420[0:04:25.506482627] [1456] INFO RPI vc4.cpp:549 Sensor: /base/soc/i2c0mux/i2c@1/imx219@10 - Selected sensor format: 1640x1232-SBGGR10_1X10 - Selected unicam format: 1640x1232-pBAA#0 (0.00 fps) exp 33251.00 ag 8.00 dg 1.00#1 (30.01 fps) exp 33251.00 ag 8.00 dg 1.00#2 (30.00 fps) exp 33251.00 ag 8.00 dg 1.00...#141 (30.01 fps) exp 33251.00 ag 8.00 dg 1.00#142 (30.01 fps) exp 33251.00 ag 8.00 dg 1.00[0:04:30.650220654] [1453] INFO Camera camera.cpp:1213 configuring streams: (0) 3280x2464-YUV420 (1) 3280x2464-SBGGR10_CSI2P[0:04:30.662149345] [1456] INFO RPI vc4.cpp:549 Sensor: /base/soc/i2c0mux/i2c@1/imx219@10 - Selected sensor format: 3280x2464-SBGGR10_1X10 - Selected unicam format: 3280x2464-pBAAStill capture image received
raspi-configのInterface Optionから"I1 Legacy Camera Enable/disable legacy camera support"というメニューすら消えている。
タグ:ラズパイ
Raspberry Pi 3 Model B + Camera V2.1 docker [プログラミング]
前回は、ラズパイカメラのストリーミングができるようにしたところまでを記録した。
そのpython scriptをdockerで動作させることに挑戦することにした。
https://tech-lab.sios.jp/archives/27798 を参考に、ラズパイにdockerをインストールした。
sudo apt install docker.io
DockerHubからnginxのイメージをダウンロードして実行した。
docker run -d --name=nginx -p 8080:80 ngin
普通に動いているようだ。(注:参考サイトのようにnameの前のハイフンが一つだと動かない)
つぎに、pythonスクリプトを実行してみる。
フォルダを作成し、2つのファイルを保存した。
a.py
print("Hello, world")
Dockerfile
FROM python:3.9-slim-busterCOPY a.py 1.pyCMD python 1.py
ビルドして実行。
$ docker build -t py-hello .Sending build context to Docker daemon 3.072kBStep 1/3 : FROM python:3.9-slim-buster---> bb1bad240fdfStep 2/3 : COPY a.py 1.py---> Using cache---> 15813e110ccbStep 3/3 : CMD python 1.py---> Using cache---> b3e25f80d097Successfully built b3e25f80d097Successfully tagged py-hello:latest$ docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEpy-hello latest b3e25f80d097 34 seconds ago 110MB$ docker run py-helloHello, world
ラズパイ上で開発するは、時間がかかりそうなので、次回はwindowsでラズパイのdockerコンテナをビルドすることに挑戦する。
Raspberry Pi 3 Model B + Camera V2.1 picamera2 mjpeg_server.py 成功 [プログラミング]
前回は、web.pyを使って静止画をリモートから見られるようにしたかったが失敗したところまで記録した。原因を解明しようとpicamera2のサイトを見ていたところ、当初やりたかったことを実現してくれそうなスクリプトを見つけたので、まずはそれを実行することにした。
mjpeg_server.py
$ python webpy/mjpeg_server.py[2:15:51.949590188] [2588] INFO Camera camera_manager.cpp:297 libcamera v0.0.5+83-bde9b04f[2:15:52.014895340] [2589] WARN RPI vc4.cpp:383 Mismatch between Unicam and CamHelper for embedded data usage![2:15:52.016671130] [2589] INFO RPI vc4.cpp:437 Registered camera /base/soc/i2c0mux/i2c@1/imx219@10 to Unicam device /dev/media3 and ISP device /dev/media1[2:15:52.016786078] [2589] INFO RPI pipeline_base.cpp:1101 Using configuration file '/usr/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml'[2:15:52.031080000] [2588] INFO Camera camera.cpp:1033 configuring streams: (0) 640x480-XBGR8888 (1) 640x480-SBGGR10_CSI2P[2:15:52.032129484] [2589] INFO RPI vc4.cpp:565 Sensor: /base/soc/i2c0mux/i2c@1/imx219@10 - Selected sensor format: 640x480-SBGGR10_1X10 - Selected unicam format: 640x480-pBAA192.168.10.23 - - [09/Oct/2023 14:12:49] "GET /index.html HTTP/1.1" 200 -192.168.10.23 - - [09/Oct/2023 14:12:49] "GET /stream.mjpg HTTP/1.1" 200 -
ただ実行するだけで、ストリーミング配信出来ている。
負荷もそれほど高くないようだ。
$ vmstat 1 5procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r b swpd free buff cache si so bi bo in cs us sy id wa st1 0 0 406268 18964 282736 0 0 8 1 902 91 1 0 99 0 01 0 0 405316 18964 282736 0 0 0 0 12203 4666 18 4 78 0 01 0 0 405092 18964 282736 0 0 0 0 11973 4453 20 4 77 0 01 0 0 405092 18964 282736 0 0 0 0 12283 4724 17 4 79 0 01 0 0 405092 18964 282736 0 0 0 0 12056 4412 16 5 79 0 0
次回から、dockerで動作させることに挑戦する。
Raspberry Pi 3 Model B + Camera V2.1 picamera2 web.py 失敗 [プログラミング]
前回は、libcamera-stillで静止画が撮れるところまでを記録した。 次に、カメラで撮影した画像を、外から見られるようにしたくなった。動画として見られるとよいのだが、まずは静止画がみられることを目標にした。 まずは、pythonのpicamera2とwebpyで、あるurlにアクセスしたら静止画を撮ってそれを返すプログラムを作ることにした。 1. picamera2 このページを参考に環境を構築した。 https://github.com/raspberrypi/picamera2
- sudo apt install -y python3-pyqt5 python3-opengl
- sudo apt install -y python3-picamera2 --no-install-recommends
2. web.py
- pip install web.py==0.61
- app.py
- "==0.61"の意味はわかってない。
- import web
- import io
- import time
- from picamera2 import Picamera2
- urls = (
- "/",
- "index"
- )
- class index:
- def __init__(self):
- self.cam = Picamera2()
- self.capture_config = self.cam.create_still_configuration()
- self.cam.configure(self.cam.create_preview_configuration())
- def GET(self):
- self.cam.start()
- time.sleep(1)
- data = io.BytesIO()
- self.cam.capture_file(data, format='jpeg')
- self.cam.stop()
- return(data.getvalue())
- #image = open("/home/python/Pictures/camera.jpg", "rb").read()
- #return image
- if __name__ == '__main__':
- app = web.application(urls, globals())
- app.run()
- 実行 最初のアクセスには、正しく静止画を返してくれたが、2回目のアクセスで落ちる。
- ファイルに保存してからそれを返すのではなく、メモリ中にjpgイメージを作ってそれをかえすことで、ディスクの寿命を延ばす作戦。
- $ python app.py
- [1:43:46.506893147] [2163] INFO Camera camera_manager.cpp:297 libcamera v0.0.5+83-bde9b04f
- [1:43:46.598907128] [2180] WARN RPI vc4.cpp:383 Mismatch between Unicam and CamHelper for embedded data usage!
- [1:43:46.600689216] [2180] INFO RPI vc4.cpp:437 Registered camera /base/soc/i2c0mux/i2c@1/imx219@10 to Unicam device /dev/media3 and ISP device /dev/media1
- [1:43:46.600802029] [2180] INFO RPI pipeline_base.cpp:1101 Using configuration file '/usr/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml'
- [1:43:46.616782902] [2163] INFO Camera camera.cpp:1033 configuring streams: (0) 640x480-XBGR8888 (1) 640x480-SBGGR10_CSI2P
- [1:43:46.618274573] [2180] INFO RPI vc4.cpp:565 Sensor: /base/soc/i2c0mux/i2c@1/imx219@10 - Selected sensor format: 640x480-SBGGR10_1X10 - Selected unicam format: 640x480-pBAA
- 192.168.10.23:56710 - - [09/Oct/2023 13:40:27] "HTTP/1.1 GET /" - 200 OK
- 192.168.10.23:56710 - - [09/Oct/2023 13:40:27] "HTTP/1.1 GET /favicon.ico" - 404 Not Found
- [1:45:28.564968768] [2165] ERROR Camera camera.cpp:525 Camera in Configured state trying acquire() requiring state Available
- Camera __init__ sequence did not complete.
- Traceback (most recent call last):
- File "/usr/lib/python3/dist-packages/picamera2/picamera2.py", line 242, in __init__ self._open_camera() File "/usr/lib/python3/dist-packages/picamera2/picamera2.py", line 446, in _open_camera self.camera.acquire() RuntimeError: Failed to acquire camera: Device or resource busy
- During handling of the above exception, another exception occurred:
- Traceback (most recent call last):
- File "/home/python/.local/lib/python3.9/site-packages/web/application.py", line 280, in process
- return self.handle()
- File "/home/python/.local/lib/python3.9/site-packages/web/application.py", line 271, in handle
- return self._delegate(fn, self.fvars, args)
- File "/home/python/.local/lib/python3.9/site-packages/web/application.py", line 514, in _delegate
- return handle_class(cls)
- File "/home/python/.local/lib/python3.9/site-packages/web/application.py", line 491, in handle_class
- tocall = getattr(cls(), meth)
- File "/home/python/Documents/prog/webpy/app.py", line 13, in __init__
- self.cam = Picamera2()
- File "/usr/lib/python3/dist-packages/picamera2/picamera2.py", line 254, in __init__
- raise RuntimeError("Camera __init__ sequence did not complete.")
- RuntimeError: Camera __init__ sequence did not complete.
- 192.168.10.23:56740 - - [09/Oct/2023 13:42:08] "HTTP/1.1 GET /" - 500 Internal Server Error
次回は、これの修正を試みる。
Raspberry Pi 3 Model B + Camera V2.1 静止画撮影ができるまで [プログラミング]
昔買ったラズパイとカメラを引っ張り出してきて何かプログラミングを始めようと思い立った。 1. Raspberry Pi OS すでにアカウント名やパスワードを忘れてしまったので、ブートディスクを作り直した。
- ここからWindows用のRaspberry Pi Imagerをダウンロードしてインストールした。
- Raspberry Pi Imagerを起動して、SDカードに焼いた
- OSは、64bitのBullseyeを選んだ。
- 起動
- アカウント名とパスワード、WiFiのSSIDとパスフレーズ、sshをONに設定した。 WiFiは、"a"には対応していないようなので"g"で終わるSSIDを設定しなければならない。
- マウスとキーボード、HDMIをラズパイにつなぎ、SDカードをさして、電源を入れると、GUIが見える。
2. カメラを使う 以前もカメラを使っていて、接続もそのままだったので、すぐに使えるかと思いlibcamera-stillを実行したところ、このエラーが出て失敗。
(2023/10/13 OSのアップデートにより、これらのエラーはなくなりました。こちらをご覧ください)
- ERROR: *** no cameras available ***
いろいろググってこれらを実施して写真が撮れるようになった。
- raspi-confg
- "3 Interface Options"を選択する
- /boot/config.txt
- "I1 Legacy Camera Enable/disable legacy camera support"を選択する。"Would you like to enable legacy camera support?"へ"はい"と答える。"Legacy camera support is enabled."と表示される。
- Camera V2.1を使うために、ファイルの最後にこれを追記して、再度リブート。
- dtoverlay=imx219
- libcamera-still -o test.jpg
- sshでログインしたターミナルから実行したときの出力
Preview window unavailable
[0:15:02.332355278] [1078] INFO Camera camera_manager.cpp:297 libcamera v0.0.5+83-bde9b04f
[0:15:02.425273541] [1079] WARN RPI vc4.cpp:383 Mismatch between Unicam and CamHelper for embedded data usage!
[0:15:02.426994700] [1079] INFO RPI vc4.cpp:437 Registered camera /base/soc/i2c0mux/i2c@1/imx219@10 to Unicam device /dev/media3 and ISP device /dev/media1
[0:15:02.427104336] [1079] INFO RPI pipeline_base.cpp:1101 Using configuration file '/usr/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml'
[0:15:02.429126956] [1078] INFO Camera camera.cpp:1033 configuring streams: (0) 1640x1232-YUV420
[0:15:02.430171808] [1079] INFO RPI vc4.cpp:565 Sensor: /base/soc/i2c0mux/i2c@1/imx219@10 - Selected sensor format: 1640x1232-SBGGR10_1X10 - Selected unicam format: 1640x1232-pBAA
#0 (0.00 fps) exp 20963.00 ag 2.00 dg 1.35
#1 (30.00 fps) exp 28714.00 ag 2.00 dg 1.10
...
#142 (30.00 fps) exp 28336.00 ag 2.00 dg 1.00
[0:15:07.582503902] [1078] INFO Camera camera.cpp:1033 configuring streams: (0) 3280x2464-YUV420 (1) 3280x2464-SBGGR10_CSI2P [0:15:07.585346840] [1079] INFO RPI vc4.cpp:565 Sensor: /base/soc/i2c0mux/i2c@1/imx219@10 - Selected sensor format: 3280x2464-SBGGR10_1X10 - Selected unicam format: 3280x2464-pBAA
Still capture image received .
[0:15:02.332355278] [1078] INFO Camera camera_manager.cpp:297 libcamera v0.0.5+83-bde9b04f
[0:15:02.425273541] [1079] WARN RPI vc4.cpp:383 Mismatch between Unicam and CamHelper for embedded data usage!
[0:15:02.426994700] [1079] INFO RPI vc4.cpp:437 Registered camera /base/soc/i2c0mux/i2c@1/imx219@10 to Unicam device /dev/media3 and ISP device /dev/media1
[0:15:02.427104336] [1079] INFO RPI pipeline_base.cpp:1101 Using configuration file '/usr/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml'
[0:15:02.429126956] [1078] INFO Camera camera.cpp:1033 configuring streams: (0) 1640x1232-YUV420
[0:15:02.430171808] [1079] INFO RPI vc4.cpp:565 Sensor: /base/soc/i2c0mux/i2c@1/imx219@10 - Selected sensor format: 1640x1232-SBGGR10_1X10 - Selected unicam format: 1640x1232-pBAA
#0 (0.00 fps) exp 20963.00 ag 2.00 dg 1.35
#1 (30.00 fps) exp 28714.00 ag 2.00 dg 1.10
...
#142 (30.00 fps) exp 28336.00 ag 2.00 dg 1.00
[0:15:07.582503902] [1078] INFO Camera camera.cpp:1033 configuring streams: (0) 3280x2464-YUV420 (1) 3280x2464-SBGGR10_CSI2P [0:15:07.585346840] [1079] INFO RPI vc4.cpp:565 Sensor: /base/soc/i2c0mux/i2c@1/imx219@10 - Selected sensor format: 3280x2464-SBGGR10_1X10 - Selected unicam format: 3280x2464-pBAA
Still capture image received .
次回は、静止画をweb配信することに挑戦する。
Raspberry Pi 3【Model B+】スターターセット/アドバンス RASPi3P-ADV
- 出版社/メーカー: 共立電子産業
- メディア:
タグ:Raspberry Pi ラズパイ