Skip to content
This repository has been archived by the owner on Sep 7, 2023. It is now read-only.
Zijian Zhang edited this page Apr 8, 2023 · 19 revisions

第24届电子设计大赛赛题和规则v24.4.0

赛题背景

华清大学无线制动画系的王满继(Manji Wang)和蔡傥平(Tangping Cai)是一对(?)非常要好的大学室友。时运不齐,他们在上大学时遇到了反反复复的新冠疫情,无聊的二人无时不盼望传说中更开放、更自由的大学生活。

王满继平日惯于内卷,学习科研之余吃饭往往箪食瓢饮、惜时如金,他习惯吃外卖,总是把挤食堂排队的时间省给学习科研文体社工。蔡傥平则喜欢平日以最大支撑面蜗居于寝室地面以上约1.7m的高处,不大出门的他早已爱上以外卖为食。封校期间,外卖受限,这一对卧龙凤雏没了口腹之欲的这份满足,食不果腹,每日嗷嗷待哺,悲从中来。

作为无线制动画系的著名学生,他们想要改变这一切。蔡傥平主张以“封装”食堂饭菜的方式还原吃外卖的那份仪式感,而宽口径厚基础自动不息的王满继则期望以无人外卖配送车的方式满足这一需求。作为王满继大腿上摘不掉的小挂件,蔡傥平当即对这个天才般的想法表示支持。穷且益坚的两人决定搭建电动小车实现这个设想。

想到未来的蹭饭生涯增添了新的生机,蔡傥平的心都自动化了,他不禁幸福地把自己一下子扔在了床铺上。而一旁的王满继趁着这工夫已然拟好了一份无人外卖解决方案,请看——

场地说明

无人外卖车的活动场地是边长为254厘米的正方形,分为中央区域和周边区域。(即下文“技术细则”部分,1单位距离对应1厘米。)

中央正方形为中央区域,模拟外卖配送的主要服务范围(“城市区”),会生成外卖订单。

周边区域位于正方形边缘,模拟外卖配送的次要服务范围(“城郊区”),会生成外卖订单。内侧有间隔,双黑实线区域为分界线,小车不得触压或跨越,否则按相应标准扣分。四角上的圆弧区域,仅为小车转向参考,可以触压或跨越,但小车不得冲出场地最外侧边界。

中央区域与周边区域之间的正方形边界,四条边中央各有一个出入口,模拟出城通道。小车进出中央区域,均需由出入口出入。

流程简介

初赛中,每场比赛有一支队伍参加,只进行第一回合。每支队伍有三次比赛机会,其最高得分即为选手的最终得分,在所有队伍中进行排名。由于障碍物生成具有随机性,在每次比赛中,选手至多可以进行三次障碍物重新生成操作。

复赛中,每场比赛有两支队伍参加,分为两个回合,每个回合中两支队伍的小车分别先后上场运行,两个回合得分之和为选手的最终得分,两支队伍中得分高者获胜。在每次比赛中,若至少一方认为应当重新生成障碍物,裁判应进行障碍物重新生成操作,但至多进行五次。

每场比赛开始时,选手可将小车放置于周边区域任意位置待命,在上位机发送开始指令后,小车方可运动。

小车启动后,不再允许参赛队员通过直接接触或其他各种可能的方式控制小车,每次违反这一原则将获得一个惩罚标记。当小车无法自主地行动时,参赛队员可在得到裁判的允许后将小车手动移回出发点,并获得一个惩罚标记,并将回合计时暂停。手动移动过程不能改变场地上其他设施的状态。

第一回合:完成订单配送任务配送和充电站设置任务

小车需要根据上位机发送的信息自行规划路径,依次到达订单的起点与终点完成若干单外卖配送并获得分数。小车到达某一订单的起点拿取外卖,然后需在每单规定时间内到达相应的终点送出外卖。若某一订单配送超时,则将视超时情况减少能获得的分数。并且小车上同时携带外卖数量有限,当容量满时经过外卖起点也不会拿取外卖,必须先到达其中若干单的终点放下外卖才可以拿取。

第一回合中小车可以在场地上设置充电站:让小车停在某个位置,向上位机发送设置充电站指令,即可在此处放置一个充电站。每个队伍的小车在第一回合最多可以放置三个充电站。充电站在第二回合中将用于给本队小车充电和作为对手小车的障碍扣除对手小车续航。

