Ускорьте работу технологии лидарных облаков точек с помощью библиотеки облаков точек (PCL) на базе NVIDIA CUDA.
Ускорьте работу технологии лидарных облаков точек с помощью библиотеки облаков точек (PCL) на базе NVIDIA CUDA.

Предисловие

В этой статье мы покажем, как использовать CUDA-PCL для обработки облаков точек для достижения максимальной производительности. Поскольку PCL не может полностью использовать CUDA в Jetson, NVIDIA разработала несколько библиотек на основе CUDA с теми же функциями, что и PCL. Адрес кода: https://github.com/NVIDIA-AI-IOT/cuPCL.git (только динамические библиотеки и заголовочные файлы, автор сообщил, что исходный код в будущем будет открытым).

cuPCL содержит библиотеки для обработки облаков точек с использованием CUDA, а также примеры их использования. В проекте есть несколько подпапок, каждая из которых содержит: библиотеку, реализованную с помощью CUDA, и пример кода, который использует библиотеку и проверяет производительность и точность путем сравнения ее результатов с выводами PCL. Библиотека поддерживает Xavier, Orin. и Линукс х86.

Представление автора

Лэй Фан — старший инженер-программист CUDA в NVIDIA. В настоящее время он работает с китайской командой инженеров технической поддержки NVIDIA над разработкой решений для оптимизации производительности программного обеспечения с помощью CUDA.

Лили Ли, работает по связям с разработчиками в команде NVIDIA по робототехнике. В настоящее время она работает над разработкой робототехнических решений в экосистеме Jetson, помогая создавать лучшие практики.

Основное содержание

Многие пользователи Jetson выбирают LiDAR в качестве основного датчика для позиционирования и восприятия. LiDAR описывает пространственную среду вокруг автомобиля как набор трехмерных точек, называемых облаком точек. Облака точек сканируют поверхности окружающих объектов и имеют дальний радиус действия. Возможности высокой четкости. Характеристики точности делают его очень подходящим для расширенного восприятия препятствий, создания карт, алгоритмов позиционирования и планирования.

В этой статье представлена ​​CUDA-PCL 1.0. Здесь мы в основном представляем три библиотеки PCL с ускорением CUDA:

1.CUDA-ICP

2.CUDA-Segmentation

3.CUDA-Filter

CUDA-ICP

В итеративной ближайшей точке (ICP) целевое облако точек или облако опорных точек фиксируется, а исходные точки преобразуются для наилучшего соответствия опорной точке. Алгоритм итеративно вычисляет необходимую матрицу преобразования, чтобы минимизировать метрику ошибки, которая обычно представляет собой расстояние от исходной точки до облака опорных точек, например сумму квадратов разностей между совпадающими парами координат. ICP — один из широко используемых алгоритмов для выравнивания 3D-моделей с учетом исходной предполагаемой позы, необходимой для жесткого преобразования. Преимущества ICP включают результаты сопоставления с высокой точностью, высокую устойчивость к различным инициализациям и т. д. Однако он потребляет много вычислительных ресурсов. Чтобы улучшить производительность ICP на Jetson, NVIDIA выпустила ICP на основе CUDA, который может заменить исходную версию ICP в библиотеке облаков точек (PCL). Следующие примеры кода являются примерами CUDA-ICP. Этот класс может быть создан и cudaICP.icp() выполнен напрямую.

Язык кода:javascript
копировать
cudaICP icpTest(nPCountM, nQCountM, stream);
    icpTest.icp(cloud_source, nPCount,
            float *cloud_target, int nQCount,
            int Maxiterate, double threshold,
            Eigen::Matrix4f &transformation_matrix, stream);

ICP вычисляет матрицу преобразования между двумя облаками точек:

Язык кода:javascript
копировать
source(P)* transformation =target(Q)

Поскольку лидар предоставляет облако точек с фиксированным числом, мы можем получить максимальное количество точек. И nPCountM, и nQCountM используются для выделения кэша для ICP.

Язык кода:javascript
копировать
class cudaICP
{
public:
    /*       nPCountM and nQCountM are the maximum of count for input clouds.
       They are used to pre-allocate memory.
    */
    cudaICP(int nPCountM, int nQCountM, cudaStream_t stream = 0);
    ~cudaICP(void);
    /*
    cloud_target = transformation_matrix *cloud_source
    When the Epsilon of the transformation_matrix is less than threshold,
    the function returns transformation_matrix.
    Input:
        cloud_source, cloud_target: Data pointer for the point cloud.
        nPCount: Point number of the cloud_source.
        nQCount: Point number of the cloud_target.
        Maxiterate: Threshold for iterations.
        threshold: When the Epsilon of the transformation_matrix is less than
            threshold, the function returns transformation_matrix.
    Output:
        transformation_matrix
    */
    void icp(float *cloud_source, int nPCount,
            float *cloud_target, int nQCount,
            int Maxiterate, double threshold,
            Eigen::Matrix4f &transformation_matrix,
            cudaStream_t stream = 0);
    void *m_handle = NULL;
};

