Armadilloフォーラム

USBカメラを利用した複数コンテナ起動時にプログラム実行前にカメラを読み込む前にプログラムが実行される

yuki.shigefuji

2025年9月3日 8時52分

お世話になっております。

標題の件につきまして、USBカメラ読みこみ用のコンテナA、カメラを用いて得た画像に推論をかけるプログラムを起動するコンテナBがあるのですがコンテナAがカメラを読み込む前にコンテナBの処理が始まりカメラの読み取りに失敗するケースが起こっております。

現在コンテナBのconfファイルにはsleep 15 をかけているのですがそれでもカメラの読み取りに失敗するケースが見られます。
15秒という秒数が適切ではないのか、又は他要因があるのか見解を頂きたく存じます。

以上、ご確認よろしくお願い致します。

コメント

at_shota.shimoyama

2025年9月3日 10時23分

アットマークテクノの下山です。

「USBカメラ読みこみ用のコンテナA」から「カメラを用いて得た画像に推論をかけるプログラムを起動するコンテナB」に対してカメラの画像を送っているという認識で合っているでしょうか?
その場合、全体的な処理の流れやコンテナBが行う処理の具体は分かりませんが、固定値でsleepするよりも、コンテナAの準備が完了したことをファイルの存在等でコンテナBに対して通知してコンテナBがその通知を待つ方が良いと思います
そして、sleep 15でも読み取りに失敗するということであればコンテナA側で問題が起きているように思えますので、podman logsなどでエラーやUSBカメラが読み込める状態になるまでの時間などを確認してみてはいかがでしょうか?

もし上記の認識が誤っているようであれば、詳細な情報をお伝えいただけますと幸いです。

よろしくお願いします

yuki.shigefuji

2025年9月4日 9時27分

お世話になっております。
失礼いたしました。confが2つありコンテナ自体は1つであり頂いた回答とは別の課題だと認識しております。
流れとしましては
conf1:USBカメラ、ディスプレイ、パトライト、SDカード等接続機器の認識
conf2:15秒待機⇒pythonにて推論、判定など動作関連のプログラムの起動
を行っている状態です。その中でconf2が起動した際にカメラが発見できないエラーが出るケースがあり、conf1が起動する前にconf2の処理が始まってしまっているのが原因と思っております。

以上、お手数をおかけしますが再確認頂けますと幸いです。よろしくお願いいたします。

> アットマークテクノの下山です。
>
> 「USBカメラ読みこみ用のコンテナA」から「カメラを用いて得た画像に推論をかけるプログラムを起動するコンテナB」に対してカメラの画像を送っているという認識で合っているでしょうか?
> その場合、全体的な処理の流れやコンテナBが行う処理の具体は分かりませんが、固定値でsleepするよりも、コンテナAの準備が完了したことをファイルの存在等でコンテナBに対して通知してコンテナBがその通知を待つ方が良いと思います
> そして、sleep 15でも読み取りに失敗するということであればコンテナA側で問題が起きているように思えますので、podman logsなどでエラーやUSBカメラが読み込める状態になるまでの時間などを確認してみてはいかがでしょうか?
>
> もし上記の認識が誤っているようであれば、詳細な情報をお伝えいただけますと幸いです。
>
> よろしくお願いします

at_shota.shimoyama

2025年9月4日 11時21分

カメラが発見できないエラーとは、カメラのデバイスファイルが見つからないというような内容でしょうか?

そうであれば、conf2の方に

add_hotplugs video4linux

を加えることで、コンテナ起動後にカメラを認識した場合でも、カメラへのアクセスができるようになります

https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…

よろしくお願いします

yuki.shigefuji

2025年9月5日 9時03分

カメラが発見できない流れは以下と認識しております。
・pythonプログラム稼働開始時にUSBカメラを読み取る必要がある。
・したがってpythonプログラムが開始するまでにarmadilloにUSB接続しているカメラをコンテナに通す必要がある
・しかしpythonプログラム開始用のconfファイルがarmadilloの認識用のconfファイルより先に稼働する事がある
・上記は sleep 15 にて時間差で稼働させるようにはしているが失敗するケースがある

ですのでコンテナ起動後にカメラを認識できるようにしても根本解決には繋がらないと考えております。
再度ご確認いただければ幸いです。よろしくお願いいたします。

at_shota.shimoyama

