目录
序言
本文适用于ros下的PCL使用,在学完ros基础课程(古月居或赵须左老师的课程)后,作者自己学习PCL的随记,希望能找到志同道合的伙伴一起学习、分享经验。
本文默认已经提前安装好pcl库及相关依赖,不再演示安装和配置相关操作
PCL官方学习链接:pointclouds.org/
一、在工作空间下创建功能包
1.创建工作空间
mkdir -p pcl_ws/src
cd pcl_ws
catkin_make
这一步操作是基础的操作,熟能生巧。
2.使用VScode进行配置
cd pcl_ws
code .
进入之后 Ctrl+Shift+P 修改tasks.json文件,设置成ros环境,可以将下列代码直接替换原代码:
{ // 有关 tasks.json 格式的文档,请参见 // https://go.microsoft.com/fwlink/?LinkId=733558 "version": "2.0.0", "tasks": [ { "label": "catkin_make:debug", //代表提示的描述性信息 "type": "shell", //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行 "command": "catkin_make",//这个是我们需要运行的命令 "args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2” "group": {"kind":"build","isDefault":true}, "presentation": { "reveal": "always"//可选always或者silence,代表是否输出信息 }, "problemMatcher": "$msCompile" } ] }
然后在src目录下新建功能包,名字“pcl_01”;回车添加依赖:
roscpp pcl_conversions pcl_ros pcl_msgs sensor_msgs
回车创建完成,在功能包的src目录下新建.cpp文件命名为:“pcl_create.cpp”。
3.编写第一个点云入门程序
#include <ros/ros.h>
#include <pcl/point_cloud.h>
#include <pcl_conversions/pcl_conversions.h>
#include <sensor_msgs/PointCloud2.h>
#include <pcl_ros/point_cloud.h>
int main (int argc, char *argv[])
{
/* code */
//初始化ros节点
ros::init (argc,argv,"pcl_create");
ros::NodeHandle nh;
ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> ("pcl_output",1);
pcl::PointCloud<pcl::PointXYZ> cloud;
sensor_msgs::PointCloud2 output;
//编辑点云数据
cloud.width = 100;
cloud.height = 1;
cloud.points.resize(cloud.width * cloud.height);
for(size_t i=0; i<cloud.points.size (); i++)
{
cloud.points[i].x = 1024*rand() / (RAND_MAX+1.0f);
cloud.points[i].y = 1024*rand() / (RAND_MAX+1.0f);
cloud.points[i].z = 1024*rand() / (RAND_MAX+1.0f);
}
//转换成ros的消息类型
pcl::toROSMsg(cloud, output);
output.header.frame_id = "odom";
ros::Rate loop_rate(1);
while (ros::ok())
{
pcl_pub.publish(output);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}
代码功能是创建ros节点和包含100点的点云,并且发布话题。
4.修改CmakeLists.txt文件
cmake_minimum_required(VERSION 3.0.2) project(pcl_01) find_package(catkin REQUIRED COMPONENTS pcl_conversions pcl_ros roscpp sensor_msgs ) add_executable(pcl_create src/pcl_create.cpp) add_dependencies(pcl_create ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) target_link_libraries(pcl_create ${catkin_LIBRARIES} )
二、运行程序
1.启动功能包
开启一个终端,启动roscore
source ./devel/setup.bash
roscore
再新开一个终端,启动程序
rosrun pcl_01 pcl_create
2.启动rviz查看
rviz
在rviz里面, Fixed Frame 选择“odom”(不知道什么原因,我操作的时候下拉选项没有“odom”这个选项,后面直接手打上去的)。
添加一个PointCloud2,选择topic为“/pcl_output”
最后显示结果如下即为成功。
总结
网络上很多pcl的教学,但是在ros下使用的教程并不丰富,刚开始创建功能包甚至不知道需要哪些依赖项,反正“只要功夫深,铁杵磨成针”,发表这些文章的目的主要是想找到一起学习的小伙伴,大家一起讨论、一起成长。
接下来我会发布一系列关于pcl的学习博客,如果对你有帮助,请点赞收藏,防止迷路~