ros2编写pcl节点加载pcd文件

news2024/11/15 16:29:31

初次学习ros2和pcl,尝试在ros2中创建节点,加载pcd文件,并在rviz中进行可视化,记录一下整个过程。

编辑环境

ubuntu20.04 + ros2_foxy

创建节点

mkdir -p proj_ws_pcl/src #创建工程文件夹
cd proj_ws_pcl/src #创建源码文件夹
ros2 pkg create --build-type=ament_cmake --node-name reg_pcl # 创建节点

创建好后,文件目录工程如下

proj_ws_pcl
└── src
    └── pcl_reg
        ├── CMakeLists.txt
        ├── include(可选)
        │   └── pcl_reg
        ├── package.xml
        └── src
            ├── other.txt
            ├── pt_show.cpp(可选)
            └── reg_pcl.cpp

编辑代码

修改pcl_reg/src/reg_pcl.cpp代码

#include <iostream>
#include <chrono>
#include <memory>
#include <rclcpp/rclcpp.hpp>
#include <sensor_msgs/msg/point_cloud2.hpp>
#include "pcl_conversions/pcl_conversions.h"
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>

// typedef pcl::PointXYZRGB PointType;
using namespace std::chrono_literals;

class PointCloudPublisher : public rclcpp::Node
{
public:
  PointCloudPublisher() : Node("point_cloud_publisher")
  {
    count = 2133;
    // 创建一个Publisher,发布PointCloud2消息到名为"pt"的topic
    publisher_ = this->create_publisher<sensor_msgs::msg::PointCloud2>("pt", 10);

    // 创建一个定时器,每秒钟发布一次PointCloud2消息  std::chrono::seconds(1)
    timer_ = this->create_wall_timer(1s, std::bind(&PointCloudPublisher::publishPointCloud, this));
  }

private:
  void publishPointCloud()
  {
    // 创建一个PointCloud对象
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
  
    // 填充PointCloud数据(此处仅为示例)
    // 从PCD文件中加载点云数据
    
    std::string path_pcd = "/home/liangwx/proj_ws/src/gimbal/RAW_POINTCLOUD_20240509_165837.444_cut.pcd";
    // std::string path_pcd = "/path/to/point_cloud_name"+std::to_string(count)+".pcd";
    if (pcl::io::loadPCDFile<pcl::PointXYZRGB>(path_pcd, *cloud) == -1)
    {
        PCL_ERROR("Failed to load PCD file\n");
        // return;
    }
    count++;
    RCLCPP_INFO(this->get_logger(), "Publishing: '%d'", count);
    // 创建一个PointCloud2消息
    sensor_msgs::msg::PointCloud2::UniquePtr cloud_msg(new sensor_msgs::msg::PointCloud2);
    pcl::toROSMsg(*cloud, *cloud_msg);
    cloud_msg->header.frame_id = "base_link";  // 设置坐标系

    // 设置PointCloud2消息的时间戳
    cloud_msg->header.stamp = this->now();

    // 发布PointCloud2消息到"pt"的topic
    publisher_->publish(std::move(cloud_msg));
  }

  /// @brief 
  int count;
  rclcpp::Publisher<sensor_msgs::msg::PointCloud2>::SharedPtr publisher_;
  rclcpp::TimerBase::SharedPtr timer_;
};

int main(int argc, char** argv)
{
  //  读取点云点云序列并发布名为pt的topic,然后使用rviz2订阅pt并可视化
  rclcpp::init(argc, argv);
  auto node = std::make_shared<PointCloudPublisher>();
  rclcpp::spin(node);
  rclcpp::shutdown();
  // 读取单个点云
  // pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);
  // int count = 2133;
  // std::string path_pcd = "/home/apollo/zr/code/dataset_sim_gazebo/point_cloud"+std::to_string(count)+".pcd";
  // if (pcl::io::loadPCDFile<pcl::PointXYZRGB>(path_pcd, *cloud) == -1)
  // {
  //     PCL_ERROR("Failed to load PCD file\n");
  //     // return;
  // }
  return 0;
}

编辑CMakeList.txt文件

cmake_minimum_required(VERSION 3.5)
project(pcl_reg)

# Default to C99
if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()

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

# find dependencies
find_package(ament_cmake REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)

#########################################################
# 寻找依赖库(标准库)
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(sensor_msgs REQUIRED)

