網絡攝像頭服務 Web Cam Service
前言大綱
此示例實現了標準的波士頓動力 API 圖像服務,並使用 OpenCV 與常見的網絡攝像頭進行通信。 該示例將在本地運行網絡攝像頭圖像服務,並使用外掛載荷服務註冊程序將其註冊到機器人的目錄服務中。 網絡攝像頭圖像服務是 GRPC 圖像服務的一個實現,它有 ListImageSources RPC 和 GetImage RPC。 該服務可以將來自 OpenCV 相機連接的信息編碼為 protobuf 消息。
此示例將從外掛負載註冊服務,負載可以是 Spot CORE 或不同的外部計算機; 因此,它需要知道服務將運行的計算機的 guid、秘密和 IP 地址。 有關如何設置和註冊負載以及如何註冊簡單公告服務的高級概述,請參閱 自註冊負載示例 self registration payloads example 。
先決條件
除了 pip 可安裝要求之外,網絡攝像頭示例還需要 OpenCV,必須按照 OpenCV 的說明單獨安裝。 或者,該示例提供了一個 Dockerfile,可用於運行該示例,並且具有已安裝 OpenCV 的基本 docker 映像。
範例執行
注意:該示例可能需要使用 sudo 運行才能訪問網絡攝像頭。
要從此目錄運行網絡攝像頭圖像服務,請發出以下命令:
python3 web_cam_image_service.py --guid {PAYLOAD_GUID} --secret {SECRET} --host-ip {PAYLOAD_IP} --port {PORT} {ROBOT_IP} --device-name {CAMERA}
此示例將兩個不同的 IP 地址作為參數。 --host-ip 參數描述將運行網絡攝像頭圖像服務的計算機的 IP 地址。 存在幫助程序來嘗試確定正確的 IP 地址。 此命令必須在將運行網絡攝像頭圖像服務的同一台計算機上運行:
python3 -m bosdyn.client --username {USER} --password {PASSWORD} {ROBOT_IP} self-ip
啟動網絡攝像頭圖像服務時,應提供不同的設備名稱。所有這些來源都應該可以使用 OpenCV 從網絡攝像頭圖像服務中查詢。它們可以通過使用參數 --device-name 單獨指定,並附加多個參數以指定每個相機源。例如,--device-name CAMERA1 --device-name CAMERA2。默認情況下,將使用設備“0”,它代表索引 0 處的設備,並將連接到為每個操作系統找到的第一個連接的視頻設備。用戶可以提供特定相機設備的索引,或描述相機 USB 位置的文件路徑。服務將使用文件路徑中最後一個 “/” 之後的設備名稱的最後部分將每個設備列為圖像源(例如 “/dev/video0”將導致圖像源名稱“video0”,設備索引“0”還將具有圖像源名稱“video0”)。請注意,對於 linux,默認情況下,連接的攝像頭設備的文件路徑格式為 /dev/videoXXX,其中“XXX”是攝像頭的索引。但是,在 Windows 上,默認位置更難確定,因此首選提供索引號作為設備名稱。
由於示例運行在負載計算機上,因此在啟動示例時,它需要註冊和授權負載計算機的 GUID(唯一生成的負載說明符)和機密(與負載關聯的私有字符串)作為參數。此“外掛負載”可以代表能夠託管網絡攝像頭圖像服務的任何類型的計算機。有關詳細信息,請參閱有關 負載軟件配置 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.
最後,命令行參數 --show-debug-info 將允許用戶在其本地計算機上實時查看網絡攝像頭視頻捕獲的 OpenCV 輸出。 僅將此標誌用於除錯目的,因為它可能會減慢主要示例操作的速度並降低影像服務的性能。
除錯技巧
- 確保相機已開機並已插入電源。
- 檢查您的網絡攝像頭是否與 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 都將正確完成。
- 當圖像服務測試程序的所有測試都通過後,通過查看相機來源下拉菜單(狀態欄的左上角)檢查平板電腦是否正在檢測網絡攝像頭圖像服務,然後通過選擇檢查圖像是否出現“網絡攝像頭”攝像頭來源。
使用 Docker 運行網絡攝像頭圖像服務
按照 本節 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 選項卡中,單擊添加設備並在部署容器之前在主機字段和容器字段中指定攝像機的通信端口(例如 /dev/video0)。
- 如果在本地運行 docker 容器,則需要將設備從容器映射到本地計算機,其方式與在 portainer 上的配置方式類似。 docker run 命令需要附加參數 --device=/dev/video0:/dev/video0,它以 /dev/video0 為例,將主機位置映射到容器位置。
留言
張貼留言
Aron阿龍,謝謝您的留言互動!