# 2023暑假控制组方向线上测试 **Repository Path**: buaarobot_admin/ControlGroupOnlineTest2023 ## Basic Information - **Project Name**: 2023暑假控制组方向线上测试 - **Description**: 北航机器人队控制组2023年暑假招新 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 1 - **Created**: 2023-06-21 - **Last Updated**: 2025-07-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 2023暑假控制组单片机方向线上测试 ## 第一周测试题 ### 1.git基本操作 #### 任务简介 > Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,可以帮助你进行自动的版本管理。控制组单片机端**之后的线上测试都是通过`gitee`发布**,在多人协作的情况下,使用`git`就会相当的方便,能够有效地协调多位开发者对不同地方的改动。 #### 任务要求 - 安装git,并且注册好`gitee`账户与`git`绑定,并且点击[**邀请链接**](https://gitee.com/buaarobot_admin/ControlGroupOnlineTest2023/invite_link?invite=553d41c7e8792713ac91e7f37729ef49e3fd9a65794fff84e511b1509403e86ec49ac7117559b8db427a56d8f320fd28)加入本远程仓库 - 注意邀请链接的有效期为3天 - 在想要克隆本仓库的地方,右键菜单点击“**`Git Bash Here`**”,输入以下代码,即可实现将远程仓库克隆到本地的操作,注意**之后的任务会放置在任务文件夹中** ```c >>> git clone https://gitee.com/buaarobot_admin/ControlGroupOnlineTest2023.git ``` - 创建一个markdown文件,命名格式为**{你的名字}.md**,如`李明.md` 撰写你对本周题目的难度的看法,创建一个简述自己对**git组成以及常见命令使用原理的理解**的markdown文件,命名格式为 **{你的名字ToMarkDown}.md** ,如`李明ToMarkDown.md`。 两个文件统一放到`ControlGroupSCMOnlineTest2023/第一周测试题/task1`下面 - `git commit -m {改动的内容}` 在这里写清这次提交改动的内容:**{你的名字}提交task1** - 本任务结果提交方式为**git提交** ##### 提示信息 - 可以使用`git push` 将本地所有未上传的提交推送到远程仓库 - 此时有可能会提示推送失败,这是因为远程仓库里面有本地未获取的提交 - 此时需要先`git pull`获取当前远程仓库的最新版本, 将远程仓库的最新版本和本地最新版本合并(`merge`)后,才能够推送 - 第一次进行提交操作时需要登记提交者信息,提交时`git`会有相关的操作说明 - 更多详细的`git`用法请查询参考资料或借助网络搜索 ##### 注意 **不是**所有任务都需要利用git进行提交,第一周以及以后的其它任务提交方式**请以对应的任务说明为准** #### 参考资料 - [git入门教程](https://www.cnblogs.com/imyalost/p/8762522.html) - [菜鸟教程yyds](https://www.runoob.com/git/git-tutorial.html) - 一个可以打开md文件的软件:[Typora](https://bhpan.buaa.edu.cn:443/link/5D15F20C387C3E8D482B1A2AF01EC387) ### 2.PID控制程序编写及封装 #### 任务简介 > PID算法是控制领域应用最广泛的算法,其计算流程与其应用场景并无关系,为了避免重复编写同样的代码,我们往往会将PID算法进行封装,初始化过后直接调用即可。 #### 任务说明 1.请完善`PID.c`中的两个空白函数,函数的功能已经在注释中写出。 `void PID_StructInit(PID_t *pid, float p, float i, float d, float integral_limit, float max_output)` `static void Calculate(PID_t *pid, float current_value, float target_value)` 2.请根据自己编写好的函数进行对`PID.c`的封装。 需要达到的**要求**是用户在定义 `PID_t` 结构体后(例如 `PID_t TestPID`),先运行`PID_StructInit`函数,再使用`TestPID.f_Calculate(&TestPID, Current_value, Target_value)`即可完成计算,计算的结果保存在结构体中。 3.通过查阅关于`PID`的资料,说一说P、I、D三个参数分别有什么作用,如果让你调节PID参数,你会如何开始调节。写成一个`.md`文档,字数不超过100字,以自己的名字命名即可。 4.本任务的代码均放在 `第一周测试题/task2`文件夹下。 #### 任务要求 - 需要提交的文件:`PID.c`和`PID.h`和`PID参数说明文档`。 - 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个README文本文件中写明原因以及完成的进度情况。 - 本任务提交方式为**邮箱提交**,邮箱为`bhjqrdkzz2022@163.com`(与其他需要邮箱提交的任务放在**同一个zip文件**中,zip文件命名格式为 **{你的名字}第一周测试题.zip** ) - 提交的文件放在`/task2`文件夹下 #### 参考资料 - [初识PID-搞懂PID概念](https://zhuanlan.zhihu.com/p/74131690) ### 3. 简单帧 #### 任务简介 > 通信协议是指在通信过程中双方遵循的规则和约定,包括数据格式、传输方式、错误处理等内容。没有通信协议,通信双方无法理解对方发送的信息,也无法进行正确的数据传输和处理。因此,通信协议是通信过程中必不可少的一部分。 #### 任务说明 1. 在机器人队遥控器与下位机STM32F407之间的通信协议中规定了三种数据帧,由起始位、帧类型、数据位和校验位等组成,示意图如下所示: Simple帧是三种数据帧最简单的一种帧,其作用是修改远端指定编号变量的值,其每一位参数如下: - 帧头:0x7E - 类型位:0x00(可以此判断为简单帧) - 长度位:0x05(编号位和数据位的总长度) - 编号位:本题中为0x01或0x02 - 数据位: - size:4 - type:本题中为float或int型(4字节数据类型) - **小端模式** - 校验位:一字节,通过校验和计算获得 - 计算方法:把从类型位到数据位之间的位全部求和,求和值舍弃溢出的高位 - 帧尾:0x30 2. 简单帧发送 假设在本次调试过程中,需要修改远端两个变量(编号1变量:float型;编号2变量:int型),请完善`void SendSimpleFrame(uint8_t id, ...)`函数。 3. 简单帧接收 当接收到一帧后,需要调用接收处理函数读取其中包含的信息。在简单帧接收处理函数`void SimpleFrameHandler(uint8_t *recv_frame, uint16_t len)`中,需要完成以下任务,请以此完善该函数: - 判断是否为完整的一帧 - 重新计算校验值,判断有无接收错误 - 判断帧的长度是否正确 - 若前项均正确,根据编号位的值正确读出数据位的值 4. 本任务的代码放在 `第一周测试题/task3`文件夹下。 ##### 任务提示 - 由于发送数据的类型不确定,发送函数需要使用可变参数,具体实现可以参考以下资料。 - 注意,`int`和`float`型变量为4字节,而一般的通信过程都需要将其拆分为单字节进行传送。int型的转换较简单,通过移位操作(>>)即可实现,float型不建议通过转换为int的方法发送,这样会损失精度,具体实现可以参考以下资料。 #### 任务要求 - 需提交`frame.c`文件 - 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个README文件,在其中中写明原因以及完成的进度情况。 - 本任务提交方式为**邮箱提交**,邮箱为`bhjqrdkzz2022@163.com`(与其他需要邮箱提交的任务放在**同一个zip文件**中,zip文件命名格式为 **{你的名字}第一周测试题.zip** ) - 提交的文件放在`/task3`文件夹下 #### 参考资料 - [C语言可变函数参数 - 哔哩哔哩](https://www.bilibili.com/read/cv20412768) - [技术分享 | float类型与uint8数组的相互转换-CSDN博客](https://blog.csdn.net/msq19895070/article/details/122876298) - [关于C ++:将*float转换为*4 *uint8_t* | 码农家园](https://www.codenong.com/25386503/) ### 4.UDP通信 #### 任务简介 > Qt 是一个跨平台的 C++ 框架,可以用来开发Windows系统图形用户界面。北航机器人队的遥控器采用Qt开发,通过Wifi与下位机STM32F407之间建立连接,使用UDP(**User Datagram Protocol,用户数据报协议**)协议传输数据。 #### 任务说明 1. 利用Qt实现可以发送和接收UDP数据包的应用程序 2. **要求** - **只**需要实现下述基本功能:设置远端ip,远端端口,本地端口,开始连接,断开连接,发送接收。 - 需要有发送框和接收框,点击发送将发送框中的内容发出,接收的内容显示在接收框中。 - (可选)实现简单帧通信 #### 任务要求 - 需提交完整的**QT工程文件** - 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个README文本文件中写明原因以及完成的进度情况。 - 本任务提交方式为**邮箱提交**,邮箱为`bhjqrdkzz2022@163.com`(与其他需要邮箱提交的任务放在**同一个zip文件**中,zip文件命名格式为 **{你的名字}第一周测试题.zip** ) - 提交的文件放在`/task4`文件夹下 #### 参考资料 - [基于QT的UDP通信_qtudp通信](https://blog.csdn.net/weixin_43479242/article/details/126995697) - [QT下载参考链接](http://c.biancheng.net/view/3851.html) - [【Qt5】入门Qt开发教程](https://blog.csdn.net/qq_33904382/article/details/111369153) - [C++总结(三)——类与对象](https://zhuanlan.zhihu.com/p/619050568) ## 第二周测试题 ### 5.Keil入门 #### 任务简介 > **Keil5**是一款非常友好和强大的C语言软件开发系统。Keil软件为用户提供清晰直观的操作界面,实用且便捷。Keil5具备编译器、安装包和调试跟踪等功能,完美支持Cortex-M、Cortex-R4、ARM7和ARM9系列器件。 > > 机器人队控制组的主要任务都是在**Keil5**上完成的。 #### 任务要求 - 子任务1:查阅相关资料,了解**标准库、HAL库、LL库**的区别和联系,说一说你对标准库、HAL库、LL库三种库函数的**偏好及原因**,写成一个`.md`文档,命名格式为{**{你的名字}+库函数偏好**},字数不超过100字。 - 子任务2:仔细学习参考资料的内容。选择随便一种STM32芯片,新建Keil工程,随意选择**正确**的引脚(STM32有多个引脚可实现相同的功能),尝试编写程序,实现LED小灯的翻转。具体要求如下: 1. 第1~5秒,控制LED小灯引脚每**500ms**翻转一次; 2. 第6~10秒,控制LED小灯引脚每**500μs**翻转一次; 3. 循环以上2步骤。 - **任务提交**:提交方式为**邮箱提交**,地址为`bhjqrdkzz2022@163.com`(与其他需要邮箱提交的任务放在**同一个zip文件**中,zip文件命名格式为**{你的名字}第二周测试题.zip}**) - 提交的文件放在`/task5`文件夹下 - 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个README文件,在其中写明原因以及完成的进度情况。 #### 参考资料 - [世意法官网 (st.com)](https://www.st.com/content/st_com/zh.html) - [【野火】STM32 HAL库开发实战指南](https://www.bilibili.com/video/BV18X4y1M763) - [相关软件及资料](https://bhpan.buaa.edu.cn:443/link/5D15F20C387C3E8D482B1A2AF01EC387) ### 6.全场定位 #### 任务简介: > 全场定位模块是整个机器人中必不可少的一部分,通过陀螺仪、[正交轮](https://www.mfcad.com/tuzhi/1658/1082371.html)编码器,机器人可以知晓自己在场地中的位置,从而更好地完成一系列自动任务,底盘正交轮1,2和世界坐标系如下图所示。 #### 任务说明: - 子任务1:推导依靠正交轮与陀螺仪实现全场定位的基本方法。已知正交轮的基本结构如上图所示,假定每个轮子顺时针转动为正,假定陀螺仪的欧拉角已经得到,并且偏航角顺时针为正。 - 子任务2:在`Location.c`与`Location.h`中,根据注释提示补全代码,实现定位信息的获取。 - 子任务3:请简要叙述正交轮编码器、IMU、激光雷达、光纤陀螺的功能与优缺点,不超过300字。了解多传感器融合减小误差的方法。 - 本任务的代码均放在 `第二周测试题/task6`文件夹下。 #### 任务要求: - 提交**三个**子任务中的内容 - **任务提交**:提交方式为**邮箱提交**,地址为`bhjqrdkzz2022@163.com`(与其他需要邮箱提交的任务放在**同一个zip文件**中,zip文件命名格式为**{你的名字}第二周测试题.zip}**) - 提交的文件放在`/task6`文件夹下 - 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个README文件,在其中写明原因以及完成的进度情况。 #### 参考资料 - 王志君. 移动机器人全场定位系统的研究[D].电子科技大学,2015. ### 7.认识无刷电机与CAN通信 #### 任务简介 > 机器人的驱动通常有电动、气动和液动三种,电机驱动是三种方式中功率密度最大、功能方式最简、伺服精度最高的控制方式。在移动式机器人中,常用直流电源(如航模电池)给电机供电,实现机器人的能源-驱动系统。 > > 电动机一般分为同步电机和异步电机,其共同点是都需要旋转的磁场来产生驱动力。为了产生旋转的磁场,就需要交变的电流。因此,直流电机控制的核心技术是将直流电压逆变为交流电压,进而产生交变电流。 > > 由于控制方法的精进,使得我们不仅可以用直流电源驱动BLDC,还可以直接使用直流电源驱动一些交流电机,比如永磁同步电机(PMSM: Permanent-Magnet Synchronous Motor),对其控制方法称为空间矢量控制(FOC: Field-Oriented Control)。 > > 在北航机器人队中,我们通常使用PMSM作为机器人驱动器。 #### 任务要求 - 子任务1:以下为北航机器人队常用的M3508电机,属于**永磁同步无刷电机PMSM**。请根据下图,查阅资料,简述M3508的控制器**C620电调**(驱动器)的作用,写成一个`md`文档,命名格式为{**{你的名字}+C620作用**},字数不超过100字。 - 子任务2:查阅相关资料,学习FOC驱动技术。请简述三环分别的输入量与输出量的物理意义,以及三环控制的作用,写成一个**.md**文档,命名格式为{**{你的名字}+FOC**},不超过100字。 - 子任务2:查阅相关资料,简述CAN通信相比于其他有线通信方式的优点,写成一个**.md**文档,命名格式为{**{你的名字}+CAN功能**},字数不超过100字。 - 子任务3:阅读参考资料“RM C620无刷电机调速器使用说明 发布版”中的“CAN通信协议”内容,任选一款含有CAN的STM32芯片,新建Keil工程尝试编写程序,**利用STM32控制板与C620电调进行通信**。具体提示如下: 1. **阅读参考资料**“RM C620无刷电机调速器使用说明 发布版”中的“电调反馈报文格式”内容,配置CAN过滤器,接收C610电调(认为帧ID为1)向总线上发送的反馈信息。 2. **阅读参考资料**“RM C620无刷电机调速器使用说明 发布版”中“电调接收报文格式”,配置CAN发送格式,将任意大小的电流信息发送给电调。 - **任务提交**:提交方式为**邮箱提交**,地址为`bhjqrdkzz2022@163.com`(与其他需要邮箱提交的任务放在**同一个zip文件**中,zip文件命名格式为{**{你的名字}第二周测试题**}。 - 本任务的代码放在 `/task7`文件夹下。 - 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个README文件,在其中写明原因以及完成的进度情况。 #### 任务提示 - 与C620电调通信的波特率为1Mbps。 #### 参考资料 - [【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术](https://zhuanlan.zhihu.com/p/147659820) - [大疆 RoboMaster 3508/2006/GM6020 电机使用教程](https://zhuanlan.zhihu.com/p/572827288) - [RM C620无刷电机调速器使用说明 发布版](https://rm-static.djicdn.com/tem/17348/RoboMaster C620无刷电机调速器使用说明(中英日)V1.01.pdf) ## 第三周测试题 ### 8.初识FreeRTOS #### 任务简介: > ROBOCON的赛场上,机器人同时处理的任务、同时传递的消息繁多,此时继续采用前后端的编程模式和全局变量的消息形式,就存在一定的局限性,不利于机器人控制逻辑的实现和代码的可维护性。这时候就需要使用嵌入式操作系统。在北航机器人队中,采用的嵌入式操作系统为FreeRTOS,几乎所有控制组的成员都需要掌握FreeRTOS的使用方法。 > > 中文版资料(视频和例程以及书籍等)主要参考正点原子(FreeRTOS开发手册)与野火哥(FreeRTOS内核实现与应用开发实战),英文原版资料科参考FreeRTOS官网和官方手册。 #### 任务说明: 1. 查阅相关资料,简要谈谈为什么要使用嵌入式操作系统?字数不超过100字。 2. 查阅相关资料,谈谈你对操作系统FreeRTOS中任务、信号量等概念的理解?字数不超过200字。 3. 查阅相关资料,可以**自己移植**或使用**cubemx生成**FreeRtos工程,实现以下功能: 1. 创建两个任务`FirstTask`和`SecondTask`,其余参数自定 2. 在`FirstTask`中实现LED灯的亮灭,间隔50ms 3. 在`SecondTask`中控制`FirstTask`的挂起和恢复,间隔1s #### 任务要求 - 提交**两个**文本文件 - 提交创建的**keil工程文件** - 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个README文件,在其中写明原因以及完成的进度情况。 - 本任务提交方式为**邮箱提交**,邮箱为`bhjqrdkzz2022@163.com`(与其他需要邮箱提交的任务放在**同一个zip文件**中,zip文件命名格式为 **{你的名字}第三周测试题.zip** ) - 提交的文件放在`/task8`文件夹下 #### 参考资料 - [FreeRTOS资料](https://bhpan.buaa.edu.cn:443/link/5D15F20C387C3E8D482B1A2AF01EC387) ### 9.运动学解算 #### 任务简介: > 底盘运动学分解是控制组必备技能。在今年的Robocon比赛中,北航机器人队采用了3舵轮运动底盘,我们需要对底盘进行运动学分解,以便控制机器人进行运动 #### 任务说明: - 子任务1:推导如图1所示三舵轮底盘将**车体坐标系**下的目标速度大小、速度方向与角速度大小(方向默认俯视顺时针为正)解算到三舵轮转动**角速度和角度**的公式,写出推导过程并说明各个参数的含义。部分说明与设定参数如下: - 子任务2:在上一问的基础上,考虑当给出**世界坐标系**下的机器人期望速度矢量与角速度矢量时,解算出三舵轮转动的**角速度和角度**。给出公式,写出推导过程并说明参数含义。 - 子任务3:在`ChassisMotion.c` 与 `ChassisMotion.h` 中,根据注释提示补全代码,实现三轮全向轮底盘各轮所需转速的解算任务。 #### 任务要求 - 提交**两个**推导过程和`ChassisMotion.c` 与 `ChassisMotion.h` - 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个README文件,在其中写明原因以及完成的进度情况。 - 本任务提交方式为**邮箱提交**,邮箱为`bhjqrdkzz2022@163.com`(与其他需要邮箱提交的任务放在**同一个zip文件**中,zip文件命名格式为 **{你的名字}第三周测试题.zip** ) - 提交的文件放在`/task9`文件夹下 ### 10.串口通信基础 #### 任务简介 > 串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行传输的一种通讯方式。尽管串行通讯的比按字节传输的并行通信慢,但是串口可以在仅仅使用两根线的情况下就能实现数据的传输。 > > 串口通信作为十分基础的通信方式,在机器人队的控制与调试过程中广泛使用,每个队员都需要掌握串口通信的使用方式。 #### 任务说明 - 任选一款STM32芯片,任选库类型,新建Keil工程,尝试编写程序,实现串口通信。具体要求如下: 1. 串口波特率设置为256000 2. 使用串口**接收并处理**第一周实现的简单数据帧,并判断:收到数据`a`,使用串口发送数字`5201314`;收到数据`b`,使用串口发送数字`1314520` #### 任务要求 - 提交创建的**keil工程文件** - 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个README文件,在其中写明原因以及完成的进度情况。 - 本任务提交方式为**邮箱提交**,邮箱为`bhjqrdkzz2022@163.com`(与其他需要邮箱提交的任务放在**同一个zip文件**中,zip文件命名格式为 **{你的名字}第三周测试题.zip** ) - 提交的文件放在`/task10`文件夹下 #### 参考资料 - [【野火】STM32 HAL库开发实战指南](https://www.bilibili.com/video/BV18X4y1M763) - [相关软件及资料](https://bhpan.buaa.edu.cn:443/link/5D15F20C387C3E8D482B1A2AF01EC387) ## 附加题 ### 11.了解ROBOCON #### 任务简介 > 全国大学生机器人大赛ROBOCON,详情点击[ROBOCON全国机器人大赛](http://cnrobocon.net/) #### 任务要求 - 子任务1:查阅相关资料,简要谈谈你对ROBOCON的认识。 - 子任务2:如果你能加入我们,简单谈谈你的计划和想要完成的目标。 - 内容写在一个`.md`文档中,以自己的名字命名即可。 - 任务提交:**不强制提交**,如果想要提交,可提交至邮箱`bhjqrdkzz2022@163.com`。 ### 12.PID参数实际体验 #### 任务简介 > 前几周编写了PID调节的控制程序,此任务中可以通过已编好的模拟程序,实际体验PID参数对信号输出的影响。 #### 任务说明 1. 构建的模型程序图如下: 2. 当Kp=1,Ki=0时,阶跃响应效果如图所示, #### 任务要求 - 子任务1:根据task12文件夹中的.slx文件(使用Matlab中的simulink打开),调整PI控制参数,使其单位阶跃响应调节时间小于0.5ms,超调小于5%,无稳态误差。 - 子任务2:根据自控原理所学知识给出PI控制器设计思路,没学过自控的同学可以结合第一周任务“PID控制程序编写及封装”中的调节方法,给出手动调节思路。 - 子任务3:将调整后的示波器图像和任务2中的设计思路以PDF 形式提交到邮箱。 - 任务提交:**不强制提交**,如果想要提交,将调整后的示波器图像和任务2中的设计思路以PDF 形式提交到邮箱,邮箱为`bhjqrdkzz2022@163.com`