在Elevation Mapping中提取点云(x,y,z)数据

在Elevation Mapping中提取点云(x,y,z)数据

elevation mapping github:
https://github.com/ANYbotics/elevation_mapping
在使用过程图,希望对高程图中的点云数据进行进一步处理,或读取某个点的数值。

elevation mapping发布的topic

首先需要了解elevation mapping发布的topic
published topic

具体思路

由于这两个topic的数据类型没有区别,因此提取具体的点云数据的具体方式没有差别。只需要将GridMap格式转为pointcloud2格式即可,下面时具体步骤:
数据类型转换:

// 接收gridmap之后转换为pointcloud2
GridMapRosConverter::fromMessage(message, gridMap);
GridMapRosConverter::toPointCloud(gridMap, pointLayer, pointCloud);

pointcloud2类型提取xyz不是太方便,转换pointcloud2为pointcloud类型:

// pointcloud2转pointcloud,保存pcd那一步不存也可以
sensor_msgs::convertPointCloud2ToPointCloud(pointCloud, out_pointcloud);
pcl::fromROSMsg(pointCloud, cloud);
pcl::io::savePCDFileASCII ("/home/robot/dog_ws/gird_map_pcd_test.pcd", cloud);//保存pcd

接下来可以对每个点的xyz参数进行分析:

point.z = out_pointcloud.points[i].z;
point.x = out_pointcloud.points[i].x;
point.y = out_pointcloud.points[i].y;

代码

一段较为完整的代码如下:

#include "ros/ros.h"
#include "std_msgs/String.h"
#include "grid_map_core/GridMap.hpp"
#include "grid_map_demos/FiltersDemo.hpp"

#include "grid_map_ros/GridMapRosConverter.hpp"
#include "grid_map_ros/GridMapMsgHelpers.hpp"
#include <grid_map_cv/grid_map_cv.hpp>

// ROS
#include <sensor_msgs/point_cloud2_iterator.h>
#include <geometry_msgs/Point.h>
#include <geometry_msgs/Quaternion.h>
#include <rosbag/bag.h>
#include <rosbag/view.h>

// STL
#include <limits>
#include <algorithm>
#include <vector>

//pointcloud
#include <sensor_msgs/PointCloud.h>
#include <sensor_msgs/PointCloud2.h>
#include <sensor_msgs/point_cloud_conversion.h>

//pcl point

#include<pcl/point_cloud.h>
#include<pcl_conversions/pcl_conversions.h>
#include<pcl/io/pcd_io.h>
using namespace grid_map;
void chatterCallback(const grid_map_msgs::GridMap& message)
{
     //ROS_INFO("%f",message->data.std_msgs.Float32MultiArray.float32());

     // Convert message to map.
     GridMap gridMap;
     std::string pointLayer = ("elevation", "upper_bound", "lower_bound") ;
     sensor_msgs::PointCloud2 pointCloud;
     sensor_msgs::PointCloud out_pointcloud;
     pcl::PointCloud<pcl::PointXYZ> cloud;
     


     GridMapRosConverter::fromMessage(message, gridMap);
     GridMapRosConverter::toPointCloud(gridMap,
                                       pointLayer,
                                       pointCloud);
     sensor_msgs::convertPointCloud2ToPointCloud(pointCloud, out_pointcloud);



     pcl::fromROSMsg(pointCloud, cloud);
     pcl::io::savePCDFileASCII ("/home/robot/dog_ws/gird_map_pcd_test.pcd", cloud);//保存pcd



     //ROS_INFO_STREAM(out_pointcloud);
     for(int i = 0 ; i < out_pointcloud.points.size(); ++i){    
         geometry_msgs::Point32 point;

         //Do something here
         point.z = out_pointcloud.points[i].z;
         point.x = out_pointcloud.points[i].x;
         point.y = out_pointcloud.points[i].y;
         //可以在下面进行你需要的操作
         // ...
         // ...            
 }
 
int main(int argc, char **argv)
{
     ros::init(argc,argv,"map");
     ros::NodeHandle n;
     ros::Subscriber sub = n.subscribe("/elevation_mapping/elevation_map",1000,chatterCallback); //订阅的topic
     ros::spin();
 
     return 0;
 }

补充内容

备注:使用时除了在省略号中补全你需要进行的操作外,还需要注意配置cmakelist那个文件,之后编译
以下是需要加的部分:

1.
add_executable(
  map
  src/Map.cpp
)
2.
target_link_libraries(
  map
  ${catkin_LIBRARIES}
)
  • 7
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值