ROS 2 环境下使用 Astra Pro 深度相机实现目标距离检测及远程可视化全流程总结

一、环境准备

硬件

rk3588-elf2开发板(aarch64 Ubuntu22.04 ros2humble) ,  AstraPro相机

网络:板子和Windows电脑连的同一个手机热点

软件

  • Windows:安装 PuTTY(SSH 工具)、Xming(X11 转发工具)

开发板(Ubuntu):

sudo apt install ros-humble-rviz2 ros-humble-rqt-image-view  # 安装可视化工具 

注意:

环境配置过程后面再补吧,暂时懒得写

后面的步骤全部建立在环境各种条件依赖什么的都配置好了

二、通过 PuTTY+Xming 实现远程图形界面显示
  1. 启动 Xming(Windows 端)

    • 双击桌面XLaunch图标 → 选择Multiple windows → Start no client → Finish,任务栏显示 Xming 图标。
  2. PuTTY 配置 SSH 连接

    • 打开 PuTTY → 输入开发板 IP 地址 → 展开Connection > SSH > X11 → 勾选Enable X11 forwarding,填写X display locationlocalhost:0 → 保存并连接。
  3. 验证 X11 转发(开发板终端)

ssh -X username@开发板IP  # 通过SSH连接开发板(含X11转发)  
xclock  # 若Windows弹出时钟窗口,说明配置成功  
三、启动 Astra 相机并获取深度数据
  1. 启动相机节点(开发板终端)

ros2 launch astra_camera astra_pro.launch.py  # 启动深度相机(默认发布彩色/深度图像)  

在 RViz2 中显示相机画面(Windows 端)

  • 通过 PuTTY 连接后,在开发板终端执行:
rviz2  # RViz2窗口会通过Xming转发到Windows桌面  

    • 在 RViz2 中配置:
      • Global Options > Fixed Frame 设置为camera_link(相机 TF 根坐标系)。
      • 点击Add > By Topic,选择/camera/color/image_raw添加图像显示插件。
四、实现目标距离检测(开发板端)
方案:结合深度图像直接计算距离
  1. 创建 ROS 2 节点(订阅深度图像)

    • 在功能包src目录下创建depth_distance_node.cpp(示例代码):
#include "rclcpp/rclcpp.hpp"  
#include "sensor_msgs/msg/image.hpp"  
#include "cv_bridge/cv_bridge.h"  
using namespace std::chrono_literals;  

class DepthDistanceNode : public rclcpp::Node {  
public:  
  DepthDistanceNode() : Node("depth_distance_node") {  
    depth_sub_ = this->create_subscription<sensor_msgs::msg::Image>(  
      "/camera/depth/image_raw", 10,  
      std::bind(&DepthDistanceNode::depth_callback, this, std::placeholders::_1));  
  }  

private:  
  void depth_callback(const sensor_msgs::msg::Image::SharedPtr msg) {  
    cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::TYPE_16UC1);  
    cv::Mat depth_image = cv_ptr->image;  
    int h = depth_image.rows, w = depth_image.cols;  
    uint16_t depth_value = depth_image.at<uint16_t>(h/2, w/2);  // 取中心像素  
    float distance_m = depth_value / 1000.0f;  // 转换为米  
    if (depth_value != 0 && distance_m < 3.0) {  // 过滤无效值  
      RCLCPP_INFO(this->get_logger(), "Center distance: %.2f m", distance_m);  
    }  
  }  
  rclcpp::Subscription<sensor_msgs::msg::Image>::SharedPtr depth_sub_;  
};  

int main(int argc, char * argv[]) {  
  rclcpp::init(argc, argv);  
  rclcpp::spin(std::make_shared<DepthDistanceNode>());  
  rclcpp::shutdown();  
  return 0;  
}  

编译节点(开发板终端)

  • 修改功能包的CMakeLists.txt
add_executable(depth_distance_node src/depth_distance_node.cpp)  
ament_target_dependencies(depth_distance_node rclcpp sensor_msgs cv_bridge)  
install(TARGETS depth_distance_node DESTINATION lib/${PROJECT_NAME})  

 编译并激活环境:

cd ~/工作空间 && colcon build --packages-select your_package  
source install/setup.bash  

 运行节点(开发板终端)

ros2 run your_package depth_distance_node  # 实时输出中心像素距离  

 五、完整操作流程图
Windows主机                          开发板(Ubuntu)  
├─ 启动Xming/XLaunch                 ├─ 连接Astra相机  
├─ 打开PuTTY并配置X11转发            ├─ 启动相机节点:ros2 launch astra_camera astra_pro.launch.py  
└─ 通过SSH连接开发板(含-X参数)      ├─ 运行RViz2:rviz2(画面通过Xming显示在Windows)  
                                    └─ 运行距离检测节点:ros2 run your_package depth_distance_node  
六、关键问题与解决方案
  1. RViz2 无法显示画面

    • 确保 PuTTY 启用 X11 转发,开发板/etc/ssh/sshd_configX11Forwarding yes
    • 在开发板终端手动设置export DISPLAY=localhost:0
  2. 深度值异常(如 8 米以上)

    • 相机有效范围为 0.5~3 米,远距离数据无效,需缩短检测距离。
    • 避免强光直射,调整相机ir_intensity参数(在 launch 文件中添加ir_intensity:=400)。
  3. 节点编译失败

    • 确保安装依赖:sudo apt install ros-humble-cv-bridge ros-humble-image-transport
    • 检查CMakeLists.txt中 OpenCV 链接是否正确:target_link_libraries(node_name ${OpenCV_LIBS})

、小笔记

用于查找与深度数据相关的话题(Topic)

ros2 topic list | grep depth
  1. ros2 topic list
    ROS 2 的命令,用于列出当前 ROS 2 系统中所有正在发布的话题。话题是 ROS 2 中节点间通信的一种方式,类似于 “消息总线”,节点可以发布(Publish)或订阅(Subscribe)特定话题的数据。

  2. |
    管道符号,用于将前一个命令的输出作为后一个命令的输入。

  3. grep depth
    Linux 命令,用于在文本中搜索包含 “depth”(深度)的行。在这里,它会筛选出ros2 topic list输出中所有名称包含 “depth” 的话题。

实际用途

在机器人感知系统中,深度数据通常用于 3D 建模、障碍物检测、导航等任务。常见的深度话题包括:

  • /camera/depth/image_raw:原始深度图像(像素值表示距离)
  • /camera/depth_registered/image_raw:与彩色图像对齐的深度图像
  • /camera/depth/points:点云数据(3D 空间中的点集合)

运行这个指令后,你可以快速找到与深度相机(如 Astra Pro、Intel RealSense 等)相关的话题,便于后续订阅和处理这些数据。

示例输出:

/camera/depth/camera_info
/camera/depth/image_raw
/camera/depth/image_rect_raw
/camera/depth/metadata
/camera/depth/points

扩展用法

查看话题详情

ros2 topic info /camera/depth/image_raw  # 查看话题的类型和发布者

监听话题数据: 

ros2 topic echo /camera/depth/image_raw  # 实时打印话题数据

可视化深度图像: 

rviz2  # 启动ROS 2可视化工具
# 在RViz中添加Image显示组件,并选择/camera/depth/image_raw话题

### 如何在ROS2中设置和使用深度相机 #### 配置环境 为了成功配置和使用深度相机,在Ubuntu 22.04上运行ROS2 Humble版本时,需确保安装了必要的驱动程序和支持包。例如,对于Orbbec Astra Pro深度相机,可以通过安装`ros-humble-astra-camera`软件包来支持设备[^1]。 #### 订阅相关话题 通过命令 `ros2 topic list` 可以查看当前活动的话题列表。针对深度相机,常见的三个主要话题如下: - `/stellar_1/rgb/image_raw`: 提供RGB图像数据流。 - `/camera/depth/image_raw`: 提供深度图像数据流。 - `/stellar_1/points2`: 发布点云数据。 这些话题分别对应于颜色图像、深度信息以及三维空间中的点云表示形式。 #### 设置QoS参数 当处理来自深度相机的数据时,适当调整QoS(Quality of Service)策略至关重要。这有助于优化性能并减少延迟。具体来说,可以修改QoS参数以匹配应用需求。例如,如果实时性非常重要,则应优先考虑可靠性而非带宽利用率;反之亦然[^2]。 #### 显示不同类型的图像 默认情况下,某些型号可能仅启用特定类型的画面传输功能。比如Orbbec Astra Pro,默认能够轻松获取到红外线画面(/camera/ir/image_raw),但对于彩色图片的支持则需要额外设定才能正常工作: 要显示彩色图,除了确认硬件本身具备该能力外,还需要检查相应的固件更新情况,并按照官方文档指导完成相应初始化过程。 #### 测试消息频率 利用工具如`rostopic hz`, 用户可检测指定主题的消息发布速率。这对于验证传感器是否稳定运作非常有用。执行下面两条指令即可评估RGB影像与点云集两者的刷新速度: ```bash $ rostopic hz /camera/rgb/image_raw $ rostopic hz /camera/depth/points ``` 上述操作可以帮助开发者快速定位潜在问题所在位置[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值