ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ROS2期末测评试卷设计:从DDS架构到QoS实践的完整命题与解析

ROS2期末测评试卷设计:从DDS架构到QoS实践的完整命题与解析 期末测评这件事我最怕的就是两极化要么考成背书大会学生背完就忘要么直接甩一个大作业水分又太大。这几年带《ROS机器人程序设计》课程教学平台从ROS1切到ROS2之后我越来越觉得出题的核心矛盾变成了“怎么在120分钟里既考出学生对DDS架构的理解又考出他真正动手写过多少代码”。这里我把我在实际教学中反复打磨过的一套ROS2期末测评试卷完整放出来包括命题逻辑、完整题目、参考答案和评分标准最后还会聊聊阅卷时高频出现的问题。无论你是正在带ROS2课程的老师还是准备找机器人相关岗位、想找一份ROS2笔试题练手的学生这份材料都能直接拿来用。先对齐一个底层认知期末测评不是为了把学生考倒而是帮他把一学期学到的零散知识点串成一张网。所以这套试卷的出题逻辑不是“考核记忆”而是“检验迁移”——同一个知识点换一个他没见过的场景他还判断得出来该用什么工具、该走什么通信机制。我把这句话放在最前面是因为后面所有题目的难度梯度、题型比例都是围绕它展开的。1. 为什么这份期末试卷要这样出题命题逻辑与考察目标ROS2和ROS1最大的区别不是API更好看了而是整个通信架构换成了DDS。很多学生学完一学期能跑通小乌龟也能把launch文件写出来但你问他“为什么这个节点和那个节点连不上”他就开始犯迷糊。这说明大家普遍停留在“照着示例改”的层面没有真正理解消息从发布端到订阅端要经过哪些环节。所以我出这套试卷时第一个指导原则是至少70%的题目必须带实际场景。不能只问“ROS2的四大通信机制是什么”而要问“激光雷达数据回传和底盘控制指令分别该用Topic还是Service为什么”。学生答错的时候你能立刻定位他是哪一环没理解——是没搞清楚机制本身的特性还是不会做场景映射。第二个原则是分值向代码与综合应用倾斜。概念记忆题控制在30分以内代码与设计类题目占大头。道理很简单课堂上一带而过的东西学生也许能记住三五个名词但代码题能让真正写过节点的人和不写代码的人马上拉开差距。第三个原则也是我特别想强调的要让“背会了答案但从没实践过”的学生露馅。比如判断题里故意放“QoS设置不一致的两个节点一定可以通信”这种说法如果学生只背过“QoS是服务质量策略”这句话他大概率判断成对但凡是在DDS里实际调试过两个节点通信、被兼容性规则卡过的人都会毫不犹豫画错。2. 试卷总体结构与分值分布的设计思路还是先把整张试卷的框架给出来方便老师直接拿去排版或者调整。试卷满分100分建议考试时间120分钟。实际教学中我把整张卷子设计成五个大题块题块题型题量与分值主要考察能力第一部分单项选择题10题×2分20分基础概念辨析、命令与机制对应关系第二部分判断题10题×1分10分易混淆知识点快速鉴别第三部分简答与原理分析3题共26分架构理解、场景选型、QoS应用理解第四部分代码与实操2题共24分读代码、改代码、写服务节点第五部分综合应用设计1题20分系统架构设计与通信选型综合能力这里有一个值得说明的平衡点前两个大题总共才30分但知识点覆盖面最广几乎把一学期的全部内容都扫了一遍。后面的简答题和代码题分值大但目标非常集中就是要看学生能不能把Topic、Service、Action、QoS这些核心概念放到真实问题里去用。我建议老师们不要压缩这部分分值因为从阅卷效率来看大题比选择题更容易看出学生的真实水平。时间分配上我会建议学生10分钟做完选择题和判断题40分钟完成简答题40分钟做代码题最后30分钟留给综合应用题。这样能避免在一道题上死磕导致后面的大题整道放空。3. 试卷原文上基础概念题与简答分析题下面进入试卷正文我把题目按考场顺序完整列出来各位可以直接复制改编。3.1 第一部分单项选择题每题2分共20分在ROS2的体系架构中节点之间进行实时通信所依赖的中间件层是 A. WebSocket B. DDS C. HTTP/2 D. 基于TCP的自研封装协议关于Topic与Service的对比下列说法正确的是 A. 话题是异步的、支持一对多通信服务是同步的、通常为一对一通信 B. 话题是同步的、支持一对多通信服务也是同步的、只能一对一通信 C. 话题只能由一个节点发布服务可以由多个客户端同时调用 D. 话题和服务本质上没有区别只是名称不同想查看当前系统中所有正在运行的节点正确命令是 A. ros2 topic list B. ros2 node list C. ros2 service list D. ros2 action list在ROS2功能包的CMakeLists.txt中声明一个可执行文件目标的正确指令是 A. find_package() B. add_executable() C. ament_target_dependencies() D. install()某激光雷达节点发布点云数据应用端订阅后只做实时可视化允许少量丢包。此时合理的QoS策略是 A. RELIABLE KEEP_LAST B. BEST_EFFORT KEEP_LAST C. RELIABLE KEEP_ALL D. TRANSIENT_LOCAL KEEP_ALL关于ROS2中的Action机制下列说法错误的是 A. 客户端可以实时收到服务端的进度反馈 B. 客户端可以在动作执行过程中发送取消请求 C. Action内部基于话题实现反馈所以本质上仍是单向通信 D. Action适合用于机械臂运动控制这类耗时较长的任务在URDF文件中描述两个连杆link之间运动约束关系的是 A. material 标签 B. joint 标签 C. gazebo 标签 D. sensor 标签一个启动文件launch file的主要作用是 A. 编译节点源码 B. 同时启动多个节点并配置参数 C. 记录节点日志 D. 修改ROS2的DDS环境变量使用tf2查询两个坐标系之间最新坐标变换关系的命令是 A. ros2 run tf2_echo B. tf2_echo C. ros2 run tf2_tools tf2_echo D. ros2 tf2 echo关于ROS2参数Parameter下列说法错误的是 A. 参数属于节点级别不同节点的参数相互独立 B. 参数可以在节点运行时动态读取 C. 参数只能通过launch文件在启动前配置 D. 参数支持基本数据类型以及数组类型3.2 第二部分判断题每题1分共10分同一个ROS2节点可以同时发布多个不同话题。 一个节点只能属于一个功能包。 使用colcon构建完功能包后必须source install/setup.bash新构建的节点才能被ros2 run找到。 DDS的发现协议能够在同一网络中自动发现节点不需要手动维护一份节点IP列表。 ros2 topic echo /topic_name 可以查看指定话题上正在传输的消息内容。 在ROS2中如果发布端和订阅端设置的QoS策略不兼容两个节点之间的消息无法正常收发。 URDF文件能够精确描述机器人在真实物理环境中的全部动力学特性。 ros2 bag命令可用于记录话题数据并在之后进行回放。 RViz2不仅可用于可视化传感器数据也可以配合Navigation2发送导航目标点。 在ROS2中不同节点间可以通过参数服务器直接共享同一个全局参数。 3.3 第三部分简答与原理分析题共26分请简述ROS2相较于ROS1在通信架构上的核心变化并从工程角度说明为什么ROS2选择DDS作为通信中间件。8分请分别给出Topic、Service、Action最典型的应用场景并为每种机制举一个机器人领域的实际例子。要求说明选择该机制的原因。8分小王在调试两台机器人之间的通信A机器人发布点云数据使用默认的QoSB机器人订阅时希望延迟尽可能低因此设置了BEST_EFFORT。结果发现数据时断时续。请分析可能的原因并说明点云/传感器数据与导航目标点这类指令数据分别适合怎样的QoS组合。10分4. 试卷原文下代码实操与综合应用大题两个代码题我用的是实际课堂上的微型案例尽量让学生能在纸上直接写出来不依赖电脑环境同时又能真实反映学生的编码熟练度。4.1 第四部分代码实操题共24分第1题12分发布者节点阅读与改造阅读以下Python代码import rclpy from rclpy.node import Node from std_msgs.msg import String class Talker(Node): def __init__(self): super().__init__(talker) self.publisher_ self.create_publisher(String, chatter, 10) timer_period 0.5 self.timer self.create_timer(timer_period, self.timer_callback) self.count 0 def timer_callback(self): msg String() msg.data fHello ROS2: {self.count} self.publisher_.publish(msg) self.get_logger().info(fPublishing: {msg.data}) self.count 1 def main(argsNone): rclpy.init(argsargs) talker Talker() rclpy.spin(talker) talker.destroy_node() rclpy.shutdown() if __name__ __main__: main()回答以下问题 1该节点的节点名是什么话题名是什么3分 2该节点的发布频率是多少写出计算过程。3分 3如果将这个节点在终端中运行两个实例会发生什么问题如果要让两个实例互不干扰有哪些改造方案6分第2题12分加法服务端节点设计请编写一个ROS2服务端节点的核心代码实现两个整数的加法。要求 1给出自定义服务接口的消息定义.srv文件内容4分 2给出节点的核心代码框架可以使用Python也可以使用C5分 3写出用命令行向该服务端发送一次请求的命令。3分4.2 第五部分综合应用设计题20分某仓储巡检机器人项目中有以下需求激光雷达以10Hz频率实时发布环境扫描数据导航模块负责规划路径并控制底盘移动机器人需要将自身状态电量、位置、运行模式周期性地上报给监控终端远程操作员需要随时向机器人下发暂停/恢复指令。请根据ROS2的设计思想完成以下任务 1画出该系统的节点与通信关系框图可用文字描述但必须清晰体现节点名称、通信机制、消息流向并说明每个节点的职责。6分 2针对“激光雷达数据”“机器人状态上报”“远程暂停指令”三类数据分别选择Topic、Service、Action中最合适的机制并说明理由。8分 3若现场WiFi网络不稳定为保证“远程暂停指令”可靠到达机器人端你会如何调整通信策略或系统设计6分5. 完整答案解析与评分标准这一节很关键因为不少题目的答案不是查一下就能出来的背后有原理。我把每道题的答案给出来并写明给分点方便老师直接作为标准答案使用。5.1 选择题与判断题答案选择题答案1-B2-A3-B4-B5-B6-C7-B8-B9-C10-C。第5题需要特别解释一下。BEST_EFFORT KEEP_LAST是典型的传感器数据方案。选项里有一个很强的干扰项是RELIABLE KEEP_LAST不少学生会选理由是“可靠性更高”。但点云可视化场景里丢掉一两帧完全不影响而RELIABLE会带来重传延迟反而让画面卡顿。这就是我前面说的“带场景的题”——只背概念不知道实时性与可靠性之间的工程权衡就会选错。第6题的错误点在C选项。Action确实内部用话题来传递反馈但“内部基于话题”不代表“本质上是单向通信”。Action的完整流程包括goal、feedback和result三部分是一个双向交互的过程C的说法把概念偷换了。第9题是唯一一个有一点版本差异的题因为tf2_echo的实际命令格式在不同发行版里略有不同。我在课上一直用的命令是ros2 run tf2_tools tf2_echo source_frame target_frame比如查询base_link在map坐标系下的坐标关系ros2 run tf2_tools tf2_echo map base_link答案选C。如果课堂里用的是另一种封装命令可以自行调整选项。判断题答案第1、2、3、4、5、6、8、9题为√第7、10题为×。第7题里URDF只能描述运动学层面的连杆关系、关节类型和可视化/碰撞属性无法精确描述真实物理世界中的动力学参数比如摩擦系数、材料阻尼这些要靠仿真插件里的参数去近似。第10题更关键ROS2去掉了ROS1里全局“参数服务器”这一概念参数是节点级私有资源虽然可以远程读写但不存在一个可以全局共享的参数池。这是ROS1到ROS2一个经常被忽略的架构差异。5.2 简答题评分要点第三大题第1小题参考答案要点ROS2用DDS取代了ROS1中节点对节点、依赖roscore的TCP/UDP通信机制2分节点不依赖中心节点即可完成分布式发现和通信系统没有单点故障2分DDS提供了丰富的QoS策略能满足不同数据类型的实时性和可靠性要求2分选型理由还可以强调DDS是OMG标准生态成熟支持实时通信可跨平台、跨语言互操作。2分只要能答出“去掉roscore”“分布式发现”“QoS”“工业标准”这四个关键词中的三个就能拿6分以上。第三大题第2小题参考答案要点Topic适合持续周期发布、多节点同时接收的数据流。例激光雷达点云、图像、IMU数据。2分机制特性1分例子1分Service适合一次性请求-响应、无持续数据流、需要返回结果的操作。例地图保存服务、路径规划服务、相机拍照服务。2分Action适合耗时较长、需要进度反馈、且可能中途取消的任务。例机械臂抓取、移动机器人导航到目标点、无人机飞向航点。2分说明选型时要看“数据是不是周期性流动”“是否需要返回结果”“是否可能中途取消”。2分第三大题第3小题参考答案要点点云发布端默认QoS是RELIABLE订阅端设置BEST_EFFORT在DDS的兼容规则下订阅端的BEST_EFFORT可以匹配发布端的RELIABLE但接收策略变成了尽力传输本来不丢的数据也可能被丢弃所以出现时断时续。4分传感器数据应使用BEST_EFFORT KEEP_LAST导航目标点、控制指令这类要求不丢失的数据应使用RELIABLE KEEP_LAST。4分如果发布端和订阅端的可靠性策略不匹配常见现象是数据传输质量下降或完全无法通信所以实际项目中要统一QoS配置。2分5.3 代码题评分标准第1题 1节点名是talker话题名是chatter。各1.5分共3分 2发布频率为2Hz。因为timer_period 0.5秒周期1秒除以0.5秒等于2次/秒即2Hz。3分 3同一终端运行两个实例时两个进程的节点名相同都是talker会导致节点名冲突。在ROS2中节点名必须唯一后者会无法正常注册或与前者产生命名冲突。3分改造方案一种是通过launch文件或remap机制为每个实例指定不同的节点名例如ros2 run package_name talker --ros-args --remap __node:talker2另一种是在代码中通过启动参数设置节点名称。两种方案都可以只要思路正确就给分。3分第2题答案要点 1在srv目录下创建AddTwoInts.srv内容为int64 a int64 b --- int64 sum这里要注意有些学生把“---”写成中文破折号要扣分。4分2Python核心代码框架5分import rclpy from rclpy.node import Node from my_pkg.srv import AddTwoInts class AddServer(Node): def __init__(self): super().__init__(add_server) self.srv self.create_service(AddTwoInts, add_two_ints, self.add_callback) def add_callback(self, request, response): response.sum request.a request.b self.get_logger().info(fIncoming: a{request.a}, b{request.b}, sum{response.sum}) return response def main(argsNone): rclpy.init(argsargs) node AddServer() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()评分点正确创建Node子类、正确调用create_service、回调函数返回response、正确初始化与spin、接口import语句正确各占1分。3命令行调用3分ros2 service call /add_two_ints my_pkg/srv/AddTwoInts {a: 1, b: 2}5.4 综合应用题评分标准第1题6分参考答案节点如下学生画出来即可得分激光雷达驱动节点lidar_driver接收雷达原始数据发布点云或scan话题定位与导航节点nav_node订阅scan与地图数据发布速度指令控制底盘状态上报节点status_node周期性读取电量与位置信息发布到状态话题远程控制接收节点cmd_node订阅或服务方式接收远程暂停/恢复指令并转发给导航节点底盘驱动节点base_controller订阅速度指令通过硬件接口驱动电机。只要框图能体现“节点-机制-数据流”三层信息即使节点命名不同也正常给分。只写节点不写通信方式的最多给3分。第2题8分参考选型与理由激光雷达数据Topic。理由10Hz连续数据流多个下游节点导航、可视化、避障都要订阅天然适合发布-订阅模型。3分机器人状态上报Topic。理由状态信息是周期性数据监控端可以订阅如果监控端需要主动拉取最新状态也可以考虑Service。这里答Topic或Service只要理由充分都算对但必须说明选型依据。3分远程暂停指令Service。理由这是一个一次性的、需要后端确认的指令操作员发送后需要知道机器人已经进入暂停状态。也可以用Action实现但在这里Service已经足够。2分第3题6分常见高分答案将暂停指令从普通Service升级为RELIABLE KEEP_LAST的QoS配置同时增加确认机制收到指令后回复确认2分在机器人端加一个看门狗机制如果超时没有收到来自远程端的“心跳”包机器人自动进入安全暂停状态2分在远程端和机器人端引入带持久化队列的缓存机制保证弱网断线重连后指令不丢失。2分这个题的核心是让学生理解通信机制的选型不是一成不变的QoS、冗余确认、安全策略都可以根据场景叠加。6. 阅卷中的高频错误与复习盲区每学期批完这套卷子我都会把学生的错误分类记录一下。这几年出现频率最高的问题很有代表性我单独拿出来说说。6.1 命令混淆四类查询工具分不清很多学生到期末了依然分不清ros2 node list、ros2 topic list、ros2 service list、ros2 action list这四条命令分别负责查询什么。这说明他对“节点-话题-服务-动作”四个概念的实体还没有建立清晰的心智模型。我给这类学生的建议很笨但有效在装了ROS2的机器上开着Turtlesim例程把四条命令轮流敲一遍对照屏幕变化去记比背十遍笔记都强。6.2 通信机制选型缺一个“为什么”学生能背出“Topic是异步的Service是同步的”但一到应用题比如远程暂停指令该用哪个很多人会条件反射式地选Topic理由是“之前写代码都是用Topic”。这背后是课堂教学重语法、轻需求分析的后果。现在我在课上会专门花一节课做“通信机制选型”的对比让学生拿到一个需求先回答三个问题是不是周期数据流要不要等结果要不要中途反馈6.3 QoS被误当作性能等级几乎每个班都有学生把BEST_EFFORT误以为“更高级”。实际上BEST_EFFORT只是允许多丢包、降低时延没有可靠性上的优劣之分。阅卷看到这类错误时我都会专门标注一句QoS是工程权衡不是性能排序。6.4 综合系统图不会画最可惜的一类是综合应用大题里写不出完整的系统框图。有的学生每个知识点都会但让他把激光雷达节点、导航节点、底盘节点、状态上报节点画在一起就乱了节点之间连的是话题还是服务也分不清。这说明他的学习是点状的没有串成面。所以我一直建议学生学完一学期后自己画一遍“我做过的最复杂项目的节点通信图”这张图能画清楚期末综合题基本不会失分。7. 用这套试卷的几点补充经验最后分享几个操作层面的体会不一定写进标准答案里但对真正要拿这套卷子去用的人会有帮助。7.1 允许带一张A4纸的手抄笔记这几年我一直保留这个规定。原因是ROS2的命令数和API太多纯记忆性考核没有意义。允许带笔记后学生会把精力放在整理核心机制和代码模式上反而促使他们主动做知识结构梳理。从阅卷质量看带笔记并没有让平均分明显变高但低分层的学生普遍写得更有条理。7.2 代码题避开发行版专属API比如自定义服务接口的示例在ROS2的不同发行版里都能编译通过无非是cmake配置略有差异。我见过一些试卷把某个发行版特有的API当必考点导致没装对应版本的学生整道题崩掉。期末试卷考通用能力远比考版本差异有意义。7.3 考后讲评比考试本身更重要我会专门用一节课把每道题的出题意图讲给学生听尤其是第三大题第3小题QoS那道题。很多学生直到讲评才意识到自己在实际项目中明明遇到过通信时断时续的问题却从来没有往QoS匹配上去想。讲评完之后我让学生把第五大题重新做一遍作为平时分的补充效果比单纯对答案好得多。这套试卷我每个学期都会微调主要是把综合应用题的场景换成当前学生接触过的项目。如果你想要这套试卷对应的空白答题卡模板或者想交流QoS那道题的讲法可以留言我把手头的资源整理出来再写一篇。
返回列表