ZED 景深攝影機範例#7/8 – Using sensors

本文為 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: 追蹤人體骨架

範例07 – 取得感測器資料

本範例將說明如何取得 ZED 3D cameras (ZED 2, ZED Mini) 上的 IMU、氣壓與磁力感測器資料。本範例會持續執行5秒鐘來取得感測器資料,並將相關數值顯示於終端機。以下圖片來自 ZED 原廠文件

前置作業

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

程式總覽

開啟攝影機

如先前範例,首先要建立、設定並開啟 ZED 3D攝影機。由於本範例不會用到深度資訊,請用 DEPTH_MODE::NONE 來停用深度擷取功能。

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

# Set configuration parameters
init_params = sl.InitParameters()
# No depth computation required here
init_params.depth_mode = sl.DEPTH_MODE.NONE

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

取得感測器資料

您可由 SensorsData 類別來取得攝影機上各感測器的資料。請用 getSensorsData() 語法取得感測器資料,如下:

sensors_data = sl.SensorsData()
while zed.grab() == sl.ERROR_CODE_SUCCESS:
    zed.get_sensors_data(sensors_data, sl.TIME_REFERENCE.CURRENT)
capture sensor data

在此使用 sl.TIME_REFERENCE.CURRENT 來取得各感測器的最新可用資料。也可用其他語法取得同時接近攝影機最新影像時間點的感測器資料。

更多關於參考時間請參考 Time Synchronization 文件。

更新感測器資料

由於攝影機上的各感測器的採樣速度各有不同,因此資料更新頻率當然也不同。為了得知指定感測器是否已更新,就會比較其時間戳記(作為唯一辨識子)。如果相同代表感測器資料未更新。

本範例將使用 TimestampHandler 基礎類別來儲存時間戳記並檢查資料更新狀態。

ts_handler = TimestampHandler()
if ts_handler.is_new(sensors_data.get_imu_data()):
    # sensors_data.get_imu_data() contains new data
store timestamps and check for data update

如果有新的資料,就顯示於終端機:

# Check if IMU data has been updated
if ts_handler.is_new(sensors_data.get_imu_data()):
    quaternion = sensors_data.get_imu_data().get_pose().get_orientation().get()
    print("IMU Orientation: {}".format(quaternion))
    linear_acceleration = sensors_data.get_imu_data().get_linear_acceleration()
    print("IMU Acceleration: {} [m/sec^2]".format(linear_acceleration))
    angular_velocity = sensors_data.get_imu_data().get_angular_velocity()
    print("IMU Angular Velocity: {} [deg/sec]".format(angular_velocity))

# Check if Magnetometer data has been updated
if ts_handler.is_new(sensors_data.get_magnetometer_data()):
    magnetic_field_calibrated = sensors_data.get_magnetometer_data().get_magnetic_field_calibrated()
    print("Magnetometer Magnetic Field: {} [uT]".format(magnetic_field_calibrated))

# Check if Barometer data has been updated 
if ts_handler.is_new(sensors_data.get_barometer_data()):
    magnetic_field_calibrated = sensors_data.get_barometer_data().pressure
    print("Barometer Atmospheric pressure: {} [hPa]".format(sensors_data.get_barometer_data().pressure))
display new data in console

一般來說,您應該不需要檢查感測器是否可用。如果感測器不可用的話,其資料會包含 NAN 且時間戳記為 0

關閉攝影機

順利取得感測器資料之後,別忘了在結束程式之前關閉攝影機。

# Close the camera
zed.close()
close the camera

下一步

您現在已經知道如何由 ZED 2 / ZED Mini 立體攝影機取得感測器資料了,更多資訊請參考以下文件:

 

發佈留言

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