SSブログ
プログラミング ブログトップ

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.tar
Error 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.tar
Loaded image: hello_rp:0.1
$ docker run hello_rp:0.1
Hello, world!

ちなみに、おなじtarをwindowsにloadしても実行できた。

>docker load < hello_rp.tar
87bc36f72cf5: Loading layer [==================================================>]  25.92MB/25.92MB
dcbd2252343f: Loading layer [==================================================>]  2.647MB/2.647MB
6e4f4f2a1b40: Loading layer [==================================================>]  11.13MB/11.13MB
cd49bcee103a: Loading layer [==================================================>]     242B/242B
e563f3050990: Loading layer [==================================================>]  3.136MB/3.136MB
d107005ea74e: Loading layer [==================================================>]     128B/128B
Loaded image: hello_rp:0.1
>docker run hello_rp:0.1
WARNING: The requested image's platform (linux/arm64) does not match the detected host platform (linux/amd64/v3) and no specific platform was requested
Hello, world!!
WARNINGが出ているので、ラズパイ用であることは間違いなさそうだが、動くのはなぜだろう?
pythonスクリプトが動いたので、次回は外部ライブラリが動くことを目指す。

nice!(0)  コメント(0) 

Raspberry Pi 3 Model B + Camera V2.1 Debian 1:6.1.54-1+rpt2 (2023-10-05) [プログラミング]

先週起動ディスクと作るところから始めたラズパイだが、さっき起動ディスクを作り直したら、Camera V2.1がデフォルトで使えるようになってて驚いた。

rpi_bookworm.png

OSバージョンはこちら。

 $ uname -a
Linux raspberrypi 6.1.0-rpi4-rpi-v8 #1 SMP PREEMPT Debian 1:6.1.54-1+rpt2 (2023-10-05) aarch64 GNU/Linux

ここに書いた、raspi-configや/boot/config.txtの変更はもう必要ない。静止画もすぐ撮れる。

~ $ libcamera-still -o test.jpg
Preview 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/media0
Stream 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-pBAA
Still capture image received

raspi-configのInterface Optionから"I1 Legacy Camera Enable/disable legacy camera support"というメニューすら消えている。

タグ:ラズパイ
nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

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-buster
COPY a.py 1.py
CMD python 1.py

ビルドして実行。

 $ docker build -t py-hello .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM python:3.9-slim-buster
 ---> bb1bad240fdf
Step 2/3 : COPY a.py 1.py
 ---> Using cache
 ---> 15813e110ccb
Step 3/3 : CMD python 1.py
 ---> Using cache
 ---> b3e25f80d097
Successfully built b3e25f80d097
Successfully tagged py-hello:latest
$ docker images
REPOSITORY    TAG               IMAGE ID       CREATED          SIZE
py-hello      latest            b3e25f80d097   34 seconds ago   110MB
$ docker run py-hello
Hello, world


ラズパイ上で開発するは、時間がかかりそうなので、次回はwindowsでラズパイのdockerコンテナをビルドすることに挑戦する。


nice!(0)  コメント(0) 

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-pBAA
192.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 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 406268  18964 282736    0    0     8     1  902   91  1  0 99  0  0
 1  0      0 405316  18964 282736    0    0     0     0 12203 4666 18  4 78  0  0
 1  0      0 405092  18964 282736    0    0     0     0 11973 4453 20  4 77  0  0
 1  0      0 405092  18964 282736    0    0     0     0 12283 4724 17  4 79  0  0
 1  0      0 405092  18964 282736    0    0     0     0 12056 4412 16  5 79  0  0

次回から、dockerで動作させることに挑戦する。

nice!(0)  コメント(0) 

Raspberry Pi 3 Model B + Camera V2.1 picamera2 web.py 失敗 [プログラミング]

前回は、libcamera-stillで静止画が撮れるところまでを記録した。 次に、カメラで撮影した画像を、外から見られるようにしたくなった。動画として見られるとよいのだが、まずは静止画がみられることを目標にした。 まずは、pythonのpicamera2とwebpyで、あるurlにアクセスしたら静止画を撮ってそれを返すプログラムを作ることにした。 1. picamera2 このページを参考に環境を構築した。 https://github.com/raspberrypi/picamera2

  1. sudo apt install -y python3-pyqt5 python3-opengl
  2. sudo apt install -y python3-picamera2 --no-install-recommends

2. web.py

    1. pip install web.py==0.61
      • "==0.61"の意味はわかってない。
    2. app.py
      • 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()




        ファイルに保存してからそれを返すのではなく、メモリ中にjpgイメージを作ってそれをかえすことで、ディスクの寿命を延ばす作戦。
    1. 実行
    2. 最初のアクセスには、正しく静止画を返してくれたが、2回目のアクセスで落ちる。
        $ 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

次回は、これの修正を試みる。

nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

Raspberry Pi 3 Model B + Camera V2.1 静止画撮影ができるまで [プログラミング]

昔買ったラズパイとカメラを引っ張り出してきて何かプログラミングを始めようと思い立った。 1. Raspberry Pi OS すでにアカウント名やパスワードを忘れてしまったので、ブートディスクを作り直した。

    1. ここからWindows用のRaspberry Pi Imagerをダウンロードしてインストールした。


    1. Raspberry Pi Imagerを起動して、SDカードに焼いた

rpi_imager.png

        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 ***

いろいろググってこれらを実施して写真が撮れるようになった。

    1. raspi-confg
      • "3 Interface Options"を選択する


        "I1 Legacy Camera Enable/disable legacy camera support"を選択する。"Would you like to enable legacy camera support?"へ"はい"と答える。"Legacy camera support is enabled."と表示される。
    1. /boot/config.txt
      • Camera V2.1を使うために、ファイルの最後にこれを追記して、再度リブート。


        dtoverlay=imx219


    1. 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 .


次回は、静止画をweb配信することに挑戦する。


Raspberry Pi 3【Model B+】スターターセット/アドバンス RASPi3P-ADV

Raspberry Pi 3【Model B+】スターターセット/アドバンス RASPi3P-ADV

  • 出版社/メーカー: 共立電子産業
  • メディア:




nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット
プログラミング ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。