# 寻找依赖库(外部库)
find_package(Eigen3 REQUIRED)
# 针对PCL库版本不适配会出现warning,做的取消注释,其实没有解决问题,真正补丁在pcl的github的4431,如果不用补丁需要升级pcl的版本为1.12.我使用的是1.8版本会报错
if(NOT DEFINED CMAKE_SUPPRESS_DEVELOPER_WARNINGS)
  set(CMAKE_SUPPRESS_DEVELOPER_WARNINGS 1 CACHE INTERNAL "No dev warnings")
endif()
find_package(PCL REQUIRED)
find_package(rviz2 REQUIRED)
# find_package(OpenCV 3.2.0  REQUIRED)

# 添加包含路径
include_directories(
  /usr/include
  ${EIGEN3_INCLUDE_DIRS}
  ${PCL_INCLUDE_DIRS}
  ${RVIZ2_INCLUDE_DIRS}
  # ${OpenCV_INCLUDE_DIRS}
)

# 添加可执行文件
add_executable(reg_pcl src/reg_pcl.cpp)
ament_target_dependencies(reg_pcl rclcpp sensor_msgs)
target_link_libraries(reg_pcl
  ${PCL_LIBRARIES}
  # ${OpenCV_LIBS}
)

#########################################################
#add_executable(reg_pcl src/reg_pcl.cpp)
target_include_directories(reg_pcl PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>)

install(TARGETS reg_pcl
  DESTINATION lib/${PROJECT_NAME})

#####################################################

install(TARGETS 
  reg_pcl 
  # pt_show
  EXPORT export_${PROJECT_NAME}
  DESTINATION lib/${PROJECT_NAME})

#####################################################

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # uncomment the line when a copyright and license is not present in all source files
  #set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # uncomment the line when this package is not in a git repo
  #set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

编译运行

在proj_ws_pcl目录下进行编译

编译代码

cd ..
colcon build

运行节点

source install/setup.bash 
ros2 run pcl_reg reg_pcl

可视化点云

rviz2

在这里插入图片描述

参考链接

https://blog.csdn.net/sinat_21699465/article/details/132567374

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1696472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

社交媒体数据恢复:绿洲

本教程将向您展示如何在绿洲平台上备份和恢复数据&#xff0c;但不涉及推荐任何具体的数据恢复软件。 一、绿洲平台数据备份 为了确保数据的安全&#xff0c;在日常使用过程中&#xff0c;我们需要定期备份绿洲平台上的数据。以下是备份绿洲平台数据的步骤&#xff1a; 登录绿…

opencv进阶 ——(四)图像处理之去高光

去高光步骤&#xff1a; 1、转换成灰度图 2、二值化图像&#xff0c;得到高光区域 3、进行膨胀操作&#xff0c;放大高光区域&#xff0c;以此得到高光蒙版 4、通过illuminationChange函数对高光区域消除高光

Vite + Vue3 部署 GitHub

因为静态资源是可以部署到 GitHub 上&#xff0c;自己顺便学习部署网站 因为我使用的是 Vite 工具&#xff0c;官方有提供相应 Demo 部署静态站点 | Vite 官方中文文档 新建文件夹 .github 然后再建一个文件夹 workflows 新建文件 main.yml 文件 直接使用官方文档 demo #…

携手AI,如何共赢未来?

5/25日参加了一个培训分享会&#xff0c;由博奥研究院、武汉博奕咨询和华工科技联合举办&#xff0c;主题是“携手Ai&#xff0c;共赢未来”。 抱着跟书友线下交流的心态我参与了&#xff0c;参与前我对博奥做了基础了解&#xff0c;他们跟工信部考试和教育中心有合作&#x…

区间预测 | Matlab实现DNN-KDE深度神经网络结合核密度估计多置信区间多变量回归区间预测

区间预测 | Matlab实现DNN-KDE深度神经网络结合核密度估计多置信区间多变量回归区间预测 目录 区间预测 | Matlab实现DNN-KDE深度神经网络结合核密度估计多置信区间多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现DNN-KDE深度神经网络结合…

Textual for Mac:轻量级IRC客户端

在寻找一款高效、轻量级的IRC客户端时&#xff0c;Textual for Mac无疑是你的不二之选。它集成了众多现代技术&#xff0c;如本机IPv6、最新的IRCv3规范&#xff0c;以及客户端证书身份验证&#xff0c;让你的聊天体验更加顺畅和安全。 Textual for Mac v7.2.2免激活版下载 Tex…

