CameraManager 相机管理#
CameraManager 是 Genesis 模拟器的相机管理模块,提供了完整的机器人视觉仿真能力。该系统通过多线程架构实现了实时图像采集、处理和存储功能,支持RGB图像、深度图像和相机参数的获取,为机器人的视觉算法提供了高质量的数据支持。
系统架构设计#
CameraManager 类#
CameraManager类采用生产者-消费者模式设计,通过独立线程处理图像采集任务,避免阻塞主仿真循环:
- 多线程处理架构
主线程负责仿真控制和用户交互
相机线程专门处理图像采集和处理
线程间通过事件机制进行同步和通信
- 资源管理机制
自动创建输出目录结构
智能的文件命名和版本管理
完善的线程生命周期管理
- 配置参数系统
灵活的采集间隔设置
可配置的输出路径和格式
动态的图像质量参数调节
核心功能模块#
相机定位系统#
- 动态跟随机制
相机系统实现了智能的机器人跟随功能,相机位置根据机器人的实时状态动态调整:
# 获取机器人当前状态
car_pos = self.car.get_pos()
car_yaw = getattr(self.car, "_my_yaw", 0.0)
# 计算相机在机器人前方的位置
camera_offset_x = 0.3 * np.sin(car_yaw)
camera_offset_y = 0.3 * np.cos(car_yaw)
camera_x = car_x + camera_offset_x
camera_y = car_y + camera_offset_y
camera_z = car_z + 0.2 # 略高于机器人中心
- 视线方向计算
系统根据机器人朝向自动计算相机的观察方向,确保相机始终朝向机器人的前进方向:
# 计算前视方向的观察点
lookat_x = camera_x + np.sin(car_yaw)
lookat_y = camera_y + np.cos(car_yaw)
lookat_z = camera_z
- 多视角支持
系统支持多种相机安装模式: - 前置相机:安装在机器人前方,用于导航和避障 - 顶置相机:俯视角度,用于全局定位和地图构建 - 侧置相机:侧面视角,用于环境感知和物体检测
图像采集系统#
- RGB图像采集
系统提供高质量的RGB图像采集功能,支持多种分辨率和格式:
def capture_rgb_image(self, width=640, height=480, save_to_disk=True):
# 渲染RGB图像
self.camera.render()
rgb_image = self.camera.get_picture("Color")
# 格式转换和处理
if hasattr(rgb_image, "cpu"):
rgb_image = rgb_image.cpu().numpy()
# 图像后处理
rgb_image = (rgb_image * 255).astype(np.uint8)
rgb_image = cv2.cvtColor(rgb_image, cv2.COLOR_RGB2BGR)
return rgb_image
- 深度图像采集
深度图像提供了精确的距离信息,支持机器人的3D感知能力:
def capture_depth_image(self, width=640, height=480, save_to_disk=True):
# 渲染深度图像
self.camera.render()
depth_image = self.camera.get_picture("Depth")
# 深度值处理
if hasattr(depth_image, "cpu"):
depth_image = depth_image.cpu().numpy()
# 深度范围标准化
min_depth = np.min(depth_image)
max_depth = np.max(depth_image)
return depth_image, min_depth, max_depth
- 相机参数获取
系统提供完整的相机内参和外参信息:
def get_camera_info(self):
# 获取相机内参矩阵
K = self.camera.get_intrinsic_matrix()
# 获取相机外参信息
cam_pos = self.camera.get_pos()
cam_lookat = self.camera.get_lookat()
return {
"intrinsic_matrix": K.tolist(),
"position": cam_pos,
"lookat": cam_lookat,
"fov": self.camera.fov,
"resolution": [self.camera.W, self.camera.H]
}