collect_sensor_data()
📖 方法说明
采集传感器的视触觉数据,包括图像、深度图、Marker 点位移、滑动状态等多维度信息。这是获取传感器数据的核心方法。
📝 语法
data = sensor.collect_sensor_data(*data_types, frame=None)
🔧 参数
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
*data_types | int | - | 一个或多个 VTSDataType 枚举值,指定需要采集的数据类型 |
frame | np.ndarray | None | None | 离线数据处理时输入的传感器原始图像(raw image) shape 为 (H, W, 3)在线模式时设为 None |
📤 返回类型
dict - 包含请求的数据类型及其对应数据的字典
可用的数据 类型(VTSDataType)
| 枚举值 | 数据类型 | Shape | 说明 |
|---|---|---|---|
TIME_STAMP | int | - | 毫秒级时间戳 |
CALIBRATE_IMG | np.ndarray, uint8 | (H, W, 3) | 校准图像 |
RAW_IMG | np.ndarray, uint8 | (H, W, 3) | 原始采集图像 |
WARPED_IMG | np.ndarray, uint8 | (H, W, 3) | 畸变校正后的图像 |
DIFF_IMG | np.ndarray, uint8 | (H, W, 3) | 差分图(当前图像与校准图像的差异) |
MARKER_IMG | np.ndarray, uint8 | (H, W, 3) | Marker 可视化图像 |
DEPTH_MAP | np.ndarray, float64 | (H, W) | 深度图 |
MARKER_ORIGIN_VECTOR | np.ndarray, float64 | (N, M, 2) | 初始 Marker 坐标 |
MARKER_CURRENT_VECTOR | np.ndarray, float64 | (N, M, 2) | 当前 Marker 坐标 |
MARKER_OFFSET_VECTOR | np.ndarray, float64 | (N, M, 2) | Marker 位移向量 |
XYZ_VECTOR | np.ndarray, float64 | (N, M, 3) | 三维坐标数据 |
FORCE6D_VECTOR | np.ndarray, float64 | (6,) | 六维力信息: Fx,Fy,Fz,Mx,My,Mz |
SLIP_STATE | IntEnum | - | 滑动状态 |
滑动状态(SLIP_STATE)
| 枚举值 | 说明 |
|---|---|
NO_OBJ | 无物体接触 |
CONTACT | 初次接触 |
STEADY_HOLD | 稳定保持 |
INCIPIENT_SLIP | 初始滑移 |
PARTIAL_SLIP | 部分滑移 |
COMPLETE_SLIP | 完全滑移 |
💡 示例代码
采集单个数据类型
from pyvitaisdk import VTSensor, VTSDeviceFinder, VTSDataType, VTSError
try:
# 初始化传感器
finder = VTSDeviceFinder()
devices = finder.get_devices()
sensor = VTSensor(devices[0])
sensor.calibrate()
# 采集校正后的图像
data = sensor.collect_sensor_data(VTSDataType.WARPED_IMG)
warped_img = data[VTSDataType.WARPED_IMG]
print(f"图像尺寸: {warped_img.shape}")
# 释放资源
sensor.release()
except VTSError as e:
print(f"Error initializing VTSensor: {e}, suggestion: {e.suggestion}")
采集多种数据类型
from pyvitaisdk import VTSensor, VTSDeviceFinder, VTSDataType
import cv2
finder = VTSDeviceFinder()
devices = finder.get_devices()
sensor = VTSensor(devices[0])
sensor.calibrate()
datatypes = [
VTSDataType.WARPED_IMG,
VTSDataType.DEPTH_MAP,
VTSDataType.SLIP_STATE,
VTSDataType.MARKER_OFFSET_VECTOR
]
# 同时采集多种数据
data = sensor.collect_sensor_data(*datatypes)
# 访问不同的数据
warped_img = data[VTSDataType.WARPED_IMG]
depth_map = data[VTSDataType.DEPTH_MAP]
slip_state = data[VTSDataType.SLIP_STATE]
marker_offset = data[VTSDataType.MARKER_OFFSET_VECTOR]
print(f"校正图像尺寸: {warped_img.shape}")
print(f"深度图尺寸: {depth_map.shape}")
print(f"滑动状态: {slip_state.name}")
print(f"Marker偏移向量: {marker_offset.shape}")
# 可视化
cv2.imshow("warped_img", warped_img)
cv2.waitKey(1)
sensor.release()
离线数据处理
import cv2
from pyvitaisdk import VTSensor, VTSDataType, VTSensorType
# 离线模式初始化
sensor = VTSensor(config=None, sensor_type=VTSensorType.GF225)
# 校准图像也必须是传感器原始图像(raw image)
raw_calib_image = cv2.imread("raw_calib.jpg")
sensor.calibrate(calib_image=raw_calib_image)
# 加载要处理的传感器原始图像(raw image)
raw_image = cv2.imread("test_frame.jpg")
# 离线处理
data = sensor.collect_sensor_data(
VTSDataType.DEPTH_MAP,
VTSDataType.MARKER_OFFSET_VECTOR,
frame=raw_image
)
depth_map = data[VTSDataType.DEPTH_MAP]
print(f"深度图已生成: {depth_map.shape}")
sensor.release()
⚠️ 注意事项
前置要求
- 必须先调用
calibrate()完成校准 - 确保传感器已正确初始化
性能优化
- 只请求需要的数据类型,避免不必要的计算
- 对于高帧率应用,考虑减少同时请求的数据类型数量
数据说明
- 深度图:值越大表示形变越大(接 触压力越大)
- Marker 偏移:单位为像素,表示 Marker 点的位移量
- 滑动状态:实时检测物体的接触和滑动状态
离线模式注意
calibrate(calib_image=...)和collect_sensor_data(frame=...)都必须传入传感器原始图像(raw image)- 离线处理时必须通过
frame参数传入传感器原始图像(raw image) - 不要预先对图像执行 warp;SDK 会根据
sensor_type在内部完成处理 - 确保输入图像与校准图像来自相同的采集条件
六维力数据
请求 VTSDataType.FORCE6D_VECTOR 前,创建 VTSensor 时必须显式提供有效的 force_model_path。