除此之外,小车具有“续航”的概念。“续航”耗尽时,小车将不能再进行移动,否则将会扣除游戏剩余时间。

第二回合:完成订单配送任务

小车需要根据上位机发送的信息自行规划路径,依次到达订单的起点与终点完成若干单外卖配送并获得分数。小车到达某一订单的起点拿取外卖,然后需在每单规定时间内到达相应的终点送出外卖。若某一订单配送超时,则将视超时情况减少能获得的分数。并且小车上同时携带外卖数量有限,当容量满时经过外卖起点也不会拿取外卖,必须先到达其中若干单的终点放下外卖才可以拿取。

除此之外,小车具有“续航”的概念。“续航”耗尽时,小车应当前往己方充电桩处“充电”,否则将会扣除游戏剩余时间。

技术细则

定义

“小车” 是指由选手制作的,贴有定位标识符的物体;也指上位机逻辑中对应的数字化实体。

“固定设施” 是指比赛中不发生变化的区域,包括“场地”“中央区域”“周边区域”“墙”“障碍物”。

“场地” 是指比赛中“小车”能够合法所处的正方形“区域”。

“中央区域” 是指“场地”内的一个正方形“区域”。

“周边区域” 是指“场地”内除“中央区域”外的“区域”。

“墙” 是指“周边区域”内与“中央区域”相邻的,“小车”不应进入的“区域”。

“障碍物” 是指“中央区域”内的,“小车”避免进入的“区域”。

“充电桩” 是指能够在一定范围内,为己方“小车”增加“续航”,并扣除非己方“小车”“续航”的实体。

“订单” 是指订单配送任务中的最小子任务,需要“小车”在一定时间间隔内分别“触碰”起点“位置”和终点“位置”。

“场地坐标系” 是指以场地某一顶点为原点,与该顶点相连的两边分别为x轴和y轴所在直线的坐标系。

“位置” 是指以整数二元组形式表示的坐标。

“区域” 是指“位置”的集合。

“小车位置” 是指“小车”上贴的定位标识符的外轮廓的所有拐点组成的集合的重心的坐标,并对该坐标中每一个数都进行向下取整得到的“位置”。

“续航” 是指“小车”在上位机逻辑中还能够移动的,以曼哈顿距离计算的路程。

“回合时长” 是指该回合中,对应方“小车”在上位机逻辑中能够移动和完成任务的时长。

“回合时间” 是指当前时间与回合开始时间的差。

“回合剩余时长” 是指“回合时长”与“回合时间”的差。

“触碰” 是指双精度浮点数计算条件下,两“位置”间的欧几里得距离小于等于8单位的情况。

“重合” 是指两“位置”相等的情况。

“采样” 是指上位机捕获摄像头画面,并进行处理的行为。

“惩罚” 是指因“小车”出现无法被上位机识别的违规情况而由裁判手动判定违规的行为。

“配送” 是指“小车”“触碰”订单起点,并“触碰”订单终点。

“区域”

“场地”的两对角顶点的“位置”分别为(0, 0)和(254, 254)。

“中央区域”的两对角顶点的“位置”分别为(40, 40)和(214, 214)。

“墙”由8个矩形区域构成,每个矩形区域的两对角顶点的“位置”分别为(38, 38)和(107, 40)、(147, 38)和(216, 40)、(38, 38)和(40, 107)、(38, 147)和(40, 216)、(38, 214)和(107, 216)、(147, 214)和(216, 216)、(214, 38)和(216, 107)、(214, 147)和(216, 216)。

“障碍物”随机生成,但每一场比赛中固定。障碍物由5个矩形“区域”组成,每个矩形“区域”的每边边长范围为[10, 170],每个矩形“区域”的面积范围为[250, 2500]。

流程

比赛分为三个阶段,分别为赛前准备(Pre-match)、上半场(First Half)、下半场(Second Half)。其中上半场、下半场均由两个分别对应一方的回合组成。

  • 赛前准备阶段

    “小车”不应进行任何动作。

  • 上半场

    “小车”需要完成订单配送任务和“充电桩”设置任务。

    • “回合时长”为60秒。

    • “订单”数量为10个,随机生成。

  • 下半场

    “小车”需要完成订单配送任务。

    • “回合时长”为180秒。

    • “订单”数量为60个,随机生成。

