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 相机三维点云数据的获取与解析。

相关推荐
hhhjhl1 天前
Undici 跨端三方库仓颉适配全流程
java·开发语言·ubuntu
LCG米1 天前
STM32硬件SPI驱动SSD1306 OLED实测:上电黑屏排查、页寻址模式与取模扫描方向陷阱
stm32·单片机·嵌入式硬件·嵌入式
~城南花已开~1 天前
Intel E810 SR-IOV VF Spoofcheck 防伪造测试-KVM3
服务器·网络·笔记·学习·ubuntu·etl工程师
探鸽小钛1 天前
4G 终端 ES8311 - 挂断一次,下次说话就没声了之解决办法
物联网·音视频·嵌入式·esp32·webrtc
十年磨一剑~1 天前
APT 仓库包查看方法文档
linux·ubuntu
技术小事1 天前
Surface 装 Ubuntu 双系统
linux·运维·ubuntu
五块钱的方便面2 天前
ubuntu下networkmanager不让管理解决办法
linux·运维·ubuntu
轻口味2 天前
启元无真机二开实战1:54 个接口能做什么、不能做什么——启元 Q1/T1 SDK 能力全景与版本矩阵
线性代数·矩阵·ros2·具身智能·启元机器人
根目录下的猫2 天前
ArkTS 代码中如何添加作者信息
linux·运维·ubuntu
haermosi2 天前
Ubuntu 下 Flameshot 截图一直闪屏,已找到问题并解决
linux·ubuntu·gnome·问题排查·flameshot·linux 使用记录