Skip to content

视觉组笔试题

2447字约8分钟

2025-09-08

RoboMaster视觉组招新测试题(基础)

致机器人爱好者:

你好!欢迎来到RoboMaster视觉组的测试。

这份测试题旨在考察你的编程基础、逻辑思维和学习新知识的能力。每个关卡都模拟了机器人在执行任务时的一个小侧面,让你能初步体验到用代码驱动机器的乐趣。

我们不要求你现在就精通所有知识。请将互联网和AI当作你的“指导”,大胆地去搜索、学习并实践。我们更看重你解决问题的过程和代码的清晰度。

请将每个关卡的的代码分别存放在你的Git仓库中,并为每个关卡编写一份简单的README.md/README.pdf来说明你的思路。完成后,将仓库访问权限分享给负责的学长学姐。(仓库地址请在填写申请表单时写上去)

注意:

  • 对于AI的使用我们不做限制。

  • 部分题目我们不做强制的代码形式要求,但是需要你写出伪代码和思路。

核心考核要求:统一的测试与验证方式

为了保证评估的公平和高效,我们要求所有编程任务都提供一个统一的、自动化的测试方式。

  • 对于每个编程任务,你必须提供一个名为 test.sh 的Shell脚本。
  • 这个脚本的功能是编译(如果需要)并运行你的程序,使用我们指定的正式测试文件作为输入。
  • 学长学姐在评估时,会直接进入每个任务的文件夹,执行 bash test.sh 来验证你代码的正确性。

期待看到你的成果。


第一部分:理论理解题

背景: 在动手之前,我们希望你对RoboMaster视觉组的工作和相关技术有一个基本的认识。

任务: 请仔细阅读《了解CV和RoboMaster视觉组》文档,并根据你的理解回答以下问题(请将答案写在task1_theory/README.md中):

  1. 文档中提到了“小陀螺”是赛场上的一种经典战术,请简述它为什么会给传统的自瞄算法带来巨大挑战?

  2. 在使用传统视觉方法识别装甲板时,文档中提到通常需要降低相机曝光。请结合你自己的理解,解释为什么低曝光设置对提取亮着的灯条特征更有利?

  3. 文档花了很多篇幅介绍为什么视觉开发推荐使用 Ubuntu (Linux) 系统而不是Windows,请总结一下作者给出的至少三个主要理由。

  4. 请用你自己的话,简要描述图像分类 (Image Classification)目标检测 (Object Detection) 这两个任务的核心区别是什么?

  5. 文档提到,由于镜头制造工艺等原因,相机会产生“畸变”(Distortion)。请用你自己的话简单描述什么是图像畸变,以及为什么在进行精确测量前,我们需要对相机进行标定(Calibration)?

  6. solvePnP是视觉组进行位姿估计的核心函数之一。

    请阐述:solvePnP函数的主要作用是什么?谈谈自己对于PnP的理解。

  7. 卡尔曼滤波器。

    请阐述:为什么在进行目标运动预测时,需要使用卡尔曼滤波器这类工具,而不是简单地用两帧之间的位置差来计算速度?它在机器人运动预测任务中主要解决了什么问题?


第二部分:工程师的工具箱

背景: 每一位工程师都需要一套称手的工具。本关旨在熟悉最基础的开发环境与版本控制。

任务:

  1. 环境搭建: 在你的系统上,通过命令行安装 git, build-essential (包含 g++ 编译器) 和 cmake
  2. 代码仓库建立: 创建一个Git仓库。在仓库中,创建一个名为 task2_tools 的文件夹。
  3. 第一个小程序: 在该文件夹内,编写一个C++或Python的 "Hello, RoboMaster!" 程序。
  4. 版本记录: 将你的代码提交到Git仓库,并写下有意义的提交信息。
  5. 测试要求: 你的 test.sh 脚本应能编译(如果需要)并运行该程序。

注意:

​ 如果你未能成功利用wsl/docker/vmware/双系统创建属于你的linux开发环境,请忽略测试要求中说的*.sh文件,但是要在你的每一个项目的readme文件里写好所需编译构建执行命令。


第三部分:战术指令系统

背景: 机器人需要接收并解析明确的指令才能行动。本关旨在考察你的基础编程和数据处理能力。

C++ 方向

  1. 指令日志分析器:

    • 任务: 编写一个C++程序,它接收一个命令行参数作为日志文件的路径,读取该文件,统计并打印出每种指令各自执行了多少次。

    • 测试 请在你的项目中创建 commands.log 文件,并使用以下内容作为测试数据:

      MOVE
      SHOOT
      MOVE
      SCAN
      SHOOT
      MOVE
      SHOOT
    • 测试要求: 你的 test.sh 脚本应能编译程序,并像这样运行它:./your_program_name commands.log