注意,每个回合开始时,“小车位置”应当在“周边区域”内。

若比赛过程中,“小车”出现与预期不符的行为,选手可以申请暂停比赛,进行调整,并将“小车”置于回合开始时的“小车位置”以继续比赛。每次申请暂停比赛时,都会受到一次“惩罚”。同时,“小车”的“续航”将会减少比赛暂停时“小车位置”与比赛继续时“小车位置”间的曼哈顿距离。

若比赛过程中,“小车”出现通信失效的情况,且无法自行恢复,将无法参与后续比赛。上位机仅允许在比赛开始前进行配对连接。

任务

任务共有两个:订单配送任务、“充电桩”设置任务。

  • 订单配送任务

    “小车”需要根据“订单”信息,“触碰”订单起点,并在最大配送时长内“触碰”“订单”的终点。

    • 在上半场或下半场中,都会生成多个订单。

    • 每个订单包含起点“位置”、终点“位置”、最大配送时长、佣金四项基本信息。

      • 起点“位置”和终点“位置”在“场地”内,但不在“障碍物”内或“墙”内。

      • 最大配送时长范围为[20秒, 60秒]。

      • 佣金范围为[10分, 50分]。

    • 每回合中,小车的“订单”承载容量为5个,亦即“小车”已经“触碰”起点,但未“触碰”终点的订单数不能超过5个。

    • 任一半场中,双方回合的订单生成情况完全相同。

  • “充电桩”设置任务

    “小车”需要在“场地”内至多3个“位置”设置“充电桩”。

    • 仅能在上半场完成。

续航

每个回合开始时,“小车”的“续航”为4000单位。

“小车”的“续航”在以下情况下发生变化:

  • “小车位置”发生变化:减去两“小车位置”间的曼哈顿距离。

  • “续航”不大于0单位:增加100单位,同时“回合时长”减少5秒。

  • “小车位置”与“障碍物”“重合”:以100单位每秒的速率减少。

  • 在下半场中,“小车位置”在以己方“充电桩”为圆心,以20为半径的圆形区域内:以1000单位每秒的速率增加。

  • 在下半场中,“小车位置”在以非己方“充电桩”为圆心,以20为半径的圆形区域内:以100单位每秒的速率减少。

分数

每个回合开始时,分数为0分。

分数在以下情况下发生变化:

  • “小车位置”首次在“中央区域”内:增加10分。

  • 在上半场中,“小车”设置一个“充电桩”:增加5分。

  • “小车位置”在“墙”内:以10分每秒的速率减少。

  • “惩罚”:减少50分。

  • “小车”完成“订单”的“配送”:

    设“订单”的最大配送时长为$T$秒,“配送”花费的时长为$t$秒,“订单”的佣金为$X$分,分数增加$Y$分,则有:

    $Y = \max {X - \max{5 \times (t - T), 0}, 0}$

  • “小车位置”超过5秒未发生变化:

    设“小车位置”未发生变化的持续时间为$t$秒,分数减少$Y$分,则有:

    $Y = 5 \times \max{t - 5, 0}$

“小车”

建议使用官方提供的套件。

  • 尺寸

    “小车”在比赛的任意时刻必须能被置于长、宽为25厘米,高为20厘米的长方体空间内,否则将不能继续进行比赛。如果比赛过程中“小车”尺寸发生变化而不满足要求(例如未固定好的设备脱离),比赛将会暂停,且该“小车”对应方将受到一次“惩罚”。

  • 电源

    “小车”的电源电压不得高于14伏。

  • 控制器

    “小车”允许使用的的控制器包括:一、任何基于STM32系列微处理器的控制器;二、任何FPGA控制器;三、任何Arduino官方控制器(不含任何第三方兼容控制器);四、任何满足(1)所有运算单元频率之和不高于256MHz且(2)所有易失性存储(RAM)容量之和不高于1MB且(3)所有非易失性存储(ROM、FLASH等)容量之和不高于4MB的控制器。若使用非基于STM32系列微处理器的控制器,需要向官方申请,审核通过方可使用。

    请注意,不允许通过任何通讯方式使用外置计算模块(如RK3399计算板、树莓派计算板、Jetson Nano计算板等),不允许使用任何自带无线通讯模块的控制器。

  • 外围设备

    “小车”允许自行更换外围设备。比赛时,“小车”上不允许承载除用于与上位机通讯的通讯模块外的任何通讯模块和线缆。除控制器上自带的LED外,“小车”上不允许承载任何光源、任何饱和度较高的色块或其它可能对上位机色块识别产生干扰的物品。

  • 禁止事项

    禁止对比赛环境造成任何不可逆的破坏,例如锐器切割、水墨喷射。