2025年9月5日 11時10分

それぞれのコンテナがどういう目的でどのような処理を具体的に行っていて、何の目的で2つに分けているのかといった情報が無いと最適な方法を提案することは難しいのですが、
「pythonプログラム開始用のコンテナ」が「認識用のコンテナ」より先に稼働することがあって、
ひとまずpythonプログラム開始時に認識用のコンテナがある程度まで動作していることを保証すればよいのであれば、
やはり最初に書いた「コンテナAの準備が完了したことをファイルの存在等でコンテナBに対して通知してコンテナBがその通知を待つ」のが確実で手っ取り早い方法だと思います。

具体的には、
両方のコンテナのコンフィグファイルに

add_volumes /run/app:/run/app:shared

を追加して/run/app/を両方のコンテナからアクセスするようにしておきます

そして、コンテナAがUSBカメラ読みこみが完了したら/run/app/camera_ok.txtのような空のファイルをコンテナAが作り、
コンテナBは/run/app/camera_ok.txtが現れるまでPythonの起動を待つか、Python内で待つ、というような感じです

アットマークテクノの古賀(休日モード)です。

弊社 下山:
>「pythonプログラム開始用のコンテナ」が「認識用のコンテナ」より先に稼働することがあって、
>ひとまずpythonプログラム開始時に認識用のコンテナがある程度まで動作していることを保証すればよいのであれば、
>やはり最初に書いた「コンテナAの準備が完了したことをファイルの存在等でコンテナBに対して通知してコンテナBがその通知を待つ」のが確実で手っ取り早い方法だと思います。
>
>具体的には、
>両方のコンテナのコンフィグファイルに
>

>add_volumes /run/app:/run/app:shared
>

>を追加して/run/app/を両方のコンテナからアクセスするようにしておきます
>
>そして、コンテナAがUSBカメラ読みこみが完了したら/run/app/camera_ok.txtのような空のファイルをコンテナAが作り、
>コンテナBは/run/app/camera_ok.txtが現れるまでPythonの起動を待つか、Python内で待つ、というような感じです

yuki.shigefujiさん(2025年9月5日 9時03分):
>カメラが発見できない流れは以下と認識しております。
>・pythonプログラム稼働開始時にUSBカメラを読み取る必要がある。
>・したがってpythonプログラムが開始するまでにarmadilloにUSB接続しているカメラをコンテナに通す必要がある
>・しかしpythonプログラム開始用のconfファイルがarmadilloの認識用のconfファイルより先に稼働する事がある
>・上記は sleep 15 にて時間差で稼働させるようにはしているが失敗するケースがある

yuki.shigefujiさん(2025年9月4日 9時27分):
>失礼いたしました。confが2つありコンテナ自体は1つであり頂いた回答とは別の課題だと認識しております。
>流れとしましては
>conf1:USBカメラ、ディスプレイ、パトライト、SDカード等接続機器の認識
>conf2:15秒待機⇒pythonにて推論、判定など動作関連のプログラムの起動
>を行っている状態です。その中でconf2が起動した際にカメラが発見できないエラーが出るケースがあり、conf1が起動する前にconf2の処理が始まってしまっているのが原因と思っております。

同一のコンテナイメージから二つのコンテナを作って連携させる構造なのですね。
ということは、コンテナを一つにして、現状 conf1 で起動するコンテナの実行プログラムが、USB カメラを認識した時点で「推論、判定など動作関連のプログラム」を起動する、という構造に変えるというアプローチもありかと思います。

それぞれ別のコンテナに分けることが必須、という場合は、下山から提案のありました、通知用の一時ファイルを使って起動タイミングの同期をとるアプローチが手っ取り早いでしょう。
あるいは、conf1 のコンテナが、REST API を使って conf2 のコンテナを起動する、というアプローチも可能かと思います:
 https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…

マニュアルの「アプリケーション向けのインターフェース (Rest API)」にある「Rest API : コンテナ操作」で説明されている「コンテナ起動」の API を使えば、停止状態のコンテナを起動できます。
この方策を使う場合、conf2 では、

set_autostart create

に設定してください。
 https://manual.atmark-techno.com/armadillo-iot-g4/armadillo-iotg-g4_pro…
こうすれば、ABOS 起動時にはコンテナが生成されるだけで起動しません。

以上、参考になりましたら幸いです。