机器人摄像头设置用于远程操作和数据收集
如何设置机器人数据收集的摄像头 <unk>摄像头类型,放置,同步,校准和记录管道.
相机类型的比较
您的选择影响成本,延迟确定性和集成复杂性.
| Type | Example Model | Price | 延迟 | Best For |
|---|---|---|---|---|
| USB (UVC) | Logitech BRIO 4K | ~$200 | 50-200ms variable | Budget setups, low-frequency tasks |
| GigE Vision | Basler ace2 a2A1920 | $400-$1,500 | <1ms deterministic | High-quality datasets, policy training |
| Depth (RGB-D) | Intel RealSense D435 | ~$200 | 30-60ms | Supplemental depth -- not recommended as primary |
USB摄像头 (Logitech BRIO,ELP,Arducam) 是最容易使用的,但由于USB主机控制器的调度而导致的可变延迟.在负载下,框架交付可以震动20-50ms,这使得多摄像头录像脱节并降低了政策训练.对于单摄像头或低摄像头速度设置 (<15fps),USB是可接受的.
GigE视觉摄像头 (Basler ace2,FLIR Blackfly S,Allied Vision Alvium) 在硬件触发时提供以太网为止的框架,具有确定性 <1 ms的延迟.Basler ace2 a2A1920-160ucBAS在650美元的价格提供1920x1200的速度为160fps,足够于30fps机器人录制.GigE摄像头需要具有启用 jumbo框架 (
深度摄像头 (RealSense D435,Azure Kinect) 是用于补充3D场景理解的,但不推
三种摄像机配置
操作任务受益于不同的摄像头安排.以下是RCSV使用的三个验证配置,按复杂性和数据丰富度排序.
配置1:最小 (1 摄像头,预算设置)
- 卡马:** 1x 超级USB卡马 (Logitech BRIO,200美元)
- 位置: 坐落于工作场所90-100厘米以上,直向下面
- 清晰度:** 1280x720 速度为 30 fps
- 使用情况: 简单的选择和放置,初始原型制造,单臂桌面任务
- 限制: 没有高度信息,没有自我中心的视图,政策效率15-25%低于复杂任务的3摄像头设置
您可以在投资多摄像头设置之前验证任务定义.
配置2:标准 (3摄像头,建议)
对于标准操纵数据收集,RCSV使用这种配置,并平衡覆盖,分辨率和存储成本:
- 相机1 -- 固定上空 (上下): 装在工作空间80-100厘米以上,直向下.分辨率1280x960以30fps. 从上方捕捉整个工作空间,对象放置和抓住器的方法.这是大多数选择和位置政策最有信息的视图.
- 相机2 -- 固定侧 (侧): 安装在工作空间高度,侧面60-80厘米.分辨率1280x960以30fps.提供高度信息,空视图无法.对堆叠,倒和插入任务至关重要.
- **相机3 - 手腕 (自我中心):**安装在机器人的终端效应器或工具
上,面向前.分辨率为640x480以60fps.更高的镜像速度可以捕捉到快速的手腕运动,而不会模糊.自我中心的视图显著提高了模仿学习研究中的抓住和精细操纵政策性能.
对于使用DK1的双手设置,将相机2的相反侧置置第四个固定相机,以覆盖双臂
配置3:全覆盖 (5+摄像头,高级)
- 相机1-3: 与配置2相同 (上头,侧,手腕)
- 相机4 - 另一侧: 镜像相机2在工作场所的另一侧. 消除手/臂遮蔽盲点.
- 相机5 -- 前面角 (45度): 位于前面60厘米,向下角45度. 捕捉到对象接近和抓住器的方向,而上头错过.
- 相机6 (可选) -- 深度相机: 智能实力Sense D435 安装在空头位置附近,可提供额外的点云数据.
这种配置每集生成3-5倍的数据,但提供了最完整的视觉覆盖.用于多视图政策学习和3D场景重建的研究.存储需求:每相机的15 Mbps约为500 MB/分钟.
终端延迟预算
对于远程操作,总玻璃到玻璃延迟 (从光子撞到传感器到动机运动) 必须保持在150ms以下,以舒适的人员操作,并低于100ms以精确的操纵.
| Stage | Component | GigE Camera | USB Camera |
|---|---|---|---|
| 1 | Sensor exposure | 5-10 ms | 5-33 ms (auto-exposure) |
| 2 | Readout + transfer | <1 ms (Ethernet) | 10-50 ms (USB scheduling) |
| 3 | Driver processing | 1-2 ms | 2-5 ms |
| 4 | ROS2 topic publish | 1-3 ms | 1-3 ms |
| 5 | Policy inference | 10-30 ms (GPU) | 10-30 ms (GPU) |
| 6 | Motor command + execution | 5-10 ms | 5-10 ms |
| Total | 23-56 ms | 33-131 ms |
对于使用 [OpenArm 1]
协同化方法
通过33毫米的相机在30fps的速度间的脱同步,意味着一个相机落后一个完整的框架.
硬件GPIO触发器 (建议用于GigeE摄像头)
单个触发器脉冲由微控制器 (Arduino Uno为25美元或Raspberry Pi GPIO) 生成,并同时连接到所有摄像机的触发器输入.实现1ms的同步.通过Pylon (Basler) 或 SpinView (FLIR) 配置外置触发器模式.触发器脉冲也被登录到您的数据文件中,为您提供了精确的共同时间
# Arduino trigger sketch for 30 fps synchronized capture
void setup() {
pinMode(2, OUTPUT); // Trigger pin → all camera trigger inputs
}
void loop() {
digitalWrite(2, HIGH);
delayMicroseconds(100); // 100us pulse width
digitalWrite(2, LOW);
delay(33); // 33ms → 30 fps
}
通过NTP进行软件同步
通过使用
接近同步的ROS2消息_过器
当硬件触发功能不存在时,使用ROS2
from message_filters import ApproximateTimeSynchronizer, Subscriber
from sensor_msgs.msg import Image
sub_overhead = Subscriber(node, Image, '/cam_overhead/image_raw')
sub_side = Subscriber(node, Image, '/cam_side/image_raw')
sub_wrist = Subscriber(node, Image, '/cam_wrist/image_raw')
sync = ApproximateTimeSynchronizer(
[sub_overhead, sub_side, sub_wrist],
queue_size=10,
slop=0.033 # 33ms tolerance (1 frame at 30fps)
)
sync.registerCallback(synchronized_callback)
摄像头校准
校准有两个组成部分:每相机的内在和外在 (相机和机器人基之间的相对姿势).
内在校准标志着每个相机的焦距,主点和扭曲系数.使用OpenCV的校准模块,使用9×7棋盘 (25毫米方形).在不同角度和距离收集20-40张图像.目标重投射错误 <0.5 px (可接受高达1.0 px).运行校准使用:
外观校准确定了从每个摄像头框架到机器人基架的6DOF转换.使用一个安装在几个已知姿势的ChArUco板 (比普通棋牌更好的角落检测).每个摄像头,收集15-20个板观测在整个工作空间的体积. 结果转换将作为静态TF框架存储在您的ROS2参数文件中,并用于将观察投影到一个共同的机器人相关坐标框架中,用于政策培训.
通过将机器人的TCP位置 (从前进动力学) 投影到每个相机图像中,验证校准.投影点应在所有工作空间位置上与可见的TCP保持在5像素内.错误>10px通常表明相机安装姿势是错误的 - 再检查安装的刚性,然后回忆出外部数据.
运输管道
| Transport | Bandwidth (1280x960@30fps) | CPU Load | Quality Loss | Best For |
|---|---|---|---|---|
| raw | ~880 Mbps | Minimal | None | Intra-process, shared memory |
| compressed (JPEG 80%) | ~30-60 Mbps | Moderate | Slight (lossy) | Cross-machine recording |
| h264 (ffmpeg_image_transport) | ~10-30 Mbps | High (GPU encode helps) | Moderate (lossy) | Long recording sessions, storage-limited |
| compressed (PNG) | ~300-500 Mbps | High | None (lossless) | Archival, precision-critical data |
**建议:**用于标准数据收集的80%质量使用JPEG压缩运输.在这种质量水平的压缩文物在大多数政策培训管道的噪音水平下.对于最高的研究数据集,使用 PNG无损,但计划增加存储量10倍.
模仿学习的HDF5录音格式
录音管道必须将同步的框架,机器人联合状态和行动标签捕获到每次演示的单个文件中.HDF5是ACT,扩散政策和大多数模仿学习框架所使用的标准格式.
建议的HDF5结构
/episode_0042/
observations/
images/
cam_overhead # (T, H, W, 3) uint8 JPEG-decoded frames
cam_side # (T, H, W, 3) uint8
cam_wrist # (T, H, W, 3) uint8
joint_positions # (T, 6) float64 — radians
joint_velocities # (T, 6) float64 — rad/s
ee_pose # (T, 7) float64 — xyz + quaternion
gripper_state # (T, 1) float64 — 0.0 closed to 1.0 open
tactile/ # optional
left_finger # (T, 16, 16) uint16 — Paxini pressure
right_finger # (T, 16, 16) uint16
actions/
joint_positions # (T, 6) float64 — target joint positions
gripper_action # (T, 1) float64 — target gripper state
metadata/
timestamp # (T,) float64 — Unix timestamps
trigger_pulse # (T,) uint8 — hardware trigger confirmation
fps # scalar — recording frame rate
camera_intrinsics # dict — per-camera calibration
camera_extrinsics # dict — camera-to-base transforms
在Python中写HDF5:
import h5py
import numpy as np
with h5py.File('episode_0042.hdf5', 'w') as f:
ep = f.create_group('episode_0042')
obs = ep.create_group('observations')
imgs = obs.create_group('images')
# Store images with chunk-based compression
imgs.create_dataset('cam_overhead', data=overhead_frames,
chunks=(1, 960, 1280, 3), compression='gzip')
obs.create_dataset('joint_positions', data=joint_data)
obs.create_dataset('ee_pose', data=ee_data)
# Actions
acts = ep.create_group('actions')
acts.create_dataset('joint_positions', data=action_data)
# Metadata
meta = ep.create_group('metadata')
meta.create_dataset('timestamp', data=timestamps)
meta.attrs['fps'] = 30
框架配合: 在写作时,将所有数据配合到触发时间
记录管道架构
摄像头传感器到HDF5文件的完整录音管道:
- 摄像头驱动器节点 (每摄像头一个): 发布
T15 在 T16 和 T17 上. - 同步节点: 使用
T18 来对齐所有摄像头的框架 + T19 + T20 . 发布一个自定义的 T21 消息. - 记录节点: 订阅
T22 ,缓冲器在内存中,并在事件边界上向 HDF5 冲动 (由操作员按键或电话操作停止信号触发). - **压缩 (可选):**如果在高分辨率录音时,在单独的线程中运行H.264编码以避免阻塞录音循环.在10Mbps时,一个30fps的1280x960流每相机使用约75MB/分钟.
对于云存储和数据集管理,使用[RCSV的数据服务]
存储规划
在开始数据收集活动之前,计算您的存储需求:
** 举例:每部相机设置3摄像头15 Mbps,每部相机收藏8小时的日期:** 3摄像头x15 Mbps x3600s/h x8hr / 8位/字节 / 1e9 GB = 162 GB/天.在10 Mbps平均: 108 GB/天.计划每部录音站4 TB NVMe SSD,每晚 rsync到一个 NAS或云桶.
| Configuration | Cameras | GB/day (8 hr) | Days on 4 TB SSD | Monthly Cloud Cost (S3) |
|---|---|---|---|---|
| Minimal (JPEG) | 1 | 36 | ~110 | ~$18 |
| Standard (H.264) | 3 | 108 | ~37 | ~$55 |
| Full coverage (H.264) | 5 | 180 | ~22 | ~$92 |
| Full coverage (PNG lossless) | 5 | 900 | ~4 | ~$460 |
灯光设置
常规的照明显著提高了政策的概括.在不一致的照明下训练的政策通常在照明条件不同时失败.
- 颜色温度:使用5500K日光平衡的LED环灯 (例如,Neewer 18"环灯为60美元).所有灯的一致的颜色温度防止相机之间的白色平衡变化.
- 位置: 设置灯光从顶部相机轴处45度角度,以减少光
物体和机器人表面的反射.避免直接在任何相机后面的灯光. 散: 加入散板 ( 结的 烯酸片) 在灯光前面以消除硬影.硬影子创造了视觉特征,不会将其普遍化到不同时间. 幕: 对于窗户附近的实验室设置,安装幕,以消除云和太阳角度的环境光变化.这是对数据收集质量进行最高ROI投资之一.
常见的问题和解决方案
| Issue | Cause | Solution |
|---|---|---|
| Dropped frames | USB bandwidth saturation | Move cameras to separate USB controllers; use GigE |
| GigE incomplete frames | Jumbo frames not enabled | ip link set eth0 mtu 9000 |
| Color inconsistency between cameras | Auto white balance enabled | Set manual white balance (5500K) on all cameras |
| Blurry wrist camera | Motion blur from long exposure | Set exposure to <5 ms; increase lighting intensity |
| High CPU during recording | Software JPEG encoding per frame | Use camera-side JPEG encoding or GPU H.264 (NVENC) |
| 标定 reprojection >1 px | Too few or poorly distributed calibration images | Collect 30+ images covering all corners at varied distances |
相机类型的比较
您的选择影响成本,延迟确定性和集成复杂性.
| Type | Example Model | Price | 延迟 | Best For |
|---|---|---|---|---|
| USB (UVC) | Logitech BRIO 4K | ~$200 | 50-200ms variable | Budget setups, low-frequency tasks |
| GigE Vision | Basler ace2 a2A1920 | $400-$1,500 | <1ms deterministic | High-quality datasets, policy training |
| Depth (RGB-D) | Intel RealSense D435 | ~$200 | 30-60ms | Supplemental depth -- not recommended as primary |
USB摄像头 (Logitech BRIO,ELP,Arducam) 是最容易使用的,但由于USB主机控制器的调度而导致的可变延迟.在负载下,框架交付可以震动20-50ms,这使得多摄像头录像脱节并降低了政策训练.对于单摄像头或低摄像头速度设置 (<15fps),USB是可接受的.
GigE视觉摄像头 (Basler ace2,FLIR Blackfly S,Allied Vision Alvium) 在硬件触发时提供以太网为止的框架,具有确定性 <1 ms的延迟.Basler ace2 a2A1920-160ucBAS在650美元的价格上提供1920x1200的速度为160fps,足够于30fps机器人录音.GigE摄像头需要具有启用 jumbo框架 (
深度摄像头 (RealSense D435,Azure Kinect) 是用于补充3D场景理解的,但不推
三种摄像机配置
操作任务受益于不同的摄像头安排.以下是RCSV使用的三个验证配置,按复杂性和数据丰富度排序.
配置1:最小 (1 摄像头,预算设置)
- 卡马:** 1x 超级USB卡马 (Logitech BRIO,200美元)
- 位置: 坐落于工作场所90-100厘米以上,直向下面
- 清晰度:** 1280x720 速度为 30 fps
- 使用情况: 简单的选择和放置,初始原型制造,单臂桌面任务
- 限制: 没有高度信息,没有自我中心的视图,政策效率15-25%低于复杂任务的3摄像头设置
您可以在投资多摄像头设置之前验证任务定义.
配置2:标准 (3摄像头,建议)
对于标准操纵数据收集,RCSV使用这种配置,并平衡覆盖,分辨率和存储成本:
- 相机1 -- 固定上空 (上下): 装在工作空间80-100厘米以上,直向下.分辨率1280x960以30fps. 从上方捕捉整个工作空间,对象放置和抓住器的方法.这是大多数选择和位置政策最有信息的视图.
- 相机2 -- 固定侧 (侧): 安装在工作空间高度,侧面60-80厘米.分辨率1280x960以30fps.提供高度信息,空视图无法.对堆叠,倒和插入任务至关重要.
- **相机3 - 手腕 (自我中心):**安装在机器人的终端效应器或工具
上,面向前.分辨率为640x480以60fps.更高的镜像速度可以捕捉到快速的手腕运动,而不会模糊.自我中心的视图显著提高了模仿学习研究中的抓住和精细操纵政策性能.
对于使用DK1的双手设置,将相机2的相反侧置置第四个固定相机,以覆盖双臂
配置3:全覆盖 (5+摄像头,高级)
- 相机1-3: 与配置2相同 (上头,侧,手腕)
- 相机4 - 另一侧: 镜像相机2在工作场所的另一侧. 消除手/臂遮蔽盲点.
- 相机5 -- 前面角 (45度): 位于前面60厘米,向下角45度. 捕捉到对象接近和抓住器的方向,而上头错过.
- 相机6 (可选) -- 深度相机: 智能实力Sense D435 安装在空头位置附近,可提供额外的点云数据.
这种配置每集生成3-5倍的数据,但提供了最完整的视觉覆盖.用于多视图政策学习和3D场景重建的研究.存储需求:每相机的15 Mbps约为500 MB/分钟.
终端延迟预算
对于远程操作,总玻璃到玻璃延迟 (从光子撞到传感器到动机运动) 必须保持在150ms以下,以舒适的人员操作,并低于100ms以精确的操纵.
| Stage | Component | GigE Camera | USB Camera |
|---|---|---|---|
| 1 | Sensor exposure | 5-10 ms | 5-33 ms (auto-exposure) |
| 2 | Readout + transfer | <1 ms (Ethernet) | 10-50 ms (USB scheduling) |
| 3 | Driver processing | 1-2 ms | 2-5 ms |
| 4 | ROS2 topic publish | 1-3 ms | 1-3 ms |
| 5 | Policy inference | 10-30 ms (GPU) | 10-30 ms (GPU) |
| 6 | Motor command + execution | 5-10 ms | 5-10 ms |
| Total | 23-56 ms | 33-131 ms |
对于使用 [OpenArm 1]
协同化方法
通过33毫米的相机在30fps的速度间的脱同步,意味着一个相机落后一个完整的框架.
硬件GPIO触发器 (建议用于GigeE摄像头)
单个触发器脉冲由微控制器 (Arduino Uno为25美元或Raspberry Pi GPIO) 生成,并同时连接到所有摄像机的触发器输入.实现1ms的同步.通过Pylon (Basler) 或 SpinView (FLIR) 配置外置触发器模式.触发器脉冲也被登录到您的数据文件中,为您提供了精确的共同时间
# Arduino trigger sketch for 30 fps synchronized capture
void setup() {
pinMode(2, OUTPUT); // Trigger pin → all camera trigger inputs
}
void loop() {
digitalWrite(2, HIGH);
delayMicroseconds(100); // 100us pulse width
digitalWrite(2, LOW);
delay(33); // 33ms → 30 fps
}
通过NTP进行软件同步
通过使用
接近同步的ROS2消息_过器
当硬件触发功能不存在时,使用ROS2
from message_filters import ApproximateTimeSynchronizer, Subscriber
from sensor_msgs.msg import Image
sub_overhead = Subscriber(node, Image, '/cam_overhead/image_raw')
sub_side = Subscriber(node, Image, '/cam_side/image_raw')
sub_wrist = Subscriber(node, Image, '/cam_wrist/image_raw')
sync = ApproximateTimeSynchronizer(
[sub_overhead, sub_side, sub_wrist],
queue_size=10,
slop=0.033 # 33ms tolerance (1 frame at 30fps)
)
sync.registerCallback(synchronized_callback)
摄像头校准
校准有两个组成部分:每相机的内在和外在 (相机和机器人基之间的相对姿势).
内在校准标志着每个相机的焦距,主点和扭曲系数.使用OpenCV的校准模块,使用9×7棋盘 (25毫米方形).在不同角度和距离收集20-40张图像.目标重投射错误 <0.5 px (可接受高达1.0 px).运行校准使用:
外观校准确定了从每个摄像头框架到机器人基架的6DOF转换.使用一个安装在几个已知姿势的ChArUco板 (比普通棋牌更好的角落检测).每个摄像头,收集15-20个板观测在整个工作空间的体积. 结果转换将作为静态TF框架存储在您的ROS2参数文件中,并用于将观察投影到一个共同的机器人相关坐标框架中,用于政策培训.
通过将机器人的TCP位置 (从前进动力学) 投影到每个相机图像中,验证校准.投影点应在所有工作空间位置上与可见的TCP保持在5像素内.错误>10px通常表明相机安装姿势是错误的 - 再检查安装的刚性,然后回忆出外部数据.
运输管道
| Transport | Bandwidth (1280x960@30fps) | CPU Load | Quality Loss | Best For |
|---|---|---|---|---|
| raw | ~880 Mbps | Minimal | None | Intra-process, shared memory |
| compressed (JPEG 80%) | ~30-60 Mbps | Moderate | Slight (lossy) | Cross-machine recording |
| h264 (ffmpeg_image_transport) | ~10-30 Mbps | High (GPU encode helps) | Moderate (lossy) | Long recording sessions, storage-limited |
| compressed (PNG) | ~300-500 Mbps | High | None (lossless) | Archival, precision-critical data |
**建议:**用于标准数据收集的80%质量使用JPEG压缩运输.在这种质量水平的压缩文物在大多数政策培训管道的噪音水平下.对于最高的研究数据集,使用 PNG无损,但计划增加存储量10倍.
模仿学习的HDF5录音格式
录音管道必须将同步的框架,机器人联合状态和行动标签捕获到每次演示的单个文件中.HDF5是ACT,扩散政策和大多数模仿学习框架所使用的标准格式.
建议的HDF5结构
/episode_0042/
observations/
images/
cam_overhead # (T, H, W, 3) uint8 JPEG-decoded frames
cam_side # (T, H, W, 3) uint8
cam_wrist # (T, H, W, 3) uint8
joint_positions # (T, 6) float64 — radians
joint_velocities # (T, 6) float64 — rad/s
ee_pose # (T, 7) float64 — xyz + quaternion
gripper_state # (T, 1) float64 — 0.0 closed to 1.0 open
tactile/ # optional
left_finger # (T, 16, 16) uint16 — Paxini pressure
right_finger # (T, 16, 16) uint16
actions/
joint_positions # (T, 6) float64 — target joint positions
gripper_action # (T, 1) float64 — target gripper state
metadata/
timestamp # (T,) float64 — Unix timestamps
trigger_pulse # (T,) uint8 — hardware trigger confirmation
fps # scalar — recording frame rate
camera_intrinsics # dict — per-camera calibration
camera_extrinsics # dict — camera-to-base transforms
在Python中写HDF5:
import h5py
import numpy as np
with h5py.File('episode_0042.hdf5', 'w') as f:
ep = f.create_group('episode_0042')
obs = ep.create_group('observations')
imgs = obs.create_group('images')
# Store images with chunk-based compression
imgs.create_dataset('cam_overhead', data=overhead_frames,
chunks=(1, 960, 1280, 3), compression='gzip')
obs.create_dataset('joint_positions', data=joint_data)
obs.create_dataset('ee_pose', data=ee_data)
# Actions
acts = ep.create_group('actions')
acts.create_dataset('joint_positions', data=action_data)
# Metadata
meta = ep.create_group('metadata')
meta.create_dataset('timestamp', data=timestamps)
meta.attrs['fps'] = 30
框架配合: 在写作时,将所有数据配合到触发时间
记录管道架构
摄像头传感器到HDF5文件的完整录音管道:
- 相机驱动器节点 (每相机一个): 发布
T31 在 T32 和 T33 上. - 同步节点: 使用
T34 来对齐所有摄像头的框架 + T35 + T36 . 发布一个自定义的 T37 消息. - 录音节点: 订阅
T38 ,缓冲器存储,并在事件边界上将HDF5调到线 (由操作员按 或电话操作停止信号触发). - **压缩 (可选):**如果在高分辨率录音时,在单独的线程中运行H.264编码以避免阻塞录音循环.在10Mbps时,一个30fps的1280x960流每相机使用约75MB/分钟.
对于云存储和数据集管理,使用[RCSV的数据服务]
存储规划
在开始数据收集活动之前,计算您的存储需求:
** 举例:每部相机设置3摄像头15 Mbps,每部相机收藏8小时的日期:** 3摄像头x15 Mbps x3600s/h x8hr / 8位/字节 / 1e9 GB = 162 GB/天.在10 Mbps平均: 108 GB/天.计划每部录音站4 TB NVMe SSD,每晚 rsync到一个 NAS或云桶.
| Configuration | Cameras | GB/day (8 hr) | Days on 4 TB SSD | Monthly Cloud Cost (S3) |
|---|---|---|---|---|
| Minimal (JPEG) | 1 | 36 | ~110 | ~$18 |
| Standard (H.264) | 3 | 108 | ~37 | ~$55 |
| Full coverage (H.264) | 5 | 180 | ~22 | ~$92 |
| Full coverage (PNG lossless) | 5 | 900 | ~4 | ~$460 |
灯光设置
常规的照明显著提高了政策的概括.在不一致的照明下训练的政策通常在照明条件不同时失败.
- 颜色温度:使用5500K日光平衡的LED环灯 (例如,Neewer 18"环灯为60美元).所有灯的一致的颜色温度防止相机之间的白色平衡变化.
- 位置: 设置灯光从顶部相机轴处45度角度,以减少光
物体和机器人表面的反射.避免直接在任何相机后面的灯光. 散: 加入散板 ( 结的 烯酸片) 在灯光前面以消除硬影.硬影子创造了视觉特征,不会将其普遍化到不同时间. 幕: 对于窗户附近的实验室设置,安装幕,以消除云和太阳角度的环境光变化.这是对数据收集质量进行最高ROI投资之一.
常见的问题和解决方案
| Issue | Cause | Solution |
|---|---|---|
| Dropped frames | USB bandwidth saturation | Move cameras to separate USB controllers; use GigE |
| GigE incomplete frames | Jumbo frames not enabled | ip link set eth0 mtu 9000 |
| Color inconsistency between cameras | Auto white balance enabled | Set manual white balance (5500K) on all cameras |
| Blurry wrist camera | Motion blur from long exposure | Set exposure to <5 ms; increase lighting intensity |
| High CPU during recording | Software JPEG encoding per frame | Use camera-side JPEG encoding or GPU H.264 (NVENC) |
| 标定 reprojection >1 px | Too few or poorly distributed calibration images | Collect 30+ images covering all corners at varied distances |