В таблице 2 показаны результаты сравнения производительности CUDA-ICP и PCL-ICP.

Состояние облака точек за два кадра до ICP

Состояние облака точек через два кадра после ICP

CUDA-Segmentation

Карта облака точек содержит множество наземных точек, что не только делает всю карту беспорядочной, но и усложняет классификацию, идентификацию и отслеживание последующих облаков точек препятствий, поэтому их необходимо сначала удалить. Удаление грунта может быть достигнуто посредством сегментации облака точек. Библиотека достигает этого с помощью подгонки консенсуса случайной выборки (Ransac) и нелинейной оптимизации. Ниже приведен пример кода для CUDA-сегментации. Сначала создайте экземпляр класса, инициализируйте параметры, а затем напрямую вызовите cudaSeg.segment, чтобы выполнить удаление грунта.

Язык кода:javascript
копировать
//Now Just support: SAC_RANSAC + SACMODEL_PLANE
  std::vectorindexV;
  cudaSegmentation cudaSeg(SACMODEL_PLANE, SAC_RANSAC, stream);
  segParam_t setP;
  setP.distanceThreshold = 0.01;
  setP.maxIterations = 50;
  setP.probability = 0.99;
  setP.optimizeCoefficients = true;
  cudaSeg.set(setP);
  cudaSeg.segment(input, nCount, index, modelCoefficients);
  for(int i = 0; i < nCount; i++)
  {
    if(index[i] == 1)
    indexV.push_back(i);
  }

CUDA-Segmentation сегментирует входные данные с помощью точек nCount с использованием некоторых параметров, index — это индекс входных данных, представляющий целевую плоскость, а modelCoefficients — группа коэффициентов плоскости.

Язык кода:javascript
копировать
typedef struct {
  double distanceThreshold;
  int maxIterations;
  double probability;
  bool optimizeCoefficients;
} segParam_t;
class cudaSegmentation
{
public:
    //Now Just support: SAC_RANSAC + SACMODEL_PLANE
    cudaSegmentation(int ModelType, int MethodType, cudaStream_t stream = 0);
    ~cudaSegmentation(void);
    /*
    Input:
        cloud_in: Data pointer for point cloud
        nCount: Count of points in cloud_in
    Output:
        Index: Data pointer that has the index of points in a plane from input
      modelCoefficients: Data pointer that has the group of coefficients of the plane
    */
    int set(segParam_t param);
    void segment(float *cloud_in, int nCount,
            int *index, float *modelCoefficients);
private:
    void *m_handle = NULL;
};

В таблице 3 показано сравнение производительности CUDA-сегментации и PCL-сегментации.

На рисунках 3 и 4 показаны необработанные данные облака точек, за которыми следует обработанная версия, в которой сохраняются только облака точек, связанные с препятствиями. Этот пример типичен для обработки облаков точек, включая удаление грунта, удаление некоторых облаков точек и извлечение объектов, а также кластеризацию некоторых облаков точек.

Рисунок 3. Исходное облако точек CUDA-сегментации.

Рисунок 4. Облако точек, обработанное с помощью CUDA-сегментации.

CUDA-Filter

Фильтрация — одна из наиболее важных операций предварительной обработки перед обработкой облаков точек для сегментации, обнаружения и распознавания. Ограничения координат облака точек могут быть достигнуты посредством фильтрации, прямой фильтрации осей X, Y и Z облака точек. Фильтрация облака точек может ограничивать только ось Z или три оси координат X, Y и Z. CUDA-Filter в настоящее время поддерживает только PassThrough, но в будущем будет поддерживаться больше методов. Ниже приведен пример кода для примера CUDA-Filter, который создает экземпляр класса, инициализирует параметры, а затем напрямую вызывает функцию cudaFilter.filter.

Язык кода:javascript
копировать
cudaFilter filterTest(stream);
  FilterParam_t setP;
  FilterType_t type = PASSTHROUGH;
  setP.type = type;
  setP.dim = 2;
  setP.upFilterLimits = 1.0;
  setP.downFilterLimits = 0.0;
  setP.limitsNegative = false;
  filterTest.set(setP);
  filterTest.filter(output, &countLeft, input, nCount);

