Rerun 工具 (rerun_utils)
- class pywayne.visualization.rerun_utils.RerunUtils
Bases:
objectRerun可视化工具类
提供了一系列静态方法来向Rerun查看器添加各种3D可视化元素,包括点云、轨迹、相机、 平面和棋盘格等。该类封装了常用的3D可视化操作,简化了与Rerun SDK的交互。
Examples
基本使用方法: >>> import rerun as rr >>> rr.init(‘example’, spawn=True) >>> RerunUtils.add_point_cloud(points_3d, colors=[255, 0, 0]) >>> RerunUtils.add_camera(camera_pose, label=’main_camera’)
Rerun可视化工具类,提供了一系列静态方法来向Rerun查看器添加各种3D可视化元素。
主要功能:
向Rerun查看器添加3D可视化元素: - 点云: 支持单色或多色点云可视化 - 轨迹: 支持3D轨迹线的可视化 - 相机: 支持3D相机模型的可视化,可选择性显示图像 - 平面: 支持通过中心+法向量或变换矩阵定义的平面 - 棋盘: 支持在任意位置和朝向创建标准棋盘格
简化与Rerun SDK的交互,提供直观的API接口
支持静态可视化元素的添加和管理
主要方法 (按功能分类):
点云可视化: - add_point_cloud(points_3d, colors, label): 添加3D点云
轨迹可视化: - add_trajectory(traj_endpoints, colors, label): 添加3D轨迹线
相机可视化: - add_camera(camera_pose, image, label): 添加3D相机模型
平面可视化: - add_plane_from_center_and_normal(center, normal, half_size, color, label): 通过几何参数添加平面 - add_plane_from_Twp(Twp, half_size, color, label): 通过变换矩阵添加平面
棋盘可视化: - add_chessboard_from_Twp(rows, cols, cell_size, Twp, color1, color2, label): 通过变换矩阵添加3D棋盘格
内部辅助方法: - _get_quaternion_from_v1_and_v2(v1, v2): 计算两个向量间的旋转四元数
示例:
>>> import numpy as np >>> import rerun as rr >>> from pywayne.visualization.rerun_utils import RerunUtils >>> >>> # 初始化Rerun >>> rr.init('example', spawn=True) >>> >>> # 添加红色点云 >>> points = np.random.rand(100, 3) >>> RerunUtils.add_point_cloud(points, colors=[255, 0, 0], label='red_points') >>> >>> # 添加轨迹线 >>> trajectory = np.cumsum(np.random.rand(50, 3) * 0.1, axis=0) >>> RerunUtils.add_trajectory(trajectory, colors=[0, 255, 0], label='path') >>> >>> # 添加相机 >>> camera_pose = np.eye(4) >>> camera_pose[:3, 3] = [1, 0, 0] # 设置位置 >>> RerunUtils.add_camera(camera_pose, label='main_camera') >>> >>> # 添加蓝色平面 >>> center = np.array([0, 0, 0]) >>> normal = np.array([0, 0, 1]) # 垂直向上 >>> RerunUtils.add_plane_from_center_and_normal( ... center, normal, half_size=1.0, ... color=np.array([0, 0, 255]), label='ground' ... ) >>> >>> # 添加标准8x8棋盘 >>> RerunUtils.add_chessboard_from_Twp( ... rows=8, cols=8, cell_size=0.1, ... Twp=np.eye(4), label='chessboard' ... )
- classmethod add_camera(camera_pose: ndarray, image: ndarray | str | Path | None = None, label: str = 'camera')
向Rerun查看器添加3D相机
在3D空间中可视化相机的位置、朝向和图像内容。相机以针孔模型显示, 可选择性地显示相机拍摄的图像。
- Parameters:
camera_pose (np.ndarray) – 相机在世界坐标系中的位姿矩阵,形状为(4, 4)。 这是一个SE(3)变换矩阵,包含旋转和平移信息
image (Union[np.ndarray, str, Path], optional) – 相机图像。可以是: - np.ndarray:直接的图像数组,形状为(H, W, 3) - str或Path:图像文件路径 - None:不显示图像
label (str, optional) – 相机在Rerun中的标签/路径,默认为’camera’
- Returns:
返回相机的标签名称
- Return type:
str
Examples
>>> # 添加基本相机 >>> pose = np.eye(4) >>> RerunUtils.add_camera(pose, label='main_camera')
>>> # 添加带图像的相机 >>> RerunUtils.add_camera(pose, image='path/to/image.jpg', label='rgb_camera')
- classmethod add_chessboard_from_Twp(rows=8, cols=8, cell_size=0.1, Twp: ndarray = array([[1., 0., 0., 0.], [0., 1., 0., 0.], [0., 0., 1., 0.], [0., 0., 0., 1.]]), color1=None, color2=None, label: str = 'chessboard')
通过变换矩阵绘制3D棋盘格
使用4x4变换矩阵定义棋盘的位置和朝向。棋盘可以放置在3D空间的任意位置和朝向。 每个格子都是独立的平面对象,具有层次化的标签命名。
- Parameters:
rows (int, optional) – 棋盘行数,默认为8
cols (int, optional) – 棋盘列数,默认为8
cell_size (float, optional) – 单个格子的边长尺寸,默认为0.1
Twp (np.ndarray, optional) – 棋盘中心在世界坐标系中的位姿矩阵, 形状为(4, 4),默认为单位矩阵(原点处)
color1 (np.ndarray, optional) – 第一种颜色(通常为黑色格子), RGB格式,默认为黑色[0, 0, 0]
color2 (np.ndarray, optional) – 第二种颜色(通常为白色格子), RGB格式,默认为白色[255, 255, 255]
label (str, optional) – 棋盘的基础标签,默认为’chessboard’。 每个格子的标签为’{label}/{row}_{col}’
Examples
>>> # 创建标准8x8棋盘 >>> RerunUtils.add_chessboard_from_Twp()
>>> # 创建倾斜的大棋盘 >>> Twp_tilted = SE3.SE3_exp(np.array([0, 0, 0, 0, np.pi/4, 0])) >>> RerunUtils.add_chessboard_from_Twp(rows=10, cols=10, cell_size=0.2, ... Twp=Twp_tilted, label='big_board')
>>> # 创建红蓝配色的棋盘 >>> RerunUtils.add_chessboard_from_Twp(color1=np.array([255, 0, 0]), # 红色 ... color2=np.array([0, 0, 255])) # 蓝色
Note
棋盘以Twp指定的位置为中心对称分布
格子按照国际象棋标准进行颜色交替(左上角为color1)
每个格子在Rerun中有独立的标签,便于单独操作
- classmethod add_plane_from_Twp(Twp: ndarray, half_size: float, color: ndarray = array([0, 0, 255]), label: str = 'plane')
通过变换矩阵添加3D平面
使用4x4变换矩阵定义平面的位置和朝向。变换矩阵完全确定了平面在世界坐标系中的位姿。
- Parameters:
Twp (np.ndarray) – 平面在世界坐标系中的位姿矩阵,形状为(4, 4)。 这是一个SE(3)变换矩阵,定义了平面的位置和朝向
half_size (float) – 平面的半尺寸(从中心到边缘的距离)
color (np.ndarray, optional) – 平面颜色,RGB格式,默认为蓝色[0, 0, 255]
label (str, optional) – 平面在Rerun中的标签/路径,默认为’plane’
Examples
>>> # 添加单位矩阵定义的平面(原点处,Z轴向上) >>> Twp = np.eye(4) >>> RerunUtils.add_plane_from_Twp(Twp, 1.0)
>>> # 添加旋转的平面 >>> Twp = SE3.SE3_exp(np.array([1, 2, 3, 0, 0, np.pi/4])) >>> RerunUtils.add_plane_from_Twp(Twp, 0.5, color=np.array([0, 255, 0]))
- classmethod add_plane_from_center_and_normal(center: ndarray, normal: ndarray, half_size: float, color: ndarray = array([0, 0, 255]), label: str = 'plane')
通过中心点和法向量添加3D平面
创建一个以指定点为中心、具有特定法向量的矩形平面。平面朝向由法向量确定。
- Parameters:
center (np.ndarray) – 平面中心点坐标,形状为(3,)
normal (np.ndarray) – 平面法向量,形状为(3,),会自动归一化
half_size (float) – 平面的半尺寸(从中心到边缘的距离)
color (np.ndarray, optional) – 平面颜色,RGB格式,默认为蓝色[0, 0, 255]
label (str, optional) – 平面在Rerun中的标签/路径,默认为’plane’
Examples
>>> # 添加水平平面 >>> center = np.array([0, 0, 0]) >>> normal = np.array([0, 0, 1]) # 垂直向上 >>> RerunUtils.add_plane_from_center_and_normal(center, normal, 1.0)
>>> # 添加倾斜平面 >>> normal = np.array([1, 1, 1]) # 倾斜法向量 >>> RerunUtils.add_plane_from_center_and_normal(center, normal, 0.5, ... color=np.array([255, 0, 0]))
- static add_point_cloud(points_3d: ndarray, colors=None, label: str = 'point_cloud')
向Rerun查看器添加3D点云
将3D点云数据可视化为静态对象。支持自定义颜色和标签。
- Parameters:
points_3d (np.ndarray) – 3D点坐标数组,形状为(N, 3),其中N是点的数量
colors (Union[list, np.ndarray], optional) – 点的颜色。可以是: - 单个RGB颜色列表:[R, G, B],所有点使用相同颜色 - 颜色数组:形状为(N, 3),每个点对应一个RGB颜色 - None:默认使用红色[255, 0, 0]
label (str, optional) – 点云在Rerun中的标签/路径,默认为’point_cloud’
Examples
>>> # 添加红色点云 >>> points = np.random.rand(100, 3) >>> RerunUtils.add_point_cloud(points)
>>> # 添加多彩点云 >>> colors = np.random.randint(0, 255, (100, 3)) >>> RerunUtils.add_point_cloud(points, colors=colors, label='colored_points')
- static add_trajectory(traj_endpoints: ndarray, colors=None, label: str = 'trajectory')
向Rerun查看器添加3D轨迹线
将3D轨迹可视化为连续的线段。轨迹以静态对象的形式显示。
- Parameters:
traj_endpoints (np.ndarray) – 轨迹点坐标数组,形状为(N, 3),其中N是轨迹点数量。 相邻点之间会自动连线形成轨迹
colors (Union[list, np.ndarray], optional) – 轨迹线颜色。可以是: - 单个RGB颜色列表:[R, G, B],整条轨迹使用相同颜色 - 颜色数组:为轨迹的不同段指定颜色 - None:默认使用绿色[0, 255, 0]
label (str, optional) – 轨迹在Rerun中的标签/路径,默认为’trajectory’
Examples
>>> # 添加绿色轨迹 >>> trajectory = np.cumsum(np.random.rand(50, 3) * 0.1, axis=0) >>> RerunUtils.add_trajectory(trajectory)
>>> # 添加蓝色轨迹 >>> RerunUtils.add_trajectory(trajectory, colors=[0, 0, 255], label='blue_path')
点云可视化详细说明
add_point_cloud() 方法:
用于在Rerun查看器中添加3D点云数据,支持灵活的颜色配置。
- 参数:
points_3d (numpy.ndarray): 3D点坐标,形状为(N, 3)
colors (可选): 点的颜色配置,支持多种格式
label (str): 点云标签,默认为’point_cloud’
- 颜色配置选项:
单色: [R, G, B] - 所有点使用相同颜色
多色: (N, 3) 数组 - 每个点对应一个RGB颜色
默认: None - 使用红色 [255, 0, 0]
示例:
>>> # 单色点云 >>> points = np.random.rand(1000, 3) >>> RerunUtils.add_point_cloud(points, colors=[0, 255, 0]) # 绿色 >>> >>> # 多色点云 >>> colors = np.random.randint(0, 255, (1000, 3)) >>> RerunUtils.add_point_cloud(points, colors=colors, label='rainbow')
轨迹可视化详细说明
add_trajectory() 方法:
用于在Rerun查看器中添加3D轨迹线,将一系列点连接成连续的路径。
- 参数:
traj_endpoints (numpy.ndarray): 轨迹点坐标,形状为(N, 3)
colors (可选): 轨迹线颜色
label (str): 轨迹标签,默认为’trajectory’
示例:
>>> # 螺旋轨迹 >>> t = np.linspace(0, 4*np.pi, 100) >>> trajectory = np.column_stack([ ... np.cos(t), np.sin(t), t/10 ... ]) >>> RerunUtils.add_trajectory(trajectory, colors=[255, 255, 0])
相机可视化详细说明
add_camera() 方法:
用于在Rerun查看器中添加3D相机模型,显示相机的位置、朝向和可选的图像内容。
- 参数:
camera_pose (numpy.ndarray): 相机位姿矩阵,形状为(4, 4)
image (可选): 相机图像,支持多种格式
label (str): 相机标签,默认为’camera’
- 图像格式支持:
numpy数组: 直接的图像数据,形状为(H, W, 3)
文件路径: 字符串或Path对象,指向图像文件
None: 不显示图像,仅显示相机模型
示例:
>>> # 基本相机 >>> pose = np.eye(4) >>> pose[:3, 3] = [2, 1, 1] # 设置位置 >>> RerunUtils.add_camera(pose, label='observer') >>> >>> # 带图像的相机 >>> RerunUtils.add_camera( ... pose, image='path/to/image.jpg', ... label='rgb_camera' ... )
平面可视化详细说明
平面创建方法:
提供两种方式创建3D平面:几何参数法和变换矩阵法。
- 方法1: add_plane_from_center_and_normal()
通过中心点和法向量定义平面
适用于已知几何参数的场景
- 方法2: add_plane_from_Twp()
通过4x4变换矩阵定义平面
适用于已有SE(3)变换的场景
示例:
>>> # 方法1: 几何参数 >>> center = np.array([0, 0, 1]) >>> normal = np.array([0, 0, 1]) # 水平面 >>> RerunUtils.add_plane_from_center_and_normal( ... center, normal, half_size=2.0, ... color=np.array([128, 128, 128]) ... ) >>> >>> # 方法2: 变换矩阵 >>> Twp = np.eye(4) >>> Twp[:3, 3] = [1, 1, 0] # 平移 >>> RerunUtils.add_plane_from_Twp( ... Twp, half_size=1.5, ... color=np.array([255, 192, 128]) ... )
棋盘可视化详细说明
add_chessboard_from_Twp() 方法:
用于通过变换矩阵在3D空间中创建棋盘格模式,常用于相机标定、空间参考或视觉装饰。
- 参数:
rows (int): 棋盘行数,默认为8
cols (int): 棋盘列数,默认为8
cell_size (float): 单个格子的边长,默认为0.1
Twp (numpy.ndarray): 棋盘位姿矩阵,默认为单位矩阵
color1 (numpy.ndarray): 第一种颜色(黑格),默认为黑色
color2 (numpy.ndarray): 第二种颜色(白格),默认为白色
label (str): 棋盘基础标签,默认为’chessboard’
- 特性:
以指定位置为中心对称分布
格子按照标准棋盘模式交替颜色
每个格子独立标签:{label}/{row}_{col}
支持任意位置和朝向
示例:
>>> # 标准棋盘 >>> RerunUtils.add_chessboard_from_Twp() >>> >>> # 相机标定棋盘 >>> RerunUtils.add_chessboard_from_Twp( ... rows=9, cols=6, cell_size=0.025, # 25mm格子 ... label='calibration_board' ... ) >>> >>> # 倾斜彩色棋盘 >>> from pywayne.vio.SE3 import SE3 >>> Twp_tilted = SE3.SE3_exp(np.array([0, 0, 0, 0, np.pi/4, 0])) >>> RerunUtils.add_chessboard_from_Twp( ... rows=6, cols=6, cell_size=0.08, ... Twp=Twp_tilted, ... color1=np.array([255, 0, 0]), # 红色 ... color2=np.array([0, 0, 255]), # 蓝色 ... label='colored_board' ... )
通过上述示例,用户可以快速掌握 RerunUtils 类的主要功能,并将其应用于3D数据可视化、机器人调试、计算机视觉开发等领域。RerunUtils 提供了简洁直观的API,大大简化了与Rerun SDK的交互过程。