本文為 ZED 景深攝影機原廠範例,共有八個範例,請根據 ZED 的範例程式頁面,取得 C++ / Python / C# 等範例原始碼。說明如下:
- Hello ZED: 入門範例,說明如何連接 ZED 攝影機,並於終端機中顯示裝置序列編號。
- Image Capture: 開啟 ZED 攝影機,取得影像,並於終端機中顯示時間戳記、影像尺寸。
- Depth Perception: 取得畫面的深度資料與點雲,並於終端機中顯示指定點的距離。
- Camera Tracking: 啟用位置追蹤,可即時更新攝影機的位置與指向。
- Spatial Mapping: 啟用地圖繪製,可擷取環境的網格或融合點雲。
- 3D Object Detection: 偵測畫面中的物體,並進行 3D 定位 (只適用於 ZED 2 機型)。
- Using Sensors: 取得攝影機的 IMU、氣壓計與磁力感測器資料。
- 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 立體攝影機取得感測器資料了,更多資訊請參考以下文件: