各位大佬,目前在参加二十一届地瓜创意赛,比赛任务有巡线避障、扫码、图生文等,之前是用单目相机完成的这些例程,现在加了一个Aurora930深度相机,是应该两者一起用吗?调用关系应该是什么样呢?还有就是,有佬知道哪里有这个深度相机的功能包资源吗
1 个赞
你好!欢迎参加地瓜创意赛。关于 Aurora930 深度相机与单目相机的配合使用,我给你一个清晰的方案:
功能包获取
Aurora930 的官方驱动功能包是 deptrum-ros-driver-aurora930,获取方式:
# 1. 确认已添加 d-robotics 源
sudo apt update
# 2. 安装驱动包
sudo apt install ros-humble-deptrum-ros-driver-aurora930
如果源里没有,可以从社区帖子中获取源码编译:
- 参考帖子:调用深度相机出现heartbeat failedd
- 启动命令:
ros2 launch deptrum-ros-driver-aurora930 aurora930_launch.py
多相机使用方案
结论:两者可以一起用,但需要独立节点管理
推荐架构
单目相机 (USB/CSI) → /camera/color/image_raw
↓
你的算法节点
↑
Aurora930 深度相机 → /camera/depth/image_raw
/camera/depth/camera_info
调用关系
# 示例:同时订阅两个相机话题
from rclpy.node import Node
from sensor_msgs.msg import Image
class MultiCameraNode(Node):
def __init__(self):
super().__init__('multi_camera_node')
# 订阅单目相机
self.color_sub = self.create_subscription(
Image, '/camera/color/image_raw', self.color_callback, 10)
# 订阅深度相机
self.depth_sub = self.create_subscription(
Image, '/camera/depth/image_raw', self.depth_callback, 10)
def color_callback(self, msg):
# 处理巡线、扫码等任务
pass
def depth_callback(self, msg):
# 处理避障、距离测量等任务
pass
任务分配建议
| 任务 | 推荐相机 | 原因 |
|---|---|---|
| 巡线 | 单目相机 | 颜色识别更准确,处理速度快 |
| 扫码 | 单目相机 | 二维码识别不需要深度信息 |
| 避障 | Aurora930 | 需要精确距离信息 |
| 图生文 | 单目相机 | VLM 模型通常基于 RGB 图像 |
常见问题排查
-
深度图像全为 0
- 参考帖子:相机的深度图像不能显示
- 检查:相机连接是否在蓝色 USB3.0 口
-
heartbeat failed 报错
- 参考帖子:调用深度相机出现heartbeat failedd
- 解决:检查供电是否充足,尝试重新插拔
-
多相机带宽不足
- 降低单目相机分辨率或帧率
- 深度相机可适当降低发布频率
推荐学习资源
- 第20届智能车备赛指南 - 包含多传感器融合经验
- 官方文档:RDK 相机使用手册
建议:先把 Aurora930 单独调通,确保深度图能正常发布,再逐步融合到你的现有代码中。遇到问题可以把报错信息发到社区,大家会帮你一起排查!
需要我帮你查找更具体的某个功能的实现示例吗?
看到你提供的 Aurora930 话题列表了!我帮你整理一个精确的订阅和融合方案:
话题订阅方案
1. 基础订阅代码
from rclpy.node import Node
from sensor_msgs.msg import Image, CameraInfo
from sensor_msgs_py.point_cloud2 import read_point_cloud
import cv2
from cv_bridge import CvBridge
class MultiCameraFusion(Node):
def __init__(self):
super().__init__('multi_camera_fusion')
self.bridge = CvBridge()
# 存储最新数据
self.color_img = None
self.depth_img = None
self.rgb_time = None
self.depth_time = None
# 订阅 Aurora930 RGB
self.aurora_rgb_sub = self.create_subscription(
Image, '/aurora/rgb/image_raw', self.aurora_rgb_callback, 10)
# 订阅 Aurora930 深度
self.aurora_depth_sub = self.create_subscription(
Image, '/aurora/depth/image_raw', self.aurora_depth_callback, 10)
# 订阅单目相机(假设话题名)
self.mono_sub = self.create_subscription(
Image, '/camera/color/image_raw', self.mono_callback, 10)
# 定时器处理融合数据
self.timer = self.create_timer(0.033, self.fusion_callback) # 30Hz
2. 回调函数实现
def aurora_rgb_callback(self, msg):
self.color_img = self.bridge.imgmsg_to_cv2(msg, 'bgr8')
self.rgb_time = msg.header.stamp
def aurora_depth_callback(self, msg):
self.depth_img = self.bridge.imgmsg_to_cv2(msg, '16UC1')
self.depth_time = msg.header.stamp
def mono_callback(self, msg):
self.mono_img = self.bridge.imgmsg_to_cv2(msg, 'bgr8')
self.mono_time = msg.header.stamp
3. 时间同步融合(关键!)
def fusion_callback(self):
# 检查数据是否就绪
if self.color_img is None or self.depth_img is None:
return
# 时间同步检查(允许 50ms 误差)
time_diff = abs(self.rgb_time.nanoseconds - self.depth_time.nanoseconds)
if time_diff > 50000000: # 50ms
self.get_logger().warn(f'RGB-D 时间不同步:{time_diff/1e6:.1f}ms')
return
# 方案 A:使用 Aurora930 的 RGB+Depth 做避障
obstacle_dist = self.get_obstacle_distance(self.depth_img)
# 方案 B:使用单目相机做巡线/扫码
if self.mono_img is not None:
line_info = self.detect_line(self.mono_img)
qr_code = self.decode_qr(self.mono_img)
# 决策融合
self.make_decision(obstacle_dist, line_info, qr_code)
任务 - 话题映射表
| 比赛任务 | 推荐话题 | 原因 |
|---|---|---|
| 巡线 | /camera/color/image_raw (单目) |
单目帧率更高,颜色识别快 |
| 扫码 | /camera/color/image_raw (单目) |
二维码识别不需要深度 |
| 避障 | /aurora/depth/image_raw |
精确距离测量 |
| 避障 | /aurora/point_cloud |
3D 障碍物检测 |
| 图生文 | /aurora/rgb/image_raw |
Aurora930 的 RGB 质量更好 |
| SLAM | /aurora/depth/image_raw + /aurora/rgb/image_raw |
RGB-D SLAM |
完整示例:避障 + 巡线融合
def make_decision(self, obstacle_dist, line_info, qr_code):
# 优先级:避障 > 巡线 > 扫码
if obstacle_dist < 0.5: # 50cm 内有障碍
self.stop_and_turn()
elif line_info is not None:
self.follow_line(line_info)
elif qr_code is not None:
self.process_qr(qr_code)
else:
self.keep_moving()
def get_obstacle_distance(self, depth_img):
# 取图像中心区域的深度值
h, w = depth_img.shape
center_region = depth_img[h//2-50:h//2+50, w//2-50:w//2+50]
min_dist = cv2.minMaxLoc(center_region)[0]
return min_dist / 1000.0 # 转换为米(假设深度单位是 mm)
重要注意事项
1. 话题命名空间冲突
如果你的单目相机也发布 /camera/... 话题,需要修改其中一个的命名空间:
# 方法:在启动文件中添加 namespace
<node pkg="camera_driver" exec="camera_node" namespace="mono_camera">
2. 带宽优化
Aurora930 同时发布 RGB+Depth+IR+PointCloud 会占用大量 USB 带宽:
# 如果不需要点云,可以关闭
# 修改 launch 文件或参数
ros2 param set /aurora930_node publish_point_cloud false
3. 时间同步问题
如果两个相机时间戳差异大,使用 message_filters:
from message_filters import Subscriber, TimeSynchronizer
def __init__(self):
# ...
rgb_sub = Subscriber(self, Image, '/aurora/rgb/image_raw')
depth_sub = Subscriber(self, Image, '/aurora/depth/image_raw')
self.ts = TimeSynchronizer([rgb_sub, depth_sub], queue_size=10)
self.ts.registerCallback(self.sync_callback)
参考资源
- 驱动问题排查:调用深度相机出现 heartbeat failed
- 你的前一个帖子:求助大佬,深度相机使用问题(驱动版本问题)
- 备赛指南:第 20 届智能车备赛指南
下一步建议:
- 先单独测试 Aurora930 的每个话题是否正常发布
- 用
rviz2可视化深度图和点云 - 再逐步融合到你的巡线代码中
需要我帮你写一个完整的融合节点示例吗?或者有其他具体问题?
古月居社区/ OriginCar手册 / 或者直接百度应该都能找到这个功能包资源 , Aurora930深度相机用于避障或者建图是一个比较合理的使用方式,具体可以让大模型给一些方案
