You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Drake PointCloud与Open3D PointCloud类型间进行转换?

将Drake PointCloud转换为Open3D PointCloud

核心转换逻辑

Drake的PointCloud与Open3D的PointCloud均基于numpy数组存储点云数据,转换的核心是调整数组的形状与数据类型以匹配目标库的要求:

  • Drake的点数据为**(3, N)形状的numpy数组(N为点的总数),Open3D要求格式为(N, 3)**
  • Drake的颜色数据(若存在)通常是**(3, N)的uint8类型(取值范围0-255),Open3D需要转换为(N, 3)**的float32类型(取值范围0-1)

完整转换代码(Drake → Open3D)

假设你已获取Drake的point_cloud对象,转换代码如下:

import numpy as np
import open3d as o3d
from drake.perception import PointCloud

def drake_to_o3d_point_cloud(drake_pcd: PointCloud) -> o3d.geometry.PointCloud:
    # 初始化Open3D点云实例
    o3d_pcd = o3d.geometry.PointCloud()
    
    # 转换点数据形状并赋值
    points = drake_pcd.points().T
    o3d_pcd.points = o3d.utility.Vector3dVector(points)
    
    # 处理颜色数据(若存在)
    if drake_pcd.has_colors():
        colors = drake_pcd.colors().T.astype(np.float32) / 255.0
        o3d_pcd.colors = o3d.utility.Vector3dVector(colors)
    
    return o3d_pcd

反向转换代码(Open3D → Drake)

若需将处理后的Open3D点云转回Drake格式,可使用以下代码:

def o3d_to_drake_point_cloud(o3d_pcd: o3d.geometry.PointCloud) -> PointCloud:
    # 转换点数据形状
    points = np.asarray(o3d_pcd.points).T
    
    # 初始化Drake点云实例
    drake_pcd = PointCloud(points.shape[1])
    drake_pcd.mutable_points()[:] = points
    
    # 处理颜色数据(若存在)
    if o3d_pcd.has_colors():
        colors = (np.asarray(o3d_pcd.colors).T * 255).astype(np.uint8)
        drake_pcd.mutable_colors()[:] = colors
    
    return drake_pcd

关键细节说明

  • 点数据转换:通过numpy的T属性转置数组形状,再用o3d.utility.Vector3dVector包装为Open3D可识别的格式
  • 颜色数据处理:Drake与Open3D的颜色通道均为RGB顺序,只需转置数组并归一化数值范围即可
  • 无颜色数据的点云会自动跳过颜色设置,不影响后续Open3D操作

内容的提问来源于stack exchange,提问作者Russ Tedrake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 20:25:38