假设你是一名机长,面前是密密麻麻的仪表盘:速度表、高度表、罗盘、雷达屏、油量指示……没有它们,你就像蒙着眼开一架几吨重的铁鸟。机器人开发者面临同样的困境——机器人有激光雷达、摄像头、惯性测量单元(IMU)等一堆传感器,可这些数据只是一堆看不见摸不着的数字。RViz2 就是这个“驾驶舱仪表盘”:它把机器人“眼睛”看到的世界、身体各部位的位置关系、规划好的路径,全部画成一幅实时更新的 3D 画面,让你像机长一样从容掌控全局。 本文将带你以“机组培训”的方式认识 RViz2:先熟悉仪表盘的整体布局,再逐一学会配置各类仪表(显示插件)、校准地平线(Fixed Frame)、读懂部件结构图(TF 坐标树)、看懂雷达屏幕(点云与地图)、用马克笔标注航线(Marker),最后了解塔台远程监控(分布式调试)和机长排错手册(实战优化)。全程不涉及晦涩公式,只有看得见的画面和生动类比。
对 AI 从业者而言,RViz2 是机器人开发中“看见系统状态”的核心能力。掌握它,你就能从“盲写代码”进化为“可视化调试”,在机器人学与自动化项目中大幅提升排错效率与方案表达力。
目录
可视化演示
展示ROS2 RViz2可视化三大核心:显示插件(6种插件PCL/TF/MAP/LSN/RMD/IMG订阅话题实时渲染)、自定义Marker发布(NODE节点→publish Marker消息→4种形状ARR/CUB/SPH/LIN渲染)、TF坐标树与远程调试(7坐标系map→odom→base→laser/imu/cam/grip层级+SSH远程连接),三模式切换理解RViz2全貌。
本节配有交互动效(进入视口后自动加载,约 3KB)。
'+C1+'
RViz2基础认知:驾驶舱的仪表盘
初次走进驾驶舱的新手机长,往往会被密密麻麻的仪表吓到。但真正的老机长清楚:仪表不是摆设,而是飞机“感知”的外延。机器人也一样——它身上装满了激光雷达、摄像头、里程计,但这些传感器的输出只是冰冷的字节流。RViz2 的角色,就是把字节流翻译成机长能看懂的画面:哪边有墙、前方多远有障碍、机械臂现在摆成什么姿势,一眼便知。
RViz2 是 ROS2 官方推出的 3D 可视化工具,全称 Robot Visualization。它本身不产生任何数据,而是一个“超级显示器”:通过订阅 ROS2 话题(Topic)接收传感器数据,再用 OpenGL 渲染成三维场景。运行 ros2 run rviz2 rviz2 即可打开默认界面。界面可分成三大区域:左侧的显示面板(Displays)管理所有可见图层,中间的 3D 视图区是主舞台,顶部的工具栏提供测量、发布点、选择等交互工具。
从数学角度看,RViz2 展示的最终场景,是所有显示插件输出画面的叠加。
就像机长不会只依赖一块仪表——他会同时看速度、高度和雷达。RViz2 的精髓也正是“多数据叠加”:网格提供空间参照,点云显示障碍,Marker 标出目标,三者融合,机器人的世界便跃然屏上。
- 场景变量\(V_{scene}\) 表示最终渲染出的三维场景,也就是机长眼前的主画面。
- 显示插件\(\text{Display}_i(T_i)\) 表示第 \(i\) 个显示插件实例,它绑定一个话题 \(T_i\),比如点云插件绑定
/scan。 - 叠加合成\(\bigcup_{i=1}^{n}\) 把所有插件的结果合成一幅完整画面,相当于把各仪表的读数全部摆到同一块玻璃上。
- 话题绑定\(T_i\) 是每个插件的数据来源话题,主题名写错,对应仪表就会“罢工”。
显示插件配置:组装你的仪表盘
驾驶舱里的仪表并非出厂就固定,机长可以根据任务选配:夜间飞行加装夜视仪,长途巡航加装燃油管理面板。RViz2 同样允许你自由“选配”显示组件,这些组件被称为显示插件(Display Plugin)。
在 RViz2 中,点击左侧面板下方的 Add 按钮,会弹出一个插件列表:Grid(网格)、RobotModel(机器人模型)、LaserScan(激光扫描)、PointCloud2(点云)、Map(地图)、TF(坐标树)等。选择插件后,它就被添加到显示面板中。每个插件都有一组属性,最重要的是 Topic(订阅的话题名)和 Fixed Frame(参考坐标系)。比如你要看激光雷达数据,就添加 LaserScan 插件,并把 Topic 设为 /scan。
一个插件本质上是一个“话题到画面”的映射函数:给它正确的数据和参数,它就画出对应的图形。
机长选配仪表时,会确认仪表与飞机总线兼容;你添加插件时,也要确认插件与话题类型匹配——给点云插件喂图像话题,画面自然是空的。掌握“插件 = 话题 + 类型”这一心智模型,任何数据都能被正确“点亮”。
- 话题输入\(T_{topic}\) 是插件订阅的话题名,比如
/odom或/scan,相当于仪表的信号源。 - 插件类型\(P_{type}\) 是插件的种类,比如点云插件、地图插件,相当于仪表的外观与原理。
- 映射结果\(f\) 把两者映射为可视化结果 \(V\),说明“同样的数据,用不同插件画出来完全不同”。
固定坐标系:找准地平线
飞行员在云层中飞行时,唯一能依赖的是姿态仪里的“人造地平线”——它告诉你天地在哪里。RViz2 里也有这样一条“人造地平线”,叫 Fixed Frame(固定坐标系)。所有传感器数据必须转换到这个坐标系下,才能被正确摆放。
常见的 Fixed Frame 有 map(地图系,全局静态)、odom(里程计系,相对稳定)、base_link(机器人本体系,随车移动)。在 Displays 面板的全局选项中设置。如果设置错误——比如地图数据在 map 系下,而你把 Fixed Frame 设成了 base_link,而 TF 又没提供两者关系——数据就会因为找不到变换而消失,或显示在完全错误的位置。
坐标变换的核心公式,是把一个点从坐标系 \(B\) 变换到坐标系 \(A\):
地平线选错,再精准的仪表也会把人带进歧途。Fixed Frame 是你观察整个三维世界的“绝对参照”。调试时遇到数据“乱飞”或“消失”,第一反应就该检查:我的地平线(Fixed Frame)选对了吗?
- 原始坐标点\(p_{B}\) 是点在坐标系 \(B\) 下的坐标,比如激光雷达测到的障碍物位置。
- 变换矩阵\(T_{B}^{A}\) 表示“从 \(B\) 系到 \(A\) 系”的变换矩阵,包含平移与旋转。
- 左乘变换把 \(p_{B}\) 左乘这个矩阵,就得到同一物理点在 \(A\) 系下的坐标 \(p_{A}\)。
TF坐标树:飞机部件全家福
一架飞机有机头、机翼、引擎、尾翼,每个部件都有自己的相对位置。塔台想知道“右侧引擎相对于机头在哪”,只需要查一张结构图。机器人也有这样一张“结构图”,叫 TF(TransForm)坐标树。它记录了机器人所有部件坐标系之间的相对位姿关系:base_link 和 laser_frame 之间差了多远,map 和 odom 之间又是什么关系。
在 RViz2 中,可以通过 TF 插件查看这棵树:在 Add 中选择 TF,画面上会显示每个坐标系的原点和小标签。也可以点击工具栏的 Publish Point 或使用 tf2_ros 的命令行工具查看任意两坐标系的变换。TF 树有严格的父子层级,不能成环,子坐标系通过父坐标系逐级连接。
多个坐标系之间的变换可以链式合成,这是 TF 树中最核心的运算:
有了这张“全家福”,机械臂的控制节点才能算准“手该往哪伸”,导航节点才能知道“激光扫到的墙离车多近”。TF 树一旦断裂,机器人就像突然失忆的病人——不知道自己的手在哪里,更不知道该往哪走。
- 前段变换\(T_{B}^{A}\) 是父级坐标系之间的变换,例如
map → odom的位姿关系。 - 后段变换\(T_{C}^{B}\) 是从 \(B\) 到下一级 \(C\) 的变换,例如
odom → base_link。 - 链式合成两者矩阵相乘得到 \(T_{C}^{A}\),相当于沿着 TF 树逐级“接力”算出任意两坐标系的关系。
传感器可视化:看懂雷达屏幕
机长看雷达屏幕时,每个亮点都代表一架飞机;机器人开发者看 RViz2 时,画面里的每个彩色点也代表着真实世界的障碍物。传感器可视化是 RViz2 最常用的功能,它把各种物理量变成直观图形。
- PointCloud2(点云):来源于 3D 激光雷达或深度相机,呈现为成千上万个 3D 点,适合观察物体轮廓。
- LaserScan(激光扫描):2D 激光雷达数据,通常显示为扇形扫描线。
- Map(栅格地图):显示占据栅格地图,黑白格子表示障碍物与自由空间。
- Image(图像):直接显示摄像头画面,配合其他数据做融合判断。
点云点数动辄数十万,全部绘制会拖垮帧率。实际中常用降采样减少点数,只保留部分点:
雷达屏幕上的点再多,机长也只关注关键目标。同理,RViz2 中不是点越多越好——在可接受的清晰度下尽量降低点数,才能保证画面流畅,让开发过程中的每一帧都“跟手”。
- 原始点集\(P = \{p_1, p_2, \ldots, p_N\}\) 是传感器输出的全部点云,数量可达几十万。
- 取模筛选条件 \(i \bmod k = 0\) 表示只保留下标是 \(k\) 的倍数的点,每 \(k\) 个点抽一个。
- 降采样结果\(P'\) 是筛后的点集,点数减少为原来的 \(\frac{1}{k}\),轮廓信息依然保留。
Marker机制:在航图上做标记
领航员会在纸质航图上用马克笔圈出禁飞区、画出航路、标出备降机场。RViz2 中的 Marker(可视化标记) 就是这支数字马克笔:开发者可以通过代码在三维空间里画出箭头、方块、球体、文字,用来标记目标点、显示路径、框选区域。
Marker 通过话题 /visualization_marker_array 发布,消息类型是 visualization_msgs/Marker。常用类型包括:CUBE(立方体)、SPHERE(球体)、ARROW(箭头)、TEXT_VIEW_FACING(始终面向相机的文字)。每个 Marker 都有唯一的命名空间和 ID,便于覆盖和删除。发布 DELETEALL 可以清除所有 Marker。
Marker 的显示时长由 lifetime 字段控制,它决定了标记在画面中存活多久:
领航员用马克笔在航图上留下临时标注,飞机飞过之后就擦掉;Marker 的 lifetime 机制正是这个“自动擦除”动作。设计可视化时,动态目标用短 lifetime 避免画面堆积,关键地标用 0 保持常驻——这是 Marker 用法的基本功。
- 发布时间\(T_{publish}\) 是节点发布 Marker 消息的时刻,即标记“落笔”的瞬间。
- 存活时长\(\Delta T_{duration}\) 是开发者设置的存活秒数,单位为秒。设 0 表示永久。
- 过期时刻\(T_{expire}\) 是两者之和,超过该时刻,RViz2 自动擦除这个标记。
远程调试:地面塔台遥控
飞机在天上飞,塔台在地面看,二者通过无线电保持联系。机器人调试也常遇到类似场景:机器人在地下车库跑,开发者在办公室盯屏幕——这就是 远程调试(Remote Debugging)。RViz2 作为纯可视化客户端,可以运行在与机器人完全不同的机器上,通过网络接收数据。
ROS2 基于 DDS(Data Distribution Service,数据分发服务)实现分布式通信。要让两台机器互相通信,最核心的配置是让它们的 ROS_DOMAIN_ID 一致。ROS_DOMAIN_ID 相当于一个“通信频道号”,所有节点在同一个频道内才能互相发现并传输数据。此外还需保证网络互通(同一局域网或配好 VPN),必要时配置多播路由。
远程调试链路上的总延迟,可分解为几个环节:
塔台不会因为飞机在天上就“看不见”它——无线电频道对上了,全景一目了然。同理,只要 ROS_DOMAIN_ID 一致、网络通畅,你就能坐在办公室里实时监控现场的机器人,调试效率翻倍。
- 发布延迟\(L_{pub}\) 是机器人端节点封装并发布消息的时间,与消息大小和 CPU 负载有关。
- 网络延迟\(L_{net}\) 是数据在网线上传输的时间,Wi-Fi 不稳定时这一项会明显增大。
- 接收与渲染延迟\(L_{sub} + L_{render}\) 表示 PC 端接收解包和 GPU 渲染画面的时间。
- 总延迟求和四段延迟相加就是端到端延迟。画面卡顿时,用这套公式逐段定位瓶颈。
实战排错:资深机长的工具箱
再老练的机长也遇到过仪表盘“抽风”的时刻。RViz2 最常见的坑,大多是坐标系、话题名、插件配置三类问题:数据“漂移”多半是 Fixed Frame 或 TF 树断裂;画面空白多半是话题名拼错或数据源没启动;画面卡顿则多半是点云/图像负载过高。
性能优化是实战的核心。RViz2 本质是 CPU+GPU 密集的 OpenGL 渲染器,画面流畅度用帧率(FPS)衡量,帧率由每帧渲染耗时决定:
资深机长有一套固定的检查清单,开发者也该如此:先看左下角有没有 TF 变换报错,再确认 Fixed Frame 是否匹配,接着检查话题是否在发布(ros2 topic list / ros2 topic echo),最后才怀疑插件配置。逐项排除,大多数“灵异现象”都会现出原形——毕竟,仪表盘不会撒谎,它只是把系统状态如实画给你看。
- 渲染耗时\(T_{render}\) 是绘制一帧画面所需的时间,包括数据转换、GPU 绘制与合成。
- 帧率换算\(\text{FPS}\) 是每秒渲染帧数,等于 1 除以单帧耗时。耗时越短,画面越顺滑。
AI 应用场景
巡检机器人实时建图与避障调试
阶段:模型部署与系统调试
解决的问题:传统方式下,巡检机器人走一遍厂区,开发者只能事后导出日志分析,无法实时看到激光雷达是否扫到障碍物、建图是否发生漂移。使用 RViz2 后,点云、栅格地图、机器人位姿实时同屏显示,哪里扫歪了一眼定位。
具体案例:某化工厂防爆巡检机器人项目,工程师在远程 PC 上启动 RViz2,同时显示 3D 激光雷达点云、map 栅格地图和机器人 TF 坐标轴。机器人走到管廊下方时点云突然消失,工程师立即在 TF 树上发现 laser_frame 变换断裂,随即定位到 IMU 数据异常,快速修复。
机械臂抓取路径可视化
阶段:运动规划与视觉融合
解决的问题:机械臂逆解算出的路径只是一串关节角数组,人难以判断是否会撞到周边设备。利用 RViz2 的 Marker 机制,可以把目标抓取点、规划路径、碰撞包围盒画成三维标记,直观验证规划算法。
具体案例:某物流分拣机械臂项目,开发者编写节点发布 /goal_marker(目标方块)、/path_marker(路径箭头)和 /aabb_marker(碰撞盒),在 RViz2 中叠加显示,并与深度相机点云对齐。调试中一眼发现路径穿过货架包围盒,及时修正了规划参数。
多机器人协同远程监控
阶段:分布式系统运维
解决的问题:三台 AGV(自动导引车)在同一仓库运行,各自独立控制,传统串口调试只能一辆一辆处理,无法看到全局冲突。通过 ROS2 分布式通信,将三台车的 TF、里程计、Marker 目标点汇聚到一台 RViz2 中,实现“塔台式”集中监控。
具体案例:某电商仓库 AGV 调度系统,开发者把每台车的 odom 和自定义 goal_marker 话题映射到不同命名空间,统一在 PC 端 RViz2 中显示。调度算法产生交叉路径时,两车 Marker 轨迹重合,工程师立即调整避让策略。
Python 演示
"""RViz2 核心机制模拟: TF 坐标变换链 + Marker 生命周期管理"""import mathimport time class Transform2D: """二维坐标变换, 对应 RViz2 中的 TF 变换""" def __init__(self, x=0.0, y=0.0, yaw=0.0): self.x = x self.y = y self.yaw = yaw def compose(self, other): """链式合成: self 是 T_parent_child, other 是 T_child_grandchild, 返回 T_parent_grandchild, 对应公式 T_C^A = T_B^A * T_C^B""" cos_y = math.cos(self.yaw) sin_y = math.sin(self.yaw) new_yaw = self.yaw + other.yaw new_x = self.x + cos_y * other.x - sin_y * other.y new_y = self.y + sin_y * other.x + cos_y * other.y return Transform2D(new_x, new_y, new_yaw) def apply(self, point): """将点从子坐标系变换到父坐标系""" px = self.x + point[0] * math.cos(self.yaw) - point[1] * math.sin(self.yaw) py = self.y + point[0] * math.sin(self.yaw) + point[1] * math.cos(self.yaw) return (px, py) class Marker: """模拟 visualization_msgs/Marker 消息""" def __init__(self, ns, marker_id, mtype, x, y, lifetime=0.0): self.ns = ns self.marker_id = marker_id self.mtype = mtype # 0=CUBE 1=SPHERE 2=ARROW 3=TEXT self.x = x self.y = y self.lifetime = lifetime # 秒, 0 表示永久 self.publish_time = time.time() class Rviz2Simulator: """极简 RViz2 模拟器: 管理插件与 Marker""" def __init__(self, fixed_frame="map"): self.fixed_frame = fixed_frame self.plugins = {} self.markers = {} def add_plugin(self, name, plugin_type, topic): self.plugins[name] = {"type": plugin_type, "topic": topic} def register_marker(self, marker): key = (marker.ns, marker.marker_id) self.markers[key] = marker def update(self, now=None): """更新 Marker 生命周期, 过期自动移除""" if now is None: now = time.time() expired = [] for key, mk in self.markers.items(): if mk.lifetime > 0 and now - mk.publish_time > mk.lifetime: expired.append(key) for key in expired: del self.markers[key] return len(expired) def main(): # 1. 模拟 TF 变换链: map -> odom -> base_link -> laser_frame T_map_odom = Transform2D(0.0, 0.0, 0.0) T_odom_base = Transform2D(1.0, 2.0, math.radians(30)) T_base_laser = Transform2D(0.2, 0.0, 0.0) T_map_laser = T_map_odom.compose(T_odom_base).compose(T_base_laser) point_in_laser = (0.5, 0.0) point_in_map = T_map_laser.apply(point_in_laser) print("激光点(激光坐标系):", point_in_laser) print("变换到 map 系:", point_in_map) # 2. 模拟 Marker 发布与生命周期 viz = Rviz2Simulator(fixed_frame="map") viz.add_plugin("Grid", "grid", "/map") viz.add_plugin("PointCloud2", "point_cloud", "/scan") marker = Marker("nav", 1, 0, 5.0, 5.0, lifetime=2.0) viz.register_marker(marker) print("Marker 数量:", len(viz.markers)) print("3 秒后过期数量:", viz.update(time.time() + 3.0)) print("Marker 数量:", len(viz.markers)) if __name__ == "__main__": main()
T_map_laser = T_map_odom.compose(T_odom_base).compose(T_base_laser)沿 TF 树从map一路“接力”到laser_frame,算出总变换矩阵。point_in_map = T_map_laser.apply(point_in_laser)把激光坐标系下的一个点,通过总变换转成map系坐标,对应公式 \(p_A = T_B^A \times p_B\)。key = (marker.ns, marker.marker_id)用命名空间 + ID 作为 Marker 的唯一标识,保证可覆盖可删除。if mk.lifetime > 0 and now - mk.publish_time > mk.lifetime判断当前时刻是否超过“发布时刻 + 存活时长”,即公式 \(T_{expire} = T_{publish} + \Delta T\)。for key in expired: del self.markers[key]把超时的标记从字典中移除,模拟 RViz2 的自动擦除行为。
常见误区
误区我以为启动 RViz2 后,机器人摄像头拍到的画面就会自动显示在窗口里,就像电视监控一样。
正解RViz2 不会自动显示任何数据,它只显示你“显式订阅”的话题。要看摄像头画面,必须添加 Image 显示插件,并把 Topic 设置为实际图像话题(如 /camera/image_raw)。这就像机长必须手动打开某个显示屏,而不是所有摄像头画面自动怼到眼前。
为何常见:因为 RViz2 看起来像“监控平台”,新手容易误以为它会自动拉取所有可用数据。
误区Fixed Frame 只是下拉菜单里的一个选项,选哪个不都一样吗?反正都是世界坐标。
正解Fixed Frame 是所有数据可视化的“地平线”,选错会导致数据消失或错位。比如机器人在 odom 系下运动,你把 Fixed Frame 设成 base_link,而没有 TF 给出 base_link 到 odom 的关系,点云会全部消失,或跟着机器人一起“抖动”。
为何常见:初学者还没建立起“坐标系决定数据解释方式”的直觉,以为坐标是绝对的。
误区我在代码里 publish 了一个 Marker,它应该一直画在屏幕上,除非我手动删掉。
正解Marker 是否永久显示由 lifetime 字段决定。如果 lifetime 设为 2 秒,那么 2 秒后 RViz2 会自动擦除它;只有设为 0,才会一直显示,直到程序发布 DELETEALL 或同名 ID 的新 Marker。就像用马克笔画线后,过一段时间墨水会自然褪色。
为何常见:把 RViz2 的 Marker 想象成静态图形对象,忽略了它本质是一条有时效的消息。
误区机器人跑在我手里,调试就必须蹲在机器人旁边,把显示器和键盘都接上去。
正解RViz2 是纯客户端,可以运行在与机器人完全分离的 PC 上。只要两台机器在同一网络、ROS_DOMAIN_ID 一致,PC 上的 RViz2 就能订阅到机器人发布的话题,完成“塔台式”远程监控。
为何常见:习惯了单机调试,不了解 ROS2 基于 DDS 的分布式通信架构。
误区把所有插件都加上,点云、地图、TF、Marker 全部显示,画面越丰富越专业。
正解每个插件都在消耗 CPU/GPU 资源,插件越多帧率越低。点云几十万个点再加上高清图像,RViz2 会卡成幻灯片。正确做法是按需开启,调试完的插件及时移除,必要时做降采样。
为何常见:只关注“看到了什么”,没关注“渲染每一帧花了多少时间”。
面试题
Q1. RViz2 本质上是 ROS2 的哪一类工具?
- A.图形化调试工具← 正确答案
- B.命令行交互工具
- C.纯文本配置文件
- D.机器人仿真引擎
答案:A。RViz2 是 ROS2 官方的图形化 3D 可视化调试工具,就像机长面前的仪表盘。它本身不产生数据、不负责仿真,只是把话题数据渲染成画面,所以选“图形化调试工具”。
Q2. 在 RViz2 中添加一个显示插件,正确的操作是?
- A.点击"Add"按钮进行选择← 正确答案
- B.修改 yaml 配置文件
- C.重启 rviz2 就可以自动添加
- D.编写 Python 脚本手动渲染
答案:A。RViz2 的显示面板下方有"Add"按钮,点击后弹出插件列表,选择即可添加。这相当于机长在驾驶舱里选配一块新仪表。修改配置文件不是常规操作,重启也不会自动添加,Python 脚本更不是 RViz2 的插件机制。
Q3. 如果 RViz2 的 Fixed Frame 设置错误且缺少对应 TF 变换,最可能出现的现象是?
- A.数据显示漂移错位← 正确答案
- B.程序直接崩溃退出
- C.话题自动停止发布
- D.编译时报类型错误
答案:A。Fixed Frame 是数据可视化的“地平线”参照点。设置错误时,RViz2 无法把数据转换到目标坐标系,数据会消失或显示在错误位置,表现为漂移错位。程序不会崩溃,话题发布不受影响,编译错误更是无关。
Q4. 关于 TF 坐标树,下列说法正确的是?
- A.查询任意两坐标系变换关系← 正确答案
- B.管理机器人各部件相对位姿← 正确答案
- C.直接发布激光雷达原始数据
- D.显示传感器数据的时间戳
答案:AB。TF 树记录并管理所有坐标系之间的相对位姿关系,支持任意两坐标系之间的变换查询,对应“地图→机器人→传感器”的骨架结构。TF 不负责发布激光数据(那是传感器节点的事),也不显示时间戳(那是 rosbag/header 的职责)。
Q5. 发布 Marker 时,将 lifetime 设为 0 表示什么?
- A.永久显示不自动删除← 正确答案
- B.发布后立即被删除
- C.一秒后自动消失
- D.随话题停止而消失
答案:A。lifetime = 0 是 ROS 中的特殊约定,表示 Marker 永不过期,直到被 DELETEALL 或同名 ID 的新消息覆盖。这相当于用马克笔画了一道永不褪色的线。设成非 0 秒才对应自动消失。
Q6. 使用 RViz2 进行多机远程调试时,两台机器必须保证下列哪项一致?
- A.ROS_DOMAIN_ID← 正确答案
- B.Ubuntu 版本号
- C.显卡驱动型号
- D.显示器分辨率
答案:A。ROS_DOMAIN_ID 相当于 ROS2 的“通信频道号”,只有频道号一致,DDS 才能发现对方并进行数据传输。Ubuntu 版本、显卡驱动、显示器分辨率都与跨机器通信无关。
Q7. 以下哪些做法能有效提升 RViz2 的渲染帧率?
- A.对点云数据做降采样← 正确答案
- B.关闭不需要的显示插件← 正确答案
- C.不断增加 Marker 的数量
- D.用高分辨率显示所有图像
答案:AB。帧率是渲染耗时的倒数(FPS = 1 / T_render)。降采样减少点云绘制量、关闭无用插件降低 GPU 负载,都能缩短渲染时间。增加 Marker 数量和显示高分辨率图像会加重渲染负担,反而降低帧率。
Q8. 在坐标变换公式 \(p_A = T_B^A \times p_B\) 中,\(T_B^A\) 表示什么?
- A.从 B 系到 A 系的变换← 正确答案
- B.从 A 系到 B 系的变换
- C.只包含平移的向量
- D.只包含旋转的向量
答案:A。上标表示目标坐标系,下标表示源坐标系,\(T_B^A\) 是把 B 系下的点变换到 A 系。这就像把“激光雷达坐标”翻译成“地图坐标”的翻译器。下标/上标顺序记反,是初学 TF 时最常见的错误之一。
Q9. 关于 RViz2 的传感器数据可视化,下列表述正确的是?
- A.点云适合显示3D激光雷达数据← 正确答案
- B.深度图像可以转换成点云← 正确答案
- C.地图只能用栅格方式显示
- D.图像数据无需任何坐标变换
答案:AB。PointCloud2 就是为 3D 激光雷达和深度相机设计的点云格式;深度图通过相机内参可以转成点云。地图在 RViz2 中通常以占据栅格(OccupancyGrid)显示,但不是唯一形式,说“只能”过于绝对。图像要叠加到 3D 场景也需要坐标系变换,所以 D 错误。
Q10. 要查看机器人所有坐标系的父子关系树形结构,应使用哪个插件?
- A.TF 显示插件← 正确答案
- B.Grid 网格插件
- C.Marker 标记插件
- D.RobotModel 插件
答案:A。TF 显示插件会把所有坐标系原点绘制在 3D 视图中,并展示它们之间的连接关系,直观呈现 TF 树。Grid 只画地面网格,Marker 用于自定义标记,RobotModel 只显示机器人模型本身,都不负责坐标系关系。