ROS2 Humble 开发专栏---ROS2 三维视觉应用(1)---RGB-D 相机三维点云数据获取实验---适配Ubuntu 22.04

🎬 渡水无言个人主页渡水无言

专栏传送门 : 《linux专栏》《嵌入式linux驱动开发》《linux系统移植专栏》

专栏传送门 : 《freertos专栏》 《STM32 HAL库专栏》《linux裸机开发专栏

专栏传送门《产品测评专栏》 《Ai智能体专栏) 《ROS开发专栏

⭐️流水不争先,争的是滔滔不绝

📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生

| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生

在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连

目录

前言

一、实验原理与通信架构

[二、新建三维视觉功能包 pc_pkg](#二、新建三维视觉功能包 pc_pkg)

三、编写点云数据获取节点源码

[四、配置 CMakeLists.txt](#四、配置 CMakeLists.txt)

[五、配置 package.xml](#五、配置 package.xml)

六、编译与仿真运行

6.1、编译功能包

6.2、运行实验

总结


前言

前几期博客我们学习了 ROS2二维图像视觉应用,完成了图像获取、颜色识别、目标跟随、人脸检测等功能。

但二维图像缺少空间距离、高度、三维位置信息,无法满足机器人避障、物体抓取、环境三维重建等高级需求。

本期博客我们开始进入ROS2 三维视觉应用 学习,依托 Kinect V2 RGB-D 深度相机,结合PCL 点云库,实现三维点云数据订阅、格式转换、坐标解析,为后续平面分割、物体检测、三维定位打下基础。


一、实验原理与通信架构

仿真机器人搭载 Kinect V2 RGB-D相机,相机驱动节点会持续发布三维点云话题:

话题名称:/kinect2/sd/points。

消息类型:sensor_msgs/PointCloud2。

本实验编写订阅者节点,流程如下:

订阅相机发布的 PointCloud2 点云话题。

将 ROS 标准点云格式转换为 PCL 可处理的 PointXYZ 格式。

遍历所有点云数据,解析每个点的三维坐标。

在终端打印每个点的 X、Y、Z 空间位置。

二、新建三维视觉功能包 pc_pkg

在工作空间 src 目录下,创建专门用于三维视觉、PCL 点云处理的功能包,打开终端,输入以下指令:

cpp 复制代码
cd ~/ros2_zice/src
ros2 pkg create pc_pkg

三、编写点云数据获取节点源码

pc_pkg/src 下新建 pc_data.cpp,完整代码如下:

cpp 复制代码
#include <rclcpp/rclcpp.hpp>
#include <sensor_msgs/msg/point_cloud2.hpp>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl_conversions/pcl_conversions.h>

std::shared_ptr<rclcpp::Node> node;

// 点云话题回调函数
void PointcloudCallback(const sensor_msgs::msg::PointCloud2::SharedPtr msg)
{
    // 定义PCL点云格式
    pcl::PointCloud<pcl::PointXYZ> pointCloudIn;
    // ROS点云格式转为PCL点云格式
    pcl::fromROSMsg(*msg, pointCloudIn);

    // 获取点云总点数
    int cloudSize = pointCloudIn.points.size();

    // 遍历所有三维点,打印坐标
    for (int i = 0; i < cloudSize; i++)
    {
        RCLCPP_INFO(node->get_logger(), 
            "[i= %d] ( %.2f , %.2f , %.2f )",
            i,
            pointCloudIn.points[i].x,
            pointCloudIn.points[i].y,
            pointCloudIn.points[i].z);
    }
}

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    // 创建点云数据节点
    node = std::make_shared<rclcpp::Node>("pointcloud_data_node");

    // 订阅Kinect三维点云话题
    auto pc_sub = node->create_subscription<sensor_msgs::msg::PointCloud2>(
        "/kinect2/sd/points",
        1,
        PointcloudCallback
    );

    // 循环监听话题
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

四、配置 CMakeLists.txt

打开 pc_pkg/CMakeLists.txt,添加编译规则与依赖,全部代码如下所示:

cpp 复制代码
cmake_minimum_required(VERSION 3.8)
project(pc_pkg)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# 查找依赖
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(sensor_msgs REQUIRED)
find_package(pcl_conversions REQUIRED)
find_package(pcl_ros REQUIRED)

# 编译节点
add_executable(pc_data src/pc_data.cpp)
ament_target_dependencies(pc_data
  rclcpp
  sensor_msgs
  pcl_conversions
  pcl_ros
)

# 安装可执行文件
install(TARGETS
  pc_data
  DESTINATION lib/${PROJECT_NAME}
)

ament_package()

五、配置 package.xml

添加功能包依赖声明,全部代码如下所示:

cpp 复制代码
<?xml version="1.0"?>
<package format="3">
  <name>pc_pkg</name>
  <version>0.0.0</version>
  <description>ROS2三维视觉PCL点云处理功能包</description>
  <maintainer email="todo@todo.todo">todo</maintainer>
  <license>Apache-2.0</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <depend>rclcpp</depend>
  <depend>sensor_msgs</depend>
  <depend>pcl_conversions</depend>
  <depend>pcl_ros</depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

六、编译与仿真运行

6.1、编译功能包

cpp 复制代码
cd ~/ros2_zice
colcon build --packages-select pc_pkg
source install/setup.bash

6.2、运行实验

1、启动Gazebo仿真

打开终端,输入以下指令:

cpp 复制代码
source install/setup.bash
ros2 launch wpr_simulation2 wpb_table.launch.py

如下图所示:

这一步会启动 Kinect 相机,开始发布点云话题 /kinect2/sd/points

2、运行点云获取节点

新开终端,输入以下指令:

cpp 复制代码
source install/setup.bash
ros2 run pc_pkg pc_data

运行后,终端会持续打印每个三维点的 (x, y, z) 坐标,说明三维视觉实验已经跑通啦!,如下图所示:


总结

本期博客实现了 RGB-D 相机三维点云数据的获取与解析。

相关推荐
刘国华-平价IT运维课堂1 小时前
Ubuntu 26.04 LTS 发布,研发与运维需要关注什么?
linux·运维·服务器·人工智能·ubuntu
bush410 小时前
嵌入式linux学习记录十,定时器
linux·嵌入式
BestOrNothing_201510 小时前
ROS2 话题通信实战:消息对象、Publisher 发布器与 Subscriber 订阅器保姆级教程
c++·ros2·subscriber·publisher·话题通信
北山有鸟11 小时前
用开发板的.config替换ubuntu中内核源码目录的.config
linux·运维·ubuntu
wait a minutes15 小时前
Ubuntu 升级后 NVIDIA 驱动修复指南
linux·运维·ubuntu
nnnnichijou17 小时前
Qt 6.9 嵌入式 Linux 交叉编译全栈填坑指南(以树莓派5 AArch64 为例
qt·嵌入式·交叉编译·qml·树莓派5
量子物理学19 小时前
ubuntu安装docker
ubuntu·docker·eureka
MIXLLRED19 小时前
随笔——在 Ubuntu 22.04 中查看 Markdown (.md) 文件
linux·运维·ubuntu·markdown
面向对象World21 小时前
Z8350 Broadcom SDIO网卡调试Ubuntu 22.04 Server版
linux·运维·ubuntu