外观
视觉组笔试题
RoboMaster视觉组招新测试题(基础)
致机器人爱好者:
你好!欢迎来到RoboMaster视觉组的测试。
这份测试题旨在考察你的编程基础、逻辑思维和学习新知识的能力。每个关卡都模拟了机器人在执行任务时的一个小侧面,让你能初步体验到用代码驱动机器的乐趣。
我们不要求你现在就精通所有知识。请将互联网和AI当作你的“指导”,大胆地去搜索、学习并实践。我们更看重你解决问题的过程和代码的清晰度。
请将每个关卡的的代码分别存放在你的Git仓库中,并为每个关卡编写一份简单的README.md/README.pdf
来说明你的思路。完成后,将仓库访问权限分享给负责的学长学姐。(仓库地址请在填写申请表单时写上去)
注意:
对于AI的使用我们不做限制。
部分题目我们不做强制的代码形式要求,但是需要你写出伪代码和思路。
核心考核要求:统一的测试与验证方式
为了保证评估的公平和高效,我们要求所有编程任务都提供一个统一的、自动化的测试方式。
- 对于每个编程任务,你必须提供一个名为
test.sh
的Shell脚本。 - 这个脚本的功能是编译(如果需要)并运行你的程序,使用我们指定的正式测试文件作为输入。
- 学长学姐在评估时,会直接进入每个任务的文件夹,执行
bash test.sh
来验证你代码的正确性。
期待看到你的成果。
第一部分:理论理解题
背景: 在动手之前,我们希望你对RoboMaster视觉组的工作和相关技术有一个基本的认识。
任务: 请仔细阅读《了解CV和RoboMaster视觉组》文档,并根据你的理解回答以下问题(请将答案写在task1_theory/README.md
中):
文档中提到了“小陀螺”是赛场上的一种经典战术,请简述它为什么会给传统的自瞄算法带来巨大挑战?
在使用传统视觉方法识别装甲板时,文档中提到通常需要降低相机曝光。请结合你自己的理解,解释为什么低曝光设置对提取亮着的灯条特征更有利?
文档花了很多篇幅介绍为什么视觉开发推荐使用 Ubuntu (Linux) 系统而不是Windows,请总结一下作者给出的至少三个主要理由。
请用你自己的话,简要描述图像分类 (Image Classification) 和目标检测 (Object Detection) 这两个任务的核心区别是什么?
文档提到,由于镜头制造工艺等原因,相机会产生“畸变”(Distortion)。请用你自己的话简单描述什么是图像畸变,以及为什么在进行精确测量前,我们需要对相机进行标定(Calibration)?
solvePnP
是视觉组进行位姿估计的核心函数之一。请阐述:
solvePnP
函数的主要作用是什么?谈谈自己对于PnP的理解。卡尔曼滤波器。
请阐述:为什么在进行目标运动预测时,需要使用卡尔曼滤波器这类工具,而不是简单地用两帧之间的位置差来计算速度?它在机器人运动预测任务中主要解决了什么问题?
第二部分:工程师的工具箱
背景: 每一位工程师都需要一套称手的工具。本关旨在熟悉最基础的开发环境与版本控制。
任务:
- 环境搭建: 在你的系统上,通过命令行安装
git
,build-essential
(包含g++
编译器) 和cmake
。 - 代码仓库建立: 创建一个Git仓库。在仓库中,创建一个名为
task2_tools
的文件夹。 - 第一个小程序: 在该文件夹内,编写一个C++或Python的 "Hello, RoboMaster!" 程序。
- 版本记录: 将你的代码提交到Git仓库,并写下有意义的提交信息。
- 测试要求: 你的
test.sh
脚本应能编译(如果需要)并运行该程序。
注意:
如果你未能成功利用wsl/docker/vmware/双系统创建属于你的linux开发环境,请忽略测试要求中说的*.sh
文件,但是要在你的每一个项目的readme文件里写好所需编译构建执行命令。
第三部分:战术指令系统
背景: 机器人需要接收并解析明确的指令才能行动。本关旨在考察你的基础编程和数据处理能力。
C++ 方向
指令日志分析器:
任务: 编写一个C++程序,它接收一个命令行参数作为日志文件的路径,读取该文件,统计并打印出每种指令各自执行了多少次。
测试 请在你的项目中创建
commands.log
文件,并使用以下内容作为测试数据:MOVE SHOOT MOVE SCAN SHOOT MOVE SHOOT
测试要求: 你的
test.sh
脚本应能编译程序,并像这样运行它:./your_program_name commands.log
Python 方向
机器人状态配置:
任务: 编写一个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
第四部分:战场寻路(不强制要求代码形式)
背景: 在复杂的环境中,机器人需要能够自主规划路径以躲避障碍。
任务:寻找安全路径
场景: 给定一个由
0
和1
组成的二维地图,0
代表平地(可通行),1
代表障碍物(不可通行)。机器人只能在平地区域移动(上下左右四个方向),一次只能走一格。实现:
语言: 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.sh
或Makefile
应该能编译程序,并使用map.txt
和指定的起止点(例如,从 (0,0) 到 (4,4))来运行它。
第五部分:目标识别入门(编程语言:Python/C++)
背景: 视觉是机器人的核心感知能力。本关旨在让你体验如何从图像中提取有用信息。
任务一:识别敌方机器人颜色
实现:
输入: 请使用我们提供的标准测试图片
test_red_armor.jpg
。下载地址参考流程:
- 使用OpenCV加载图片。
- 将图片从BGR色彩空间转换到HSV色彩空间。
- 设定红色的HSV阈值范围,生成一个只包含红色区域的二值化掩码(Mask)。
- 显示原始图片和提取出的红色区域掩码。
任务: 编写一个程序,接收一个命令行参数作为图片路径,加载图片,设定红色的HSV阈值范围,最后显示原始图和处理后的二值化掩码图。
测试要求: 由于该任务需要显示窗口,学长学姐会手动运行你的程序进行验证,请在
README.md
中写明运行命令,例如:./your_program_name path/to/your/test_red_armor.jpg
。你的test.sh
脚本可以包含这个示例命令。
任务二:定位能量机关(ROI与形状检测)
实现:
输入: 请使用我们提供的能量机关模拟图
test_rune.png
。下载地址参考流程:
- 加载图片并进行灰度化和二值化处理。
- 使用OpenCV的
findContours
函数来寻找图中的所有轮廓。 - 通过一些简单的几何判断(例如,通过轮廓的面积和圆度)来筛选出最可能是圆形的那个轮廓。
- 在原图上用一个矩形框(Bounding Box)将这个圆形轮廓标记出来。
任务: 编写一个程序,接收一个命令行参数作为图片路径,加载图片,找到其中最可能是圆形的轮廓,并在原图上用矩形框标记出来后显示。
测试要求: 由于该任务需要显示窗口,学长学姐会手动运行你的程序进行验证,请在
README.md
中写明运行命令,例如:./your_program_name path/to/your/test_rune.png
。你的test.sh
脚本可以包含这个示例命令。
提交说明:
请将每个部分的解决方案分别存放在独立的文件夹中(task1_theory
, task2_tools
, ...),并提交到你的Git仓库。在每个文件夹内,请创建一个简单的README.md
说明你的思路和代码运行方式。记得将你的仓库访问权限给到学长学姐!
祝你一切顺利,期待在队伍里见到你!