11.2 PCL从ROS获取激光雷达的点云数据及处理

这部分内容结合了前面的内容。其实很简单,分三步走就可以:首先是通过ROS打开激光雷达,查看PCL配置需要的信息。然后是用PCL通过ROS发布的topic获取激光雷达的数据。最后将ROS和PCL结合。

实现上面两步的前提是我们已经部署好了ROS环境及PCL环境,具体操作如下:

一、通过ROS打开激光雷达

首先需要搭建好打开激光雷达的环境,这部分内容可以参照以下博址:

4.livox hap(大疆激光雷达)环境搭建_livox hap激光雷达-CSDN博客,然后根据该博址运行

source ../../devel/setup.sh
roslaunch livox_ros_driver2 rviz_HAP.launch

运行成功后得到界面如下:

上面代码和图在以上博址有。在这个图片里我们注意两个地方:

一是记住左栏第二行的Fixed Frame后的livox_frame;二是记住左栏发布的Topic后的/livox/lidar,这两个内容是后面PCL读取数据需要的。在这里,打开雷达的环境就配置好了。

二、用PCL通过ROS发布的topic获取激光雷达的数据

PCL的详细运用可以看博址:,在这里,直接写读取激光雷达数据的步骤(和博址有略微的差别)。

1、在home下新建文件夹

mkdir -p ~/catkin_ws/src

2、进入src文件夹并初始化

cd ~/catkin_ws/src
catkin_init_workspace

执行完该命令后,src目录下会多出一个 CMakeLists.txt 文件,这个文件一般不需要我们修改。

3、 返回到catkin_ws下,进行编译(注意:每次编译必须在这个ws工作空间下才能编译成功!)

cd ~/catkin_ws/
catkin_make

执行完该命令后,发现工作空间catkin_ws中有三个目录: build devel src。可以从5、看到它们的作用。

4、source一下将工作空间加入环境变量

source devel/setup.bash

注意: 这一步只重新加载了setup.bash文件。如果关闭并打开一个新的命令行窗口,也需要再输入该命令将得到同样的效果。

所以建议采用一劳永逸的方法:.

5、.bashrc文件在用户的home文件夹(/home/USERNAME/.bashrc)下。每次用户打开终端,这个文件会加载命令行窗口或终端的配置。所以可以添加命令或进行配置以方便用户使用。在bashrc文件添加source命令:

echo "source ~/catkin_ws/devel/setup.bash">> ~/.bashrc

或者也可以打开.bashrc文件采用手动修改的方式添加source ~/catkin_ws/devel/setup.bash:

gedit ~/.bashrc

添加完毕,你的bashrc文件应该有两句source:

添加完后,在 .bashrc的同目录下运行

~/.bashrc

5、理解工作空间

工作空间结构:

源空间(src文件夹),放置了功能包、项目、复制的包等。在这个空间中,,最重要的一个文件是CMakeLists.txt。当在工作空间中配置包时,src文件夹中有CMakeLists.txt因为cmake调用它。这个文件是通过catkin_init_workspace命令创建的。

编译空间(build space):在build文件夹里,cmake和catkin为功能包和项目保存缓存信息、配置和其他中间文件。

开发空间(Development(devel)space):devel文件夹用来保存编译后的程序,这些是无须安装就能用来测试的程序。一旦项目通过测试,就可以安装或导出功能包从而与其他开发人员分享。

一、创建节点发布点云数据并可视化

1、在ros工作空间的src目录下新建包(包含依赖项)

catkin_create_pkg chapter10_tutorials pcl_conversions pcl_ros pcl_msgs sensor_msgs

2、在软件包中新建src目录

rospack profile
roscd chapter10_tutorials
mkdir src

3、在src目录下新建pcl_write.cpp,topic为"/livox/lidar"发布。frame设为livox_frame(这两个信息是从第一步得到的)。

**注意:**以下代码也有个地方要改为/livox/lidar,在这里已经修改好了,如果你们的topic不同,则自己需要修改。

#include <ros/ros.h>
#include <pcl/point_cloud.h>
#include <pcl_conversions/pcl_conversions.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl/io/pcd_io.h>
 
void cloudCB(const sensor_msgs::PointCloud2 &input)
{
    pcl::PointCloud<pcl::PointXYZ> cloud;
    pcl::fromROSMsg(input, cloud);
    pcl::io::savePCDFileASCII ("0.pcd", cloud);
}
 
main (int argc, char **argv)
{
    ros::init (argc, argv, "pcl_write");
    ros::NodeHandle nh;
    ros::Subscriber bat_sub = nh.subscribe("/livox/lidar", 10, cloudCB);
    ros::spin();
 
    return 0;
}

4、修改cmakelist.txt内容

cmake_minimum_required(VERSION 2.8.3)
project(chapter10_tutorials)
find_package(catkin REQUIRED COMPONENTS
  pcl_conversions
  pcl_ros
  roscpp
  sensor_msgs
  rospy
)
 
find_package(PCL REQUIRED)
catkin_package()
 
include_directories(
  ${catkin_INCLUDE_DIRS}
  ${PCL_INCLUDE_DIRS}
)
 
link_directories(${PCL_LIBRARY_DIRS})
 
 
add_executable(pcl_write src/pcl_write.cpp)

target_link_libraries(pcl_write ${catkin_LIBRARIES} ${PCL_LIBRARIES})

5、进入工作空间编译包

cd ~/catkin_ws
catkin_make --pkg chapter10_tutorials

三、将ROS和PCL结合

1、若编译成功,新窗口打开ros

roscore

2.打开新窗口再次运行第一步的代码打开激光雷达

source ../../devel/setup.sh
roslaunch livox_ros_driver2 rviz_HAP.launch

3.再打开个新窗口运行pcl_write.cpp

roscd chapter10_tutorials && rosrun chapter10_tutorials pcl_write

4.可视化

rviz

**注意:**若打开后没有雷达返回的数据,则将左栏的设置为第一步的信息。

相关推荐
knighthood20012 天前
ros中仿真编写launch时robot_state_publisher,output参数
c++·ubuntu·ros
新手小白勇闯新世界2 天前
论文阅读(一种基于球面投影和特征提取的岩石点云快速配准算法)
论文阅读·点云·配准·icp·特征提取
Mr.Winter`3 天前
路径规划 | ROS中多个路径规划算法可视化与性能对比分析
人工智能·算法·机器人·自动驾驶·ros·ros2·路径规划
辰风已久7 天前
ROS(快速初步入门)
ros
wait,what?9 天前
【ROS概述】C++运行hello world
机器人·ros
Deepcong9 天前
3D点云与2D图像的相互转换:2D图像对应像素的坐标 转为3D空间的对应坐标
c++·目标跟踪·点云·2d转3d
PHP代码9 天前
entwine 和 conda环境下 使用和踩坑 详细步骤! 已解决
服务器·conda·点云
wait,what?9 天前
【ROS概述】解决主机和虚拟机共享剪贴板的问题
ros
kuan_li_lyg10 天前
SolidWorks 导出 URDF 中的惯性矩阵错误问题
开发语言·人工智能·机器人·ros·urdf·solidworks
wait,what?11 天前
【ROS概述】概念及环境搭建
机器人·ros