Python 方向

  1. 机器人状态配置:

    • 任务: 编写一个Python程序,它接收一个命令行参数作为配置文件的路径,读取该JSON文件,并将其中的信息格式化地打印出来。

    • 测试 : 请在你的项目中创建 config.json 文件,并使用以下内容作为测试数据:

      {
        "robot_name": "sentry_01",
        "health": 100,
        "ammo": 250,
        "enabled_modules": ["vision", "can_bus"]
      }
    • 测试要求: 你的 test.sh 脚本应能像这样运行它:python3 your_script_name.py config.json


第四部分:战场寻路(不强制要求代码形式)

背景: 在复杂的环境中,机器人需要能够自主规划路径以躲避障碍。

任务:寻找安全路径

  1. 场景: 给定一个由01组成的二维地图,0代表平地(可通行),1代表障碍物(不可通行)。机器人只能在平地区域移动(上下左右四个方向),一次只能走一格。

  2. 实现:

    • 语言: Python/C++。

    • 算法: 使用广度优先搜索 (BFS)深度优先搜索 (DFS) 算法。

    • 任务: 任务: 你的程序必须可以通过命令行接收参数,格式为:./your_program_name <map_file_path> <start_x> <start_y> <goal_x> <goal_y>

    • 正式测试文件 map.txt 内容: 请在你的项目中创建 map.txt 文件,并使用以下内容:(1为障碍物)如不能通行,需要输出“I can’t go to the postion (x,y).”(x,y为你输入的goal_x和goal_y)

      0 0 1 1 0
      0 1 0 1 0
      0 1 0 0 1
      1 1 0 1 1
      0 0 0 1 0
    • 输出: 程序需在标准输出打印出文本化的地图,并用 * 标记出从起点到终点的路径。

    • 测试要求: 你的 test.shMakefile 应该能编译程序,并使用 map.txt 和指定的起止点(例如,从 (0,0) 到 (4,4))来运行它。


第五部分:目标识别入门(编程语言:Python/C++)

背景: 视觉是机器人的核心感知能力。本关旨在让你体验如何从图像中提取有用信息。

任务一:识别敌方机器人颜色

实现:

  • 输入: 请使用我们提供的标准测试图片 test_red_armor.jpg下载地址

  • 参考流程:

    1. 使用OpenCV加载图片。
    2. 将图片从BGR色彩空间转换到HSV色彩空间。
    3. 设定红色的HSV阈值范围,生成一个只包含红色区域的二值化掩码(Mask)。
    4. 显示原始图片和提取出的红色区域掩码。
  • 任务: 编写一个程序,接收一个命令行参数作为图片路径,加载图片,设定红色的HSV阈值范围,最后显示原始图和处理后的二值化掩码图。

  • 测试要求: 由于该任务需要显示窗口,学长学姐会手动运行你的程序进行验证,请在README.md中写明运行命令,例如:./your_program_name path/to/your/test_red_armor.jpg。你的test.sh脚本可以包含这个示例命令。

任务二:定位能量机关(ROI与形状检测)

实现:

  • 输入: 请使用我们提供的能量机关模拟图 test_rune.png下载地址

  • 参考流程:

    1. 加载图片并进行灰度化和二值化处理。
    2. 使用OpenCV的 findContours 函数来寻找图中的所有轮廓。
    3. 通过一些简单的几何判断(例如,通过轮廓的面积和圆度)来筛选出最可能是圆形的那个轮廓。
    4. 在原图上用一个矩形框(Bounding Box)将这个圆形轮廓标记出来。
  • 任务: 编写一个程序,接收一个命令行参数作为图片路径,加载图片,找到其中最可能是圆形的轮廓,并在原图上用矩形框标记出来后显示。

  • 测试要求: 由于该任务需要显示窗口,学长学姐会手动运行你的程序进行验证,请在README.md中写明运行命令,例如:./your_program_name path/to/your/test_rune.png。你的test.sh脚本可以包含这个示例命令。


提交说明:

请将每个部分的解决方案分别存放在独立的文件夹中(task1_theory, task2_tools, ...),并提交到你的Git仓库。在每个文件夹内,请创建一个简单的README.md说明你的思路和代码运行方式。记得将你的仓库访问权限给到学长学姐!

祝你一切顺利,期待在队伍里见到你!

逐雁创新机器人实验室