赞
踩
RVIZ是一款配合ROS2进行点云可视化的工具,可以通过ROS2的消息机制和节点进行通信,从而显示节点传递的点云信息。
首先建立功能包
ros2 pkg create point_cloud_show --build-type ament_cmake --dependencies rclcpp pcl_ros pcl_conversions sensor_msgs
随后编写节点文件
#include <iostream> #include <memory> #include <string> #include "rclcpp/rclcpp.hpp" #include "sensor_msgs/msg/point_cloud.hpp" #include "pcl_conversions/pcl_conversions.h" #include <pcl/point_types.h> #include <pcl/io/pcd_io.h> class PointCloudShow: public rclcpp::Node { public: PointCloudShow(const std::string & file_name): Node("point_cloud_show") { publisher_ = this->create_publisher<sensor_msgs::msg::PointCloud2>("point_cloud_topic", 10); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); if(pcl::io::loadPCDFile<pcl::PointXYZ>(file_name, *cloud) == -1) { PCL_ERROR("无法读取文件 %s\n", file_name.c_str()); } sensor_msgs::msg::PointCloud2 cloud_msg; pcl::toROSMsg(*cloud, cloud_msg); cloud_msg.header.frame_id = "point_cloud_frame"; publisher_->publish(cloud_msg); } private: rclcpp::Publisher<sensor_msgs::msg::PointCloud2>::SharedPtr publisher_; }; int main(int argc, char * argv[]) { if(argc<2) { std::cerr << "请在节点后输入要显示的pcd文件地址!" << std::endl; return 1; } rclcpp::init(argc, argv); auto node = std::make_shared<PointCloudShow>(argv[1]); rclcpp::spin(node); rclcpp::shutdown(); return 0; }
在CMakeList.txt文件中添加如下内容
# 生成可执行文件
add_executable (point_cloud_show src/point_cloud_show.cpp)
# 配置可执行文件的依赖项
ament_target_dependencies(point_cloud_show
rclcpp
pcl_ros
pcl_conversions
sensor_msgs)
# 将可执行文件写入路径
install(TARGETS
point_cloud_show
DESTINATION lib/${PROJECT_NAME})
回到工作空间下,编译功能包
colcon build --packages-select point_cloud_show
打开rviz2
ros2 run rviz2 rviz2
在发布消息的节点中,需要留意三个数据
1 话题名称
2 坐标系名称(frame_id)
会在节点中进行设置,其在点云的 header 数据单元中
Cloud->header->frame_id
3 点数的数据格式
ROS2中的点云有三种格式
PointCloud2
PointField
PointCloud
每种格式对应的转换代码都不同,进行点云格式转换时需要留意
关注左边栏,Fixed_Frame中填写坐标系名称
之后点击左下角的Add,添加需要现实的点云数据类型
添加之后,写入自己的话题名称
注意话题必须以 / 开头,不知道自己话题的话,可以通过 ros2 topic list 查询
之后运行节点,发布消息即可看到点云模型
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。