ZED 景深攝影機範例#4/8 – Depth Perception

本文為 ZED 景深攝影機原廠範例,共有八個範例,請根據 ZED 的範例程式頁面,取得 C++ / Python / C# 等範例原始碼。說明如下:

  1. Hello ZED: 入門範例,說明如何連接 ZED 攝影機,並於終端機中顯示裝置序列編號。
  2. Image Capture: 開啟 ZED 攝影機,取得影像,並於終端機中顯示時間戳記、影像尺寸。
  3. Depth Perception: 取得畫面的深度資料與點雲,並於終端機中顯示指定點的距離。
  4. Camera Tracking: 啟用位置追蹤,可即時更新攝影機的位置與指向。
  5. Spatial Mapping: 啟用地圖繪製,可擷取環境的網格或融合點雲。
  6. 3D Object Detection: 偵測畫面中的物體,並進行 3D 定位 (只適用於 ZED 2 機型)。
  7. Using Sensors: 取得攝影機的 IMU、氣壓計與磁力感測器資料。
  8. Body Tracking: 追蹤人體骨架

範例04 – Camera Tracking

本範例說明如何取得即時的相機的位置與方位,程式會在成功擷取 1000 筆位置資訊後結束。在此假設您已完成先前的範例。

註:原廠頁面每段都提供了 C++ / Python / C# 的範例程式,在此只列出 Python 範例

前置作業

  • 下載最新版的 ZED SDK (請點我)
  • 下載 Image Capture 範例程式,提供 C++, Python 與 C# 等版本
  • 在 Windows 或 Linux OS上,建置 C++ 環境(請點我) 或執行 Python 範例,本系列文章將使用 Python (教學請點我)

程式總覽

開啟攝影機

如先前所有範例,在此會建立、設定並開啟ZED攝影機。

# Create a ZED camera object
zed = sl.Camera()

# Set configuration parameters
init_params = sl.InitParameters()
init_params.camera_resolution = sl.RESOLUTION.HD720  # Use HD720 video mode (default fps: 60)
# Use a right-handed Y-up coordinate system
init_params.coordinate_system = sl.COORDINATE_SYSTEM.RIGHT_HANDED_Y_UP
init_params.coordinate_units = sl.UNIT.METER  # Set units in meters

# Open the camera
err = zed.open(init_params)
if err != sl.ERROR_CODE.SUCCESS:
    exit(1)
open the camera

啟用位置追蹤

攝影機開啟之後,還需要透過 enablePositionalTracking() 來啟用位置追蹤模組,這樣才能取得 ZED 攝影機的位置與方位。

# Enable positional tracking with default parameters
tracking_parameters = sl.PositionalTrackingParameters()
err = zed.enable_positional_tracking(tracking_parameters)
if err != sl.ERROR_CODE.SUCCESS:
    exit(1)
enable positional tracking

先前的範例只使用了ZED SDK預設的追蹤參數。完整參數清單請參考 Tracking API

擷取姿勢資料

現在動作追蹤已經啟用了,在此透過一個迴圈來擷取攝影機位置。攝影機的位置是由 Pose 類別所給定,該類別已包含了攝影機的位移與方位狀態,以及影像的時間戳記與追蹤信心指數。

每個位置都會聯於某個參考坐標系,ZED SDK 提供了兩種參考坐標系:REFERENCE_FRAME::WORLDREFERENCE_FRAME::CAMERA。更多資訊請參考Coordinate Frames 文件。ZED 的三軸方位示意如下:

本範例會在 World Frame 中取得攝影機位置。

# Track the camera position during 1000 frames
i = 0
zed_pose = sl.Pose()
runtime_parameters = sl.RuntimeParameters()
while i < 1000:
    if zed.grab(runtime_parameters) == sl.ERROR_CODE.SUCCESS:
        # Get the pose of the left eye of the camera with reference to the world frame
        zed.get_position(zed_pose, sl.REFERENCE_FRAME.WORLD)

        # Display the translation and timestamp
        py_translation = sl.Translation()
        tx = round(zed_pose.get_translation(py_translation).get()[0], 3)
        ty = round(zed_pose.get_translation(py_translation).get()[1], 3)
        tz = round(zed_pose.get_translation(py_translation).get()[2], 3)
        print("Translation: Tx: {0}, Ty: {1}, Tz {2}, Timestamp: {3}\n".format(tx, ty, tz, zed_pose.timestamp.get_milliseconds()))

        # Display the orientation quaternion
        py_orientation = sl.Orientation()
        ox = round(zed_pose.get_orientation(py_orientation).get()[0], 3)
        oy = round(zed_pose.get_orientation(py_orientation).get()[1], 3)
        oz = round(zed_pose.get_orientation(py_orientation).get()[2], 3)
        ow = round(zed_pose.get_orientation(py_orientation).get()[3], 3)
        print("Orientation: Ox: {0}, Oy: {1}, Oz {2}, Ow: {3}\n".format(ox, oy, oz, ow))
retrieve camera position

慣性資料

如果您使用的型號包含了IMU (例如 ZED 2 與 ZED Mini),位置追蹤模組會融合視覺與慣性資料來提供改良後的位置追蹤。

存取 IMU 感測器資料的程式碼如下:

sensors_data = sl.SensorsData()
zed.get_sensors_data(sensors_data, sl.TIME_REFERENCE.IMAGE)
zed_imu = zed_sensors.get_imu_data()
# Get IMU orientation
zed_imu_pose = sl.Transform()
ox = round(zed_imu.get_pose(zed_imu_pose).get_orientation().get()[0], 3)
oy = round(zed_imu.get_pose(zed_imu_pose).get_orientation().get()[1], 3)
oz = round(zed_imu.get_pose(zed_imu_pose).get_orientation().get()[2], 3)
ow = round(zed_imu.get_pose(zed_imu_pose).get_orientation().get()[3], 3)
print("IMU Orientation: Ox: {0}, Oy: {1}, Oz {2}, Ow: {3}\n".format(ox, oy, oz, ow))
# Get IMU acceleration
acceleration = [0,0,0]
zed_imu.get_linear_acceleration(acceleration)
ax = round(acceleration[0], 3)
ay = round(acceleration[1], 3)
az = round(acceleration[2], 3)
print("IMU Acceleration: Ax: {0}, Ay: {1}, Az {2}\n".format(ax, ay, az))
access IMU sensor data

更多關於 Camera-IMU 與其他板載感測器請參考 Sensors section.

關閉攝影機

追蹤 ZED 攝影機中的姿勢狀態 1000 個畫面(幀)之後,停用追蹤模組並關閉攝影機。

# Disable positional tracking and close the camera
zed.disable_positional_tracking();
zed.close()
close the camera
更多範例

如果您想知道如何在3D視窗中取得與顯示攝影機的即時位置與方位、位置資料轉換以及如何改變坐標系與坐標單位,請參考 Motion Tracking 範例程式。

下一步

請接續閱讀[範例05 Spatial Mapping]與 [範例06 Object Detection] 來深入學習。

註:本文經授權之後翻譯自 https://www.stereolabs.com/docs/tutorials/positional-tracking/

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。