通信协议

此部分仅供希望使用非STM32平台或希望自行编写通信相关代码的选手阅览。

Data Types

Type Size (Bytes) Structure Description
Byte 1
Short 2
Int 4
Float 4
List<Type> $\text{Type.Size} \times \text{n} + 1$ [n: Byte, Type, ...] Indeterminate length. n is the number of elements in the list.
Position 4 [x: Short, y: Short]
Rectangle 8 [Position, Position]
GameStage 1 [Byte] Pre-match: 0; First half: 1; Second half: 2.
GameStatus 1 [Byte] Standby: 0; Running: 1.
ChargingPile 4 [position: Position]
Barrier 8 [Rectangle]
Order 18 [departure_position: Position, destination_position: Position, delivery_time_limit: Int, commission: Float, order_id: Short] If no order is generated, order_id is -1.

Packet Structure

In a packet, the first 8 bytes are the header and the later bytes are the data.

Byte Description
0 Always 0x55
1 Always 0xAA
2 Byte. The packet ID
3 to 4 Short. The number of bytes of the data (N)
5 Byte. The checksum of the data
6 to N+5 The data of the packet. N is the length of the data.

Header

There are 8 bytes in the header as explained below:

  • The 1st byte is 0x55 and the 2nd byte is 0xAA.

  • The 3st byte is the packet ID, which indicates what type the packet is.

  • The 4th and 5th bytes are a Short, the number of bytes of the data.

  • The 6th byte is the XOR checksum byte of the data, which can be calculated by the program below:

char CalculateChecksum(const char data[], int count) {
  char checksum = 0;
  for (int i = 0; i < count; ++i) {
    checksum ^= source[i];
  }
  return checksum;
}

If the calculated checksum doesn't match the checksum provided by the header, the packet should be dropped to prevent unexpected exceptions.

Data

There are various types of packets.

  • Get game information
Packet ID Send From Field Name Field Type Description
0x00 Slave
Packet ID Send From Field Name Field Type Description
0x01 Host Game Stage GameStage
Barrier List List<Barrier>
Game Half Duration Int The duration of the half of game in milliseconds. For pre-match, this field is always 0.
Own Side's Charging Pile List List<ChargingPile>
Opponent's Charging Pile List List<ChargingPile>
  • Set a charging pile
Packet ID Send From Field Name Field Type Notes
0x02 Slave
  • Push status
Packet ID Send From Field Name Field Type Notes
0x05 Host Game Status GameStatus
Game Time Int
Score Float
Vehicle Position Position
Remaining Distance Int The distance the vehicle can still go.
Order In Delivery List List<Order>
Latest Pending Order Order The latest generated order that is pending for taking.

Communication Details

The gap between ticks is not fixed, depending on the refresh rate of the host. To avoid too frequent transmission which may slow down the client, the minimum gap is set to 50ms.

  • When the slave sends Packet 0x00 to the host, the host will respond with Packet 0x01 the next tick.
  • The slave can always send Packet 0x02 to the host, but the host will not respond anyway.
  • The host sends Packet 0x05 to the slave every tick.

Warning: The slave should ONLY process the packet IDs listed below and DROP other packets, for there are some other packet IDs for debugging not listed.

Warning: The host will not overwrite the packet generated last tick but not completely sent. Meanwhile, the host will drop packets if the slave send too frequently.

其它内容

致敬学校后勤人员以及亿万平凡的劳动者!

【注意】赛题细则将根据比赛实际情况进行调整。比赛规则、赛题细则的最终解释权,以及本策划案和标志等的版权,均属大赛组委会所有。