CUDA-Filter использует параметры для фильтрации входных точек nCount, а затем после фильтрации с помощью CUDA выводит результаты с точками countLeft.

Язык кода:javascript
копировать
typedef struct {
    FilterType_t type;
    //0=x,1=y,2=z
    int dim;
    float upFilterLimits;
    float downFilterLimits;
    bool limitsNegative;
} FilterParam_t;
class cudaFilter
{
public:
    cudaFilter(cudaStream_t stream = 0);
    ~cudaFilter(void);
    int set(FilterParam_t param);
    /*
    Input:
        source: data pointer for point cloud
        nCount: count of points in cloud_in
    Output:
        output: data pointer which has points filtered by CUDA
        countLeft: count of points in output
    */
    int filter(void *output, unsigned int *countLeft, void *source, unsigned int nCount);
    void *m_handle = NULL;
};

В Таблице 4 показано сравнение производительности CUDA-Filter и PCL-Filter.

На рисунках 5 и 6 показаны примеры фильтров PassThrough с ограничениями по оси X.

Рисунок 6. Исходное облако точек.

Рисунок 6. Облако точек, отфильтрованное ограничениями по оси X.

Сравнение других модулей

VoxelGrid

cuOctree

cuCluster

cuNDT

Ссылки по теме

https://github.com/NVIDIA-AI-IOT/cuPCL.git

https://developer.nvidia.com/blog/accelerating-lidar-for-robotics-with-cuda-based-pcl/

https://developer.nvidia.com/blog/detecting-objects-in-point-clouds-with-cuda-pointpillars/

ресурс

Совместное использование автономного вождения и позиционирования

[Быстрое чтение документов об облаках точек] Одометр на основе лидара и метода позиционирования на трехмерной карте облака точек

Обнаружение движущихся объектов на основе оптического потока при автономном вождении

Калибровка внешних параметров камеры на основе семантической сегментации

Обзор: Введение в теоретические модели и восприятие панорамных камер «рыбий глаз» для автономного вождения

Обзор методов автономного позиционирования транспортных средств в условиях высоких скоростей

Patchwork++: быстрый и надежный метод сегментации земли на основе облака точек.

PaGO-LOAM: наземная оптимизированная лидарная одометрия

Мультимодальный метод обнаружения и фильтрации края дороги

Платформа для одновременной калибровки, позиционирования и картографирования нескольких лидаров.

Извлечение, картографирование и долгосрочное позиционирование стержней в динамичной городской среде.

Коррекция искажений движения непериодического сканирующего лидара

Быстрая и тесно связанная разреженная прямая радиолокационная инерционно-визуальная одометрия

3D-обнаружение транспортных средств на основе камер и лидара низкого разрешения

Инструменты аннотаций и наборы городских данных для семантической сегментации трехмерного облака точек.

Базовое введение в начало работы с ROS2

Автоматическая калибровка твердотельных лидаров и систем камер

Решение для позиционирования датчика с помощью лидара + GPS + IMU + спидометра на колесах

Картирование и позиционирование дорожных сцен на основе скудных семантических визуальных особенностей.

Обнаружение транспортных средств на дорогах и тротуарах в реальном времени на основе лидара при автономном вождении (код с открытым исходным кодом)

Инструменты аннотаций и наборы городских данных для семантической сегментации трехмерного облака точек.

Больше статей можно посмотреть:Краткое изложение статей по истории обучения облакам точек

Обмен, связанный с SLAM и AR

Введение в принципы TOF-камеры

Введение в времяпролетную камеру глубины TOF

Структурированный PLP-SLAM: эффективное решение для разреженного картографирования и позиционирования для монокулярных, RGB-D и бинокулярных камер с использованием точек, линий и поверхностей.

Оптимизированное решение F-LOAM с открытым исходным кодом: на основе оптимизированного SC-F-LOAM.

[Быстрое чтение статьи] AVP-SLAM: Семантический SLAM в автоматических парковочных системах

[Краткое чтение статей об облаках точек] StructSLAM: SLAM структурированных линейных объектов

Обзор SLAM и AR

Часто используемые 3D-камеры глубины

Обзор и оценка алгоритма монокулярной визуальной инерциальной навигации SLAM для AR-оборудования

Обзор SLAM (4) Laser and Vision Fusion SLAM

Система Semantic SLAM для реконструкции в реальном времени от Kimera

Легко расширяемая платформа SLAM — OpenVSLAM

Введение в метод SLAM на основе камеры «рыбий глаз».

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose