☰
ROS2期末测评设计全解析:从命题思路到实操考核
2026/9/30 1:39:32 网站建设 项目流程

1. 试卷设计的出发点:为什么期末测评必须跟上ROS2

带完这学期的《ROS机器人程序设计》,期末测评我直接把整套试卷从ROS1平移到了ROS2。不少同行问过我:课程大纲还没换,教材还是ROS1的经典版本,期末突然考ROS2,学生受得了吗?其实这个决定我在开课之前就想清楚了。

先说一个现实:工业界和学术界迁移到ROS2的速度比我们想象中快得多。从搜索趋势也能看到,ros2教程、ros2安装、ros2 humble这几个关键词的热度已经全面压过ROS1,甚至ros2菜鸟教程、ros2入门到实践pdf这类入门检索量在持续上涨。学生毕业出去面试,笔试题里问的已经不只是“ROS1的Publisher怎么写”,而是“ROS2的话题QoS怎么配”、“DDS发现机制会不会有网络隔离问题”。课程内容如果还固守在ROS1的roscore和catkin上,学生到岗位上再补ROS2,成本就高太多了。

但“跟上ROS2”不是简单把CMakeLists从catkin换成ament_cmake就完事。ROS2的架构变化是体系性的:没有master节点,节点发现走DDS;编译构建变了,运行启动变了,参数系统变了,甚至消息传递的实时性和可靠性模型也变了。所以期末测评如果不重新设计,还是拿ROS1的思路出一张卷子,那测出来的只是“有没有背过ROS1概念”,完全测不出学生在ROS2体系下的真实动手能力。

这份试卷我自己定位成“能力测评”,不是“知识记忆测评”。整张卷子满分100分,其中40分选择填空考基础概念和机制理解,30分是简答和读代码分析,剩下30分全部落在实操题上——现场在Ubuntu环境里写节点、编包、跑通通信和仿真。实际操作里我又加了5分加分项,涉及话题QoS调优和Nav2导航参数观察,给学生一个冲刺空间。

这篇文章我会把整套试卷的命题思路、考点分布、评分标准和实操题的设计逻辑完整拆出来,同时附上我在命题和阅卷过程中踩过的坑。无论你是正在带ROS课程的老师,还是想自我检测ROS2水平的开发者,这份内容都能直接拿走用。

2. 整体命题思路:测什么、不测什么、为什么

2.1 知识维度怎么取舍

期末考试最怕的就是“什么都想考”。ROS2的体系庞大到一本书都装不下,一份试卷必须做减法。我围绕一个标准来判断:这门课结课后,学生走上实际开发岗位,哪些知识点是必须立刻用得上的?

按照这个标准,第一优先级是“通信机制”。ROS2里话题(Topic)、服务(Service)、动作(Action)是三个最基础也最高频的通信原语,几乎所有机器人的感知、决策、控制代码都建立在这三者之上。第二优先级是工程化能力:colaun build的包管理方式、Launch文件编排多节点、参数系统动态配置。第三优先级是工具链:RViz2可视化、Gazebo仿真、Nav2导航栈的使用。至于DDS底层协议细节、FastDDS封装层源码、跨平台移植这类进阶内容,我选择放进加分题而不是必答题。

这里有一个非常重要的命题取舍:不考ROS1和ROS2的差异对比。很多老师喜欢出“ROS1和ROS2的架构区别是什么”这种题目,但我的实际经验是,这种题考出来,学生答得全都是背的概念条目,根本反映不出真实理解程度。更关键的是,这学期的学生一开始学的就是ROS2,他们没有ROS1的迁移负担,硬扯ROS1反而会干扰知识体系的完整性。

2.2 难度梯度设计成“三段递进”

整份试卷我设置了三个难度层级,形成爬坡结构:

  • 基础层(约35分):覆盖节点、话题、服务、动作的“是什么”和“怎么用”,题型为选择、填空和简答,目标是筛掉“完全没学过”的人。
  • 应用层(约30分):给出一个功能描述,让学生选择正确的实现路径,或者给出残缺代码,让学生补全并说明原因。这层的重点是“理解之后会用”。
  • 综合层(约30分笔试+实操):笔试部分是一道大型读图读码题,给出一个多节点协作的机器人系统描述,要求画出数据流并指出潜在风险;实操部分要求现场完成一个完整的通信闭环,包含自定义消息和动态参数调整。

加分题5分单独放在最后,涉及FastDDS封装层、micro-ROS与嵌入式平台集成、多机通信网络配置这些内容。说实话,这些内容课内只是提过一嘴,能做出来的学生基本上是自己课后深入研究过的,这5分就是给这类学生留的。

2.3 题型结构安排

我设计的时候反复斟酌过题型比例。纯客观题(选择、填空)好处是阅卷客观、便宜,坏处是考察不了深度。纯主观题(简答、分析)能考察深度,但学生写起来累,阅卷也累。最终敲定的题型结构如下:

题型题量分值考查重点
单选题10题20分概念记忆、机制判断
填空题10空10分命令、参数、API掌握
简答题3题15分机制解释、方案设计
读代码分析题1题10分代码理解、Bug排查
综合应用题1题15分系统设计、数据流分析
实操题1题30分环境搭建、节点编写、通信闭环、Launch编排

选择题为什么出10道,不搞成20道?因为我需要留出足够时间让学生做实操。实操题要求学生现场在机器上操作,如果前面的笔试题量过大,学生为了赶时间会导致实操环节仓促,那就本末倒置了。期末测评不是要把学生考倒,而是要让每个层次的学生都有机会展现出自己真实水平。

3. 核心考点解析:每一类题目背后的能力要求

3.1 话题机制:不只是“发消息”而已

话题(Topic)是ROS2通信的基础,但很多学生学完一整学期,对话题的理解还停留在“一个节点发、一个节点收”的玩具层面。所以试卷里关于话题的题目,我不会直接问“话题是什么”,而是换着角度考“话题对了没有”。

比如有一道选择题是这样设计的:一个发布者节点设置了Reliable QoS,接收者节点设置了BestEffort QoS,问两者通信行为是什么。这道题的正确选项是“通信可能正常但存在数据丢失风险”。很多学生看到“BestEffort本来就是丢数据的”就直接选了这个,但实际上DDS的QoS兼容策略里,发布端的Reliable和订阅端的BestEffort可以建立连接,只是订阅端不要求可靠性,所以发布端不会重传。这就是我前面说过的,只背概念的人在ROS2里寸步难行,因为实际情况跟教科书上那句“QoS不匹配就通信失败”不完全一样。

还有一道填空题让学生补全命令:ros2 topic echo /scan,考查的是对常用调试命令的熟悉程度。这道题本身不难,但延伸了一个问题:ros2 topic list -t和ros2 topic info分别输出什么,有什么区别。用过的人一眼就能答出来,没用过的只能靠猜。

我给学生的复习建议是:话题这块不要只背API,直接用命令行实操一遍。开两个终端,一个跑发布者,一个跑ros2 topic echo,然后故意把消息类型写错,看看报错信息长什么样。亲眼看一次报错,比背十遍API都管用。

3.2 服务与动作:考“何时用”比考“怎么用”更难

服务(Service)和动作(Action)是很容易被学生混在一起的两个概念。两者都是请求-响应模式,但服务是短任务同步调用,动作适合长任务且支持取消和进度反馈。我在简答题里直接出了一道场景判断题:给定三个机器人应用场景,让学选择用服务还是动作,并说明理由。

这三个场景我特意选得有区分度:

  • 场景A:机械臂运动到指定角度后反馈结果(动作)
  • 场景B:实时查询电池电量,立刻返回当前数值(服务)
  • 场景C:地图保存,点击后等待保存完成(服务)

机械臂运动这个场景是最容易混淆的。很多学生看到“机械臂运动”就觉得时间很长,应该用动作,但他们忽略了题目里强调了“运动到指定角度后反馈结果”——这个描述更接近“单个目标点的运动”,本质上是一个有反馈的请求-响应过程。真正需要动作的是“连续到达多个路点、支持取消和进度反馈”的场景。

这类题我最想传达的信息是:学ROS2的关键不是记住每个API的签名,而是理解每个通信原语适合什么场景。实际项目中,通信方式选错了,后面整个系统都要重构。我在阅卷时特别欣慰的是,不少学生能答出“动作包含目标、反馈、结果三个通道,而服务只有请求和响应”,这说明他们对Action的结构理解是到位的。

3.3 命令行与工程基础:学ROS2先学“命令行直觉”

说实话,现在很多学生一上来就被安装教程和“菜鸟教程”里的密集命令给劝退了。但ROS2日常开发根本绕不开命令行:构建要colcon build,调试要ros2 topic echo,看节点要先ros2 node list。一个连ros2 pkg create都用不利索的人,后面写再多代码也很难驾驭系统。

所以我在试卷里单独留了一块命令行与工程基础题,考点包括:

  • colcon build的构建流程:先source什么,后source什么,--packages-select参数怎么用
  • ros2 run和ros2 launch的区别
  • ros2 param set动态修改参数的用法
  • 如何查看话题消息类型定义(ros2 interface show)

填空题里有一道我印象很深:让写出一条命令,在已启动talker节点的前提下,查看该节点的完整信息。正确答案是ros2 node info /talker。这道题的正确率在75%左右,不算高,因为很多学生只记得ros2 node list能看节点列表,但不知道ros2 node info能看节点的订阅、发布、服务等详细信息。这类命令不是背就能背下来的,真的得在终端里用过几次才有肌肉记忆。

4. 实操环节实录:一套可直接复现的测评流程

4.1 环境准备与考场布置

实操题是这套试卷的重头戏,也是我花时间最多的部分。考场环境我提前一周做了完整验证,每一台机器都满足以下条件:

  • Ubuntu 22.04 + ROS2 Humble(部分机器装了Jazzy,我统一要求用Humble版本,避免DDS发现和兼容性问题干扰考试)
  • 已安装:ros-humble-desktop(完整桌面版)、gazebo、nav2相关包
  • 每台机器提供一份不带答案的“命令速查卡”,只列命令名不列用法

这个速查卡的设计有个小心机:让学生不至于因为忘记某个命令的具体拼写而卡死,但又不会因为看到用法提示而直接抄答案。实际考试中,我发现确实有帮助:不少学生看到ros2 interface show这个命令名,就自己想到了怎么查消息字段,而不是死记硬背。

实操考试的总时限是60分钟,独立完成。评分标准我分解成五个阶段,每阶段有明确的得分点:

阶段任务分值
环境确认创建功能包、确认编译环境可用4分
消息设计定义自定义消息并完成编译6分
节点编写实现发布者节点和订阅者节点10分
运行验证启动节点并验证通信6分
扩展细节加入参数系统与Launch文件4分

4.2 实操题目全貌:从零创建一个速度监视系统

这个实操题是整套试卷里我最满意的设计:让学生用ROS2实现一个简单的“速度监视系统”,具体任务是:

创建一个名为speed_monitor的功能包,实现两个节点:speed_publisher周期发布机器人当前速度(float32类型,发布频率10Hz),speed_checker订阅速度话题,当速度超过阈值(默认2.0 m/s)时打印警告信息。要求:速度消息使用自定义消息类型SpeedMsg;通过参数系统控制阈值,并能在运行时修改;使用Launch文件同时启动两个节点。

考察点隐藏在每一个细节里:

  • 自定义消息:需要学生熟悉msg文件的编写格式、CMakeLists和package.xml中rosidl_generate_interfaces的声明、以及后续#include的路径关系。这是ROS2中非常基础但极其容易被忽略的一环。
  • 参数系统:declare_parameter、get_parameter以及运行时ros2 param set的使用。这里有个隐藏考点:参数是在节点启动时从__params文件或命令行加载的,但如果在代码里没写declare_parameter,ros2 param set会报错。
  • Launch文件:至少要会写最简单的Python Launch,能正确用Node启动两个可执行文件。要不要写到group作用域或namespace我没有强硬要求,写得出来算加分素养。

4.3 我在阅卷时看到的真实答案

实操题的阅卷过程最有意思,能看到学生真实的上手水平。我挑几个典型情况说一说。

最快的学生15分钟就完成了所有必做项,还额外实现了“速度超过阈值后持续打印,恢复后停止打印”的逻辑,并在Launch里加了parameters参数。这种学生很明显平时在实验室里没少练。

中等水平的学生卡点集中在两个地方:一是rosidl_generate_interfaces注释了之后忘记重新colcon build,导致编译报“找不到头文件”;二是rclpy和rclcpp混用,用C++写了节点却在Launch文件里试图用ExecuteProcess启动Python脚本。这类问题其实很好排查,但考场上的学生容易慌,一慌就去改代码,而不是先看报错信息。

