【PCL】Ouster 和 Velodyne 激光雷达的 PCL 点云数据格式

【PCL】Ouster 和 Velodyne 激光雷达的 PCL 点云数据格式

0 news

Ouster 和 Velodyne 两公司合并。

在这里插入图片描述

1 Ouster

GitHub: Link

namespace ouster_ros {

struct EIGEN_ALIGN16 Point {
    PCL_ADD_POINT4D;
    float intensity;
    uint32_t t;
    uint16_t reflectivity;
    uint16_t ring;
    uint16_t ambient;
    uint32_t range;
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
};
}  // namespace ouster_ros

POINT_CLOUD_REGISTER_POINT_STRUCT(ouster_ros::Point,
    (float, x, x)
    (float, y, y)
    (float, z, z)
    (float, intensity, intensity)
    // use std::uint32_t to avoid conflicting with pcl::uint32_t
    (std::uint32_t, t, t)
    (std::uint16_t, reflectivity, reflectivity)
    (std::uint16_t, ring, ring)
    (std::uint16_t, ambient, ambient)
    (std::uint32_t, range, range)
)

2 Velodyne

GitHub: Link

namespace velodyne_pcl
{
struct PointXYZIRT
{
  PCL_ADD_POINT4D;                    // quad-word XYZ
  float         intensity;            ///< laser intensity reading
  std::uint16_t ring;                 ///< laser ring number
  float         time;                 ///< laser time reading
  EIGEN_MAKE_ALIGNED_OPERATOR_NEW     // ensure proper alignment
}
EIGEN_ALIGN16;
}  // namespace velodyne_pcl

POINT_CLOUD_REGISTER_POINT_STRUCT(velodyne_pcl::PointXYZIRT,
                                  (float, x, x)
                                  (float, y, y)
                                  (float, z, z)
                                  (float, intensity, intensity)
                                  (std::uint16_t, ring, ring)
                                  (float, time, time))

3 数据类型转换

下面的 demo 将 Ouster 点云数据类型转换为 pcl 内置的 pcl::PointXYZINormal

pcl::PointCloud<ouster_ros::Point> pl_orig;
pcl::PointCloud<pcl::PointXYZINormal> cloud_out;
pcl::fromROSMsg(*msg, pl_orig);
int plsize = pl_orig.size();
cloud_out.reserve(plsize);

double blind = 4; // 去除以雷达为中心的距离内的点云
for (int i = 0; i < pl_orig.points.size(); i++) {
    double range = pl_orig.points[i].x * pl_orig.points[i].x + pl_orig.points[i].y * pl_orig.points[i].y +
                   pl_orig.points[i].z * pl_orig.points[i].z;

    if (range < (blind * blind)) continue;

    pcl::PointXYZINormal added_pt;
    added_pt.x = pl_orig.points[i].x;
    added_pt.y = pl_orig.points[i].y;
    added_pt.z = pl_orig.points[i].z;
    added_pt.intensity = pl_orig.points[i].intensity;
    added_pt.normal_x = 0;
    added_pt.normal_y = 0;
    added_pt.normal_z = 0;
    added_pt.curvature = pl_orig.points[i].t / 1e6;  // 单位: ms

    cloud_out_.points.push_back(added_pt);
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
以下是一个简单的代码示例,用于将镭神C16输出的点云格式转换为Velodyne点云数据格式: ```c++ #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/point_cloud.h> int main () { // 读取镭神C16输出的点云数据 pcl::PointCloud<pcl::PointXYZI>::Ptr input_cloud (new pcl::PointCloud<pcl::PointXYZI>); pcl::io::loadPCDFile<pcl::PointXYZI> ("input_cloud.pcd", *input_cloud); // 创建Velodyne点云数据格式点云 pcl::PointCloud<pcl::PointXYZI>::Ptr output_cloud (new pcl::PointCloud<pcl::PointXYZI>); // 将镭神C16点云数据格式转换为Velodyne点云数据格式 for (size_t i = 0; i < input_cloud->points.size (); ++i) { pcl::PointXYZI point; point.x = input_cloud->points[i].x; point.y = input_cloud->points[i].y; point.z = input_cloud->points[i].z; point.intensity = input_cloud->points[i].intensity; point.ring = 0; // 需要计算或者赋值激光线束编号 point.timestamp = 0; // 需要计算或者赋值时间戳 output_cloud->points.push_back (point); } // 保存转换后的Velodyne点云数据格式PCD文件 pcl::io::savePCDFileASCII ("output_cloud.pcd", *output_cloud); return (0); } ``` 在上述代码中,首先使用`pcl::io::loadPCDFile`函数读取镭神C16输出的点云数据,然后使用`pcl::PointCloud`类创建Velodyne点云数据格式点云。接下来,使用循环遍历镭神C16点云数据格式的每一个点,将其转换为Velodyne点云数据格式,并添加所需的属性,如激光线束编号和时间戳。最后,使用`pcl::io::savePCDFileASCII`函数将转换后的Velodyne点云数据格式保存为PCD文件。需要注意的是,上述示例代码仅供参考,具体的实现可能需要根据实际情况进行调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

G.Chenhui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值