Soybean Admin:一款高效、现代化的后台管理模板探索

随着前端技术的快速发展&#xff0c;越来越多的开发者开始寻求使用最新技术栈来构建高效、用户友好的后台管理系统。Soybean Admin作为一款基于Vue3、Vite5、TypeScript、Pinia、NaiveUI和UnoCSS等前沿技术的后台管理模板&#xff0c;为我们提供了一个全新的解决方案。本文将深…

SWM320系列应用

一、Swm320系列 SPI 应用 现象&#xff1a;应用SWM320的SPI1的模式0作为从机&#xff0c;整体产品硬件平台同步上电&#xff0c;从机的SPI无法正常工作&#xff0c;进不了中断&#xff0c;手工复位一次或连接SWD调试就正常了&#xff0c;这样的情况应该怎么解决&#xff1f;其…

Next.js里app和pages文件夹的区别

最近开始学 Next.js&#xff0c;因为纯自学&#xff0c;有时候网上找到的学习资料都是几年前的&#xff0c;难免会有点 outdated&#xff0c;因此当自己创建的项目结构和视频里呈现的结构不一致时&#xff0c;难免会有点困惑。 例如&#xff0c;今天遇到的第一个问题就是&…

企业如何正确地利用LLM大模型?

大型语言模型 (LLM) 不值得信任。就是这样。 考虑到它们先进的 AI 能力以及当今强大的基础模型的普遍知识&#xff0c;这似乎是一件令人惊讶的事情。然而&#xff0c;问题的关键在于 LLM 无法解释其输出。你不能信任 LLM 的结果&#xff0c;不是因为它不准确&#xff0c;而是因…

(南京观海微电子)——MCU屏介绍

MCU-LCD屏与RGB-LCD屏主要区别在于显存的位置&#xff1a; RGB-LCD的显存是由系统内存充当的&#xff0c;因此其大小只受限于系统内存的大小&#xff0c;这样RGB-LCD可以做出较大尺寸&#xff0c;像现在4.3只能算入门级&#xff0c;而MID中7、10的屏都开始大量使用。 MCU-L…

window好用的网速工具

这是一个用于显示当前网速、CPU及内存利用率的桌面悬浮窗软件&#xff0c;并支持任务栏显示&#xff0c;支持更换皮肤。 github链接如下 https://github.com/zhongyang219/TrafficMonitor?tabreadme-ov-file

Spring MVC+mybatis 项目入门:旅游网(一)项目创建与准备

个人博客&#xff1a;Spring MVCmybatis 项目入门:旅游网&#xff08;一&#xff09;项目创建与准备 | iwtss blog 先看这个&#xff01; 这是18年的文章&#xff0c;回收站里恢复的&#xff0c;现阶段看基本是没有参考意义的&#xff0c;技术老旧脱离时代&#xff08;2024年辣…

解密Spring Boot Starter与自动配置:探秘神奇的背后

starter可以理解为Spring Boot中的一站式集成启动器&#xff0c;包含了一系列可以集成到应用中的依赖项&#xff0c;可以快递集成spring组件及其框架&#xff0c;而不需要到处找示例代码。 一、为什么要用starter&#xff1f; 在springboot还没有出来之前&#xff0c;我们使用…

白嫖的在线工具类宝藏网站清单,快点击进来收藏一波

简单整理了一下自己日常经常使用的10个免费工具网站&#xff0c;建议点赞关注收藏&#xff0c;快点分享给小伙伴们&#xff01; 1.奶牛快传:用户体验更好的网盘工具。 https://cowtransfer.com/ 今年开始使用的一款网盘工具&#xff0c;和百度网盘类似,叫奶牛快传&#xff0c;如…

实现地图上展示坐标时,不要全部展示、只展示几个距离相对较大marker点位,随着地图放大再全部展示出来。

比例尺级别地面分辨率 &#xff08;米/像素&#xff09;比例尺0156543.031&#xff1a;591658700.82178271.5151&#xff1a;295829350.4239135.75751&#xff1a;147914675.2319567.878751&#xff1a;73957337.649783.9393751&#xff1a;36978668.854891.9696881&#xff1a…

2024年5月LLM最新排名:GPT-4o出道即巅峰!国内3个大模型榜上有名!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…