有30%左右的学生没能完成自定义消息部分,退而求其次直接用std_msgs/msg/Float32完成了通信闭环,并在答题纸里注明了“已改用标准消息类型”。这在我评分时是给部分分数的,因为题目核心考察的是“能不能写通一个Publisher-Subscriber闭环”,自定义消息是加分项但不是唯一路径。能灵活变通本身也是能力。

提示:在这里我要特别强调,设计实操题时必须给自己留出“容错空间”。考的不是学生能否一字不差照搬课堂示例,而是能否用已有的知识解决问题。宽松评分不等于放水,而是让测评本身更公平。

4.4 实操环节的现场观察与打分技巧

60分钟的实操对监考老师来说也是一种考验。我总结了几个实操监考的经验:

第一,不要全程盯着学生屏幕看,那会给学生制造极大心理压力,还会让部分学生直接放弃思考。我的做法是:前20分钟巡视一遍,重点看环境有没有问题;中间段看表现异常的学生是否卡在某一步;最后10分钟提醒剩余时间。巡视过程中发现共性问题时,不要当场点名讲,考完统一反馈。

第二,评分表要提前设计好,不能等考完再凭印象打分。我用的评分表就是在上面那张表格基础上细化的,每完成一个阶段就当场记录。有个细节:让考生在终端里运行ros2 topic echo看到自己发的话题内容,这一步我会现场确认他们确实看到了消息,而不仅仅是代码写对了。因为这个过程本质上验证了整个工具链是通的。

第三,一定要准备“备用题”。如果有学生提前提交或者某台机器死机严重,我会从备用题库里抽同难度题目临时替换。备用题与主考题的考点结构和难度系数保持严格一致,避免不公平。

5. 试卷引发的教学反思:从测评反推课程设计

5.1 平时作业和期末测评要形成闭环

这份试卷出完之后,我做了个对照实验:翻出这学期所有的平时作业题,逐一核对期末卷考点覆盖率。结果有点意外——平时作业里“自定义消息接口”只出现过一次,“Launch文件”只出现过两次,而期末卷里这两个考点都比较突出。这暴露了一个问题:期末考试如果考了平时没有巩固过的知识点,测出来的是“临场突击能力”而非“真实掌握度”。

这种情况在下一轮课程里必须纠正。我现在已经调整了平时作业设计:每一次课后作业安排一个“命令速查”小任务,强制学生在终端里跑命令、查消息、看节点信息,而不是只交代码。一个学期下来如果学生能养成“有问题先ros2 --help”的习惯,期末实操题基本就不会慌。

5.2 从阅卷数据看,学生最薄弱的三个环节

我统计了这次期末卷的答题数据,学生表现最薄弱的三个环节非常集中:

  • QoS设置与行为理解:全班正确率只有42%。很多学生能说出来QoS有哪些策略,但不知道Reliable和BestEffort在什么场景下用。这说明课堂教学里对QoS的讲解还是停留在概念层面,缺少实际部署实验。
  • Launch文件结构:简答题里有一问是“Python Launch文件和XML Launch文件各自优缺点”,大部分学生只能答出“Python更灵活”,但对IncludeLaunchDescription、GroupAction、TimerAction这些核心结构没有任何概念。
  • 动作与服务的区分:前面说过的场景判断题,全班正确率55%。主要错因是“看到长时间任务就选Action”,说明学生没有真正理解Action的“可取消、可反馈、多目标”这几个本质特征。

这些数据我会直接带进下一轮课程的设计里。比如在讲通信机制时,我会增加一个专门的“通信方式选型对比实验”:同一任务分别用Topic、Service、Action各实现一次,让学生亲手体会到三种方案在代码结构、延迟、可靠性、实时反馈上的差异。等到期末再考这类题,他们的答案会扎实很多。

5.3 给想自学ROS2的读者的建议

如果你不是课程班的学生,而是自己在跟着教程学ROS2,这份试卷的考点其实也给你划了一条自学路径。我强烈建议你按下面这个顺序自我检测:

  1. 能不能不查资料写出一个完整的Publisher节点(含Launch文件)?
  2. 能不能用一个自定义消息类型走通发布-订阅闭环?
  3. 能不能用参数系统在运行时改掉某个节点里的参数?
  4. 能不能用ros2 topic、ros2 node、ros2 param命令族排查一个“看似正常但实际没通”的通信问题?
  5. 能不能用RViz2显示机器人模型?用Gazebo加载仿真环境?

这五条如果都能做到,你的ROS2基础就非常扎实了。做不到也没关系,把问题拆开,逐个练习。我在带学生的过程中发现,“不会”通常不是能力问题,而是练得太少。ROS2的学习曲线确实陡峭,但它的反馈也很即时:代码对不对、通信通没通,终端里几秒钟就能看到结果。这种即时反馈本身就是一个很好的学习循环。

6. 加分题与后期扩展:ROS2的进阶道路怎么走

6.1 加分题:检验“超出课堂的能力”

加分题我出在了试卷末尾,满分5分任选一题作答:

  • 第一题:说明ROS2中使用FastDDS作为默认DDS实现时,多机通信需要做哪些网络配置,原因是什么。
  • 第二题:给出一个micro-ROS在ESP32上的运行流程,说明它和标准ROS2节点之间的通信原理。

这两道题课内都没有系统讲,但都是行业社区里热度不低的话题。FastDDS那个方向,搜索热词里能看到不少开发者在问“fastdds ros2 封装层”相关的问题;micro-ROS也一直是嵌入式与机器人交叉领域的热点,docker microros ros2 humble vscode platformio esp32这套组合在开源社区里非常活跃。

最后统计,有大约20%的学生尝试了加分题,其中一半能答出基本要点,但真正能写出完整配置流程和原理的学生很少。这个数据我认为是健康的:说明有一定比例的学生具备“课后自主探索”的习惯,也说明作为老师,我需要在课堂里适当引入更多实战细节来引导学生深入。

6.2 从期末测评到项目制考核的路径

这次期末测评完成后,我最大的体会是:试卷题型再丰富,也只是一个静态的测评工具。ROS2是门实践科学,真正的高阶能力必须靠项目驱动才能培养起来。

所以我计划在下学期做一次教学改革:把期末测评从“一次答题”改成“期末测评+项目验收”双轨制。期末测评保留客观题和基础实操,侧重检测个体知识掌握度;项目验收以小组为单位,做一个小型机器人应用(例如在Gazebo里用Nav2让机器人自主导航到指定点),项目完成度和代码质量单独评分。

这个改动会给教学工作带来很多额外工作量——项目评审、代码审查、小组答辩都需要提前制定标准。但我认为非常值得。原因很简单:一个学生在期末卷子上能把“速度监视系统”写得再完美,也说明不了他能独立完成一个真实机器人导航任务。而后者才是《ROS机器人程序设计》这门课真正应该赋予学生的能力。

6.3 后续的方向:从仿真到真机,从单机到多机

如果你已经能轻松通过前文的自我检测清单,可以尝试往更实际的方向扩展。我看到搜索热词里有人问livox avia配置使用ROS2、d435i在ROS2下的驱动,这些说明越来越多的人开始把ROS2接到真实传感器上。从我的经验看,仿真里的节点拿到真机上跑,至少会多出三层问题:硬件驱动的正确性、传感器数据的坐标系对齐、实时性能的保障。这些问题每一个都值得作为一个星期的学习任务来攻克。

另一个方向是多机协作。ROS2的DDS天生支持分布式部署,但这也意味着你必须在懂底层网络的前提下配置好发现机制、共享通信域、跨设备权限管理。我曾经在一个四机器人编队的项目里被“节点互相发现不了”这个问题折磨了近两天,最后排查下来是因为四台机器不在同一个网段,ROS2的Discovery Server默认只在本网段广播。这些经验很难从教科书里学到,也恰恰是ROS2开发中真正拉开水平差距的地方。

我个人在实际教学中的体会是:ROS2的学习和考核,都不该以“能背多少概念”为目标。真正值得追求的能力,是当你面对一个从未见过的机器人功能需求时,能冷静拆解它、用ROS2的工具链实现它、出了问题能快速定位它。这份期末试卷是我的一个探索,希望对你设计自己的课程考核,或者规划自己的ROS2学习路线,都能提供一些可参考的思路。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询