網絡攝像頭服務 Web Cam Service
前言大綱
此示例實現了標準的波士頓動力 API 圖像服務,並使用 OpenCV 與常見的網絡攝像頭進行通信。 該示例將在本地運行網絡攝像頭圖像服務,並使用外掛負載服務註冊程序將其註冊到機器人的目錄服務中。 網絡攝像頭圖像服務是 GRPC 圖像服務的一個實現,它有 ListImageSources RPC 和 GetImage RPC。 該服務可以將來自 OpenCV 相機連接的信息編碼為 protobuf 消息。
此示例將從外掛負載註冊服務,外掛負載可以是 Spot CORE 或不同的外部計算機; 因此,它需要知道服務將運行的計算機的 guid、秘密secret 和 IP 地址。 有關如何設置和註冊外掛負載以及如何註冊簡單公告服務的高級概述,請參閱 自註冊有效負載self registration payloads example 示例。
先決條件
範例執行
該示例可以通過向調用者發出 SIGINT (Ctrl + C) 來安全退出。
此示例將兩個不同的 IP 地址作為參數。 --host-ip 參數描述將運行網絡攝像頭圖像服務的計算機的 IP 地址。 存在幫助程序來嘗試確定正確的 IP 地址。 此命令必須在將運行網絡攝像頭圖像服務的同一台計算機上運行:
python3 -m bosdyn.client --username {USER} --password {PASSWORD} {ROBOT_IP} self-ip
另一個 IP 地址是傳統的機器人主機名(“ROBOT_IP”)參數,它描述了託管目錄服務的機器人的 IP 地址。
啟動網絡攝像頭圖像服務時,應提供不同的設備名稱。所有這些來源都應該可以使用 OpenCV 從網絡攝像頭圖像服務中查詢。它們可以通過使用參數 --device-name 單獨指定,並附加多個參數以指定每個相機源。例如,--device-name CAMERA1 --device-name CAMERA2。默認情況下,將使用設備 “0” ,它代表索引 0 處的設備,並將連接到為每個操作系統找到的第一個連接的視頻設備。用戶可以提供特定相機設備的索引,或描述相機 USB 位置的文件路徑。服務將使用文件路徑中最後一個 “/” 之後的設備名稱的最後部分將每個設備列為圖像源(例如“/dev/video0”將導致圖像源名稱“video0”,設備索引“0”還將具有圖像源名稱“video0”)。請注意,對於 linux,默認情況下,連接的攝像頭設備的文件路徑格式為 /dev/videoXXX,其中“XXX”是攝像頭的索引。但是,在 Windows 上,默認位置更難確定,因此首選提供索引號作為設備名稱。
由於示例運行在負載計算機上,因此在啟動示例時,它需要註冊和授權負載計算機的 GUID(唯一生成的負載說明符)和機密secret(與負載關聯的私有字符串)作為參數。此“外掛負載”可以代表能夠託管網絡攝像頭圖像服務的任何類型的計算機。有關詳細信息,請參閱有關 外掛負載軟件配置configuration of payload software 的文檔。
可以使用 --port 參數指定影像服務的端口號。可以繞過端口參數並允許選擇隨機端口號,但不鼓勵這樣做,因為重新啟動可能會導致服務偵聽端口發生意外更改。此端口號將與主機 IP(“PAYLOAD_IP”)一起使用,以完全指定影像服務的運行位置。此端口號必須是開放的,不能被本地防火牆阻止,否則機器人和目錄註冊服務將無法訪問網絡攝像頭圖像服務。
有一個可選的字符串參數 --codec 來指定描述相機壓縮/解壓縮軟件的四字符視頻編解碼器。視頻編解碼器代碼取決於操作系統。例如,在 Windows 計算機上,視頻編解碼器通常是“DIVX”,而在 linux 計算機上,視頻編解碼器通常是“MJPG”。請注意,視頻編解碼器不一定需要指定,因為 OpenCV 的默認選擇通常適用於大多數網絡攝像頭,但是如果您在圖像服務嘗試捕獲圖像時看到 OpenCV 錯誤,請嘗試為您的相機指定視頻編解碼器.這種類型的錯誤示例是:
[ WARN:0] global /io/opencv/modules/videoio/src/cap_v4l.cpp (998) tryIoctl VIDEOIO(V4L2:/dev/video1): select() timeout.
除錯技巧
- 確保相機已開機並已插入電源。
- 檢查您的網絡攝像頭是否與 api 連接分開工作。對於 linux,程序 Cheese 允許您從相機進行串流式傳輸。運行 cheese /dev/video0(或您的相機 USB 位置的名稱)以驗證圖像是否出現。
- 使用命令行參數 --show-debug-info 將顯示 openCV 捕獲輸出,然後將其編碼到圖像服務 protobuf 消息中。如果圖像無法在此處顯示,則設備名稱可能不正確或無法訪問。
- 使用命令行工具檢查圖像服務是否出現在目錄中:
- python3 -m bosdyn.client --username {USER} --password {PWD} {ROBOT_IP} dir list
- 使用 影像服務測試器程序 image service tester program 確保服務可以成功通信並且每個 RPC 都將正確完成。
- 當圖像服務測試程序的所有測試都通過後,通過查看相機源下拉菜單(狀態欄的左上角)檢查平板電腦是否正在檢測網絡攝像頭圖像服務,然後通過選擇檢查圖像是否出現 “網絡攝像頭Web Cam” 攝像頭來源。
使用 Docker 運行網絡攝像頭圖像服務
有關如何在計算負載上作為 docker 容器運行軟件應用程序的一般說明,請參閱 本文檔 document 。
按照 本節this section 開始的有關如何構建和使用 docker 鏡像的說明進行操作。本例中帶有應用程序的 docker 容器需要根據一般說明進行以下修改:
- 在此示例中運行網絡攝像頭應用程序所需的應用程序參數是 --host-ip HOST_COMPUTER_IP --guid GUID --secret SECRET --port PORT_NUMBER ROBOT_IP --device-name DEVICE_NAME
- 在 Portainer 容器配置頁面的 Runtime & Resources 選項卡中,單擊 添加設備add device並在部署容器之前在 主機host 字段和 容器container 字段中指定攝像機的通信端口(例如 /dev/video0)。
- 如果在本地運行 docker 容器,則需要將設備從容器映射到本地計算機,其方式與在 portainer 上的配置方式類似。 docker run 命令需要附加參數 --device=/dev/video0:/dev/video0,它以 /dev/video0 為例,將主機位置映射到容器位置。
留言
張貼留言
Aron阿龍,謝謝您的留言互動!