# 2023寒假控制组方向线上测试
**Repository Path**: sundm75/ControlGroupOnlineTest2023-1
## Basic Information
- **Project Name**: 2023寒假控制组方向线上测试
- **Description**: 北航机器人队2023寒假控制组方向线上测试题发布
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2024-12-09
- **Last Updated**: 2024-12-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 2023控制组方向线上测试
## 第一周测试题
### 1.git基本操作
#### 任务简介
> Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目,可以帮助你进行自动的版本管理。控制组**之后的线上测试都是通过`gitee`发布**,在多人协作的情况下,使用`git`就会相当的方便,能够有效地协调多位开发者对不同地方的改动。
#### 任务要求
- 安装git,并且注册好`gitee`账户与`git`绑定,并且点击[**邀请链接**](https://gitee.com/buaarobot_admin/ControlGroupOnlineTest2023-1/invite_link?invite=a52b4b8233cdc27b40c4a3364b2a87340efa1ab398cf655db7993663152babc539002b6344f4bd4c5f318cd36bbddc3a)加入本远程仓库
- 注意邀请链接的有效期为3天(28日-31日)
- 在想要克隆本仓库的地方,右键菜单点击“**`Git Bash Here`**”,输入以下代码,即可实现将远程仓库克隆到本地的操作,注意**之后的任务会放置在任务文件夹中**
```c
>>> git clone https://gitee.com/buaarobot_admin/ControlGroupOnlineTest2023-1.git
```
- 创建一个markdown文件,命名格式为{**{你的名字}.md**},如`李明.md` 撰写你对本周题目的难度的看法。
- 创建一个markdown文件,简述自己对**git组成以及常见命令使用原理的理解**,命名格式为 {**{你的名字}ToMarkDown.md**}。
- 两个文件统一放到`ControlGroupOnlineTest2023-1/第一周测试题/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://www.typora.io/windows/dev_release.html)
### 2、底盘运动学
#### 任务简介
> RoboMaster比赛中的机器人绝大部分都是依靠轮式底盘完成运动,尤其是**麦克纳姆轮底盘**,其能够**同时完成平面上三个自由度的运动**。通过**底盘正运动学解算**,可以将底盘三自由度的运动向量解算成四个底盘电机的速度,再通过电机反馈的速度进行速度环控制。
#### 任务要求
- 子任务1:推导如图1所示麦克纳姆轮底盘正运动学。将**车体坐标系**下的目标速度大小、速度方向与角速度大小(方向默认俯视逆时针为正)解算到四个轮子转动**角速度**的公式,写出推导过程并说明各个参数的含义。部分说明与设定参数如下:
*车体坐标系是与机器人底盘固连的坐标系,不论机器人处在场地上的什么位置,车体坐标系始终与车体姿态一致;
*RoboMaster麦克纳姆轮直径d为152.5mm;
*安装俯视图如图2所示,采用**O-长方形**安装,包含轮子编号和底盘尺寸。其中1和3为左旋麦克纳姆轮,2和4为右旋麦克纳姆轮;底盘宽为450mm,长为600mm。
图1 麦克纳姆轮底盘
图2 底盘俯视图
- 子任务2:在上一问的基础上,考虑当给出**世界坐标系**下的机器人期望速度矢量与角速度矢量时,如何解算出四个轮子转动的角速度。给出公式,写出推导过程并说明参数含义。
*世界坐标系是与场地固连的坐标系,被认为静止不动的、作为参考的坐标系。在机器人运动过程中,由于机器人底盘的旋转,车体坐标系会相对于世界坐标系转动一定的角度。
*图中给出的速度矢量是在世界坐标系下描述的。
*将本任务中的子任务1、2写在word文档中,word命名为{**{你的名字}+第一周底盘运动学**}。
图3 世界坐标系下的底盘
- 子任务3:在`task2`文件夹中的`ChassisMotion.c `与 `ChassisMotion.h `中,根据注释提示补全代码,实现四轮麦克纳姆轮底盘各轮所需转速的解算任务。
- **任务提交**:本任务的文档和代码均放在 `第一周测试题/task2`文件夹下。提交方式为**邮箱提交**,地址为`bhjqrdkzz2022@163.com`(与其他需要邮箱提交的任务放在**同一个zip文件**中,zip文件命名格式为{**{你的名字}第一周测试题**}。
#### 任务提示
- 注意速度的合成与分解。一个刚体在做平移运动时其上各点速度是相同的。
- 注意世界坐标系与车体坐标系的关系,一般情况下RoboMaster比赛用的底盘只需完成平面运动,故只需要用一个角度便可表示车体坐标系相对世界坐标系的**姿态**。
- 车体坐标系原点在世界坐标系下的**位置**对求解速度没有影响。
- 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个Markdown文本文件中写明原因以及完成的进度情况。
#### 参考资料
- [麦克纳姆轮浅谈](https://zhuanlan.zhihu.com/p/20282234)
- [几种移动机器人底盘类型及其运动学](https://blog.csdn.net/qq_24706659/article/details/88342626)
- [RoboMaster开发板C型嵌入式软件教程文档](./RoboMaster开发板C型嵌入式软件教程文档.pdf)(第十七章)
### 3、机器人软件框架理解与应用
#### 任务简介
> 机器人的软件框架,主要包括**应用层(Application层)**、**板级支持包(BSP层)**和**算法层(algorithm层)**。软件工程上的分层设计,有利于提高代码的可维护性、可读性、复用性、可移植性等等。我们往往会将**板级支持包(BSP层)**和**算法层**中的函数进行封装,在实际应用中,初始化后直接调用即可。
>
> 其中,**PID算法**是算法层中常用的函数,是控制领域应用最广泛的算法,其计算流程与其应用场景并无关系。我们往往会将PID算法进行封装,在实际应用中,初始化后直接调用即可。
#### 任务要求
- 子任务1:阅读相关资料,如下图图4所示,简单说一说对于应用层(Application层)、板级支持包(BSP层)和算法层(algorithm层)的理解。写成一个word文档,命名格式为{**{你的名字}+机器人软件框架**},字数不超过200字。
- 子任务2:通过查阅关于`PID`的资料,说一说P、I、D分别有什么作用,如果让你调节PID参数,你会如何开始调节。写成一个word文档,命名格式为{**{你的名字}+PID**},字数不超过100字。
图4 机器人软件框架
- 子任务3:在`task3`文件夹中,请完善`PID.c`中的两个空白函数,函数的功能已经在注释中写出。
- 子任务4:请根据自己编写好的函数进行对`PID.c`的封装。
需要达到的要求是用户在定义 `PID_t` 结构体后(例如 `PID_t TestPID`),先运行`PID_StructInit`函数,再使用`TestPID.f_Calculate(&TestPID, Current_value, Target_value)`即可完成计算,计算的结果保存在结构体中。
- **任务提交**:本任务的文档和代码均放在 `第一周测试题/task3`文件夹下。提交方式为**邮箱提交**,地址为`bhjqrdkzz2022@163.com`(与其他需要邮箱提交的任务放在**同一个zip文件**中,zip文件命名格式为{**{你的名字}第一周测试题**}。
#### 任务提示
- 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个Markdown文本文件中写明原因以及完成的进度情况。
#### 参考资料
- [RoboMaster开发板C型嵌入式软件教程文档](./RoboMaster开发板C型嵌入式软件教程文档.pdf)(第二十章)
- [通俗易懂的PID控制算法讲解](https://www.bilibili.com/video/BV1et4y1i7Gm)
- [初识PID-搞懂PID概念](https://zhuanlan.zhihu.com/p/74131690)
## 第二周测试题
### 4、cubeMX和Keil入门
#### 任务简介
> STM32用的**CubeMX**是ST公司出品的一款C代码生成器软件,它的图形化工具界面可以让使用者可视化地选择所需的芯片,并设置选用任一引脚、任一外设。另外的,**CubeMX**还提供了自动识别引脚冲突、设置时钟树、功耗预测等功能。使用**CubeMX**能减轻底层开发工作量,节约时间。
>
> Keil5是一款非常友好和强大的C语言软件开发系统。Keil软件为用户提供清晰直观的操作界面,实用且便捷。Keil5具备编译器、安装包和调试跟踪等功能,完美支持Cortex-M、Cortex-R4、ARM7和ARM9系列器件。
>
> 机器人队控制组的主要任务都是在Keil5上完成的。
#### 任务要求
- 子任务1:查阅相关资料,简单认识`STM32`和`Keil5`,并下载安装`CubeMX`和`Keil5`软件。说一说你对`CubeMX`功能和便捷性的认识,写成一个word文档,命名格式为{**{你的名字}+CubeMX功能**},字数不超过100字。
- 子任务2:查阅相关资料,了解**标准库、HAL库、LL库**的区别和联系,说一说你对标准库、HAL库、LL库三种库函数的**偏好及原因**,写成一个word文档,命名格式为{**{你的名字}+库函数偏好**},字数不超过100字。
- 子任务3:仔细学习参考资料第零章和第一章内容。选择C型开发板对应STM32芯片,新建Keil工程,尝试编写程序,实现LED小灯的翻转。具体要求如下:
*第1~5秒,控制LED小灯引脚每500ms翻转一次;
*第6~10秒,控制LED小灯引脚每500μs翻转一次;
*循环以上2步骤。
- **任务提交**:本任务的代码放在 `第二周测试题/task4`文件夹下。提交方式为**邮箱提交**,地址为`bhjqrdkzz2022@163.com`(与其他需要邮箱提交的任务放在**同一个zip文件**中,zip文件命名格式为{**{你的名字}第二周测试题**}。
#### 任务提示
- 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个Markdown文本文件中写明原因以及完成的进度情况。
#### 参考资料
- [世意法官网 (st.com)](https://www.st.com/content/st_com/zh.html)
- [RoboMaster开发板C型嵌入式软件教程文档](./RoboMaster开发板C型嵌入式软件教程文档.pdf)(第零章、第一章)
- [【野火】STM32 HAL库开发实战指南](https://www.bilibili.com/video/BV18X4y1M763)
### 5、裁判系统串口解析
#### 任务简介
> RoboMaster裁判系统是一个全自动的电子判罚系统,具有检测被弹丸攻击、显示机器人当前血量和状态、监测机器人地盘运动功率等功能。测速模块可以监测机器人发射弹丸的初速度与射速,相机图传模块可以为用户提供机器人第一人称视角,场地交互模块可以与场地交互数据,定位模块可以获取机器人在战场上的位置信息。用户使用多套裁判系统,可以组建一个多机对战系统。
>
> 串口通信指使用**串行接口**按位(bit)发送和接收字节的通信方式。串行接口是一种可以将接收来自**CPU**的**并行**数据字符转换为连续的**串行**数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。
#### 任务要求
- 如下图图5所示,在RoboMaster比赛中,机器人主控板需要接收部分**来自机器人身上搭载的裁判系统**的串口数据。
图5 裁判系统用户接口说明
- 子任务1:查阅相关资料,仔细学习串口(UART)通信。选择C型开发板对应STM32芯片,新建Keil工程,尝试编写程序,实现简单的**裁判系统串口数据的接收**。具体要求如下:
*串口配置:波特率115200,8位数据位,1位停止位,无硬件控流,无校验位;
*串口协议如下图图6、图7、图8所示。利用该串口接收来自裁判系统的数据,判断是否为**比赛状态数据**,若是则进行解析,并将解析成果储存到相应的结构体中;
*更多协议内容参考任务提示中《RoboMaster 裁判系统串口协议附录 V1.4(20220805)》文件。
图6 裁判系统串口协议
图7 帧头定义和命令码ID
图8 比赛状态数据说明
- **任务提交**:本任务的代码放在 `第二周测试题/task5`文件夹下。提交方式为**邮箱提交**,地址为`bhjqrdkzz2022@163.com`(与其他需要邮箱提交的任务放在**同一个zip文件**中,zip文件命名格式为{**{你的名字}第二周测试题**}。
#### 任务提示
- 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个Markdown文本文件中写明原因以及完成的进度情况。
#### 参考资料
[【野火】STM32 HAL库开发实战指南](https://www.bilibili.com/video/BV18X4y1M763)
[RoboMaster开发板C型嵌入式软件教程文档](./RoboMaster开发板C型嵌入式软件教程文档.pdf)(第八章)
[RoboMaster 裁判系统串口协议附录 V1.4(20220805).pdf (djicdn.com)](https://rm-static.djicdn.com/tem/17348/RoboMaster%20%E8%A3%81%E5%88%A4%E7%B3%BB%E7%BB%9F%E4%B8%B2%E5%8F%A3%E5%8D%8F%E8%AE%AE%E9%99%84%E5%BD%95%20V1.4%EF%BC%8820220805%EF%BC%89.pdf)
### 6、认识无刷电机与CAN通信
#### 任务简介
> 机器人的驱动通常有电动、气动和液动三种,电机驱动是三种方式中功率密度最大、功能方式最简、伺服精度最高的控制方式。在移动式机器人中,常用直流电源(如航模电池)给电机供电,实现机器人的能源-驱动系统。
>
> 电动机一般分为同步电机和异步电机,其共同点是都需要旋转的磁场来产生驱动力。为了产生旋转的磁场,就需要交变的电流。因此,直流电机控制的核心技术是将直流电压逆变为交流电压,进而产生交变电流。逆变技术有很多种,最简单的是通过电刷换向,应用此技术的电机称为有刷直流电机(BDC: Brush Direct Current Motor)。直流有刷电机的优点为驱动电路简单、工作稳定、力矩大。其缺点为能量转换效率低、需要维护更换电刷、转速一般较低。
>
> 相应的,使用电子管换向而取代电刷换向的电机,称为无刷直流电机(BLDC: Brushless Direct Current Motor)。随着无刷电机控制技术的发展,更多的半导体公司推出了成熟的无刷电机控制方案。而由于无刷电机能量密度高、无需维护、效率高、伺服精度高的优点,移动机器人中使用无刷电机成为主流趋势。传统的BLDC控制方法是通过霍尔传感器以及换向电子管,因此其通过生产时对磁隙的调制,使反电动势为方波。而由于控制方法的精进,使得我们不仅可以用直流电源驱动BLDC,还可以直接使用直流电源驱动一些交流电机,比如永磁同步电机(PMSM: Permanent-Magnet Synchronous Motor),对其控制方法称为空间矢量控制(FOC: Field-Oriented Control)。
>
> 在北航机器人队中,我们通常使用PMSM作为机器人驱动器。
#### 任务要求
- 子任务1:以下为北航机器人队常用的M3508电机,属于**永磁同步无刷电机PMSM**。请根据下图,查阅资料,简述M3508的控制器**C620电调**(驱动器)的作用,写成一个word文档,命名格式为{**{你的名字}+C620作用**},字数不超过100字。
- 子任务2:查阅相关资料,简述CAN通信相比于其他有线通信方式的优点,写成一个word文档,命名格式为{**{你的名字}+CAN功能**},字数不超过100字。
- 子任务3:阅读参考资料“RM C610无刷电机调速器使用说明 发布版”中的“CAN通信协议”内容,任选一款含有CAN的STM32芯片,新建Keil工程尝试编写程序,利用STM32控制板与C610电调进行通信。具体提示如下:
*阅读参考资料“RM C610无刷电机调速器使用说明 发布版”中的“电调反馈报文格式”内容,配置CAN过滤器,接收C610电调(认为帧ID为1)向总线上发送的反馈信息。。
*阅读参考资料“RM C610无刷电机调速器使用说明 发布版”中“电调接收报文格式”,配置CAN发送格式,将任意大小的电流信息发送给电调。
- **任务提交**:本任务的代码放在 `第二周测试题/task6`文件夹下。提交方式为**邮箱提交**,地址为`bhjqrdkzz2022@163.com`(与其他需要邮箱提交的任务放在**同一个zip文件**中,zip文件命名格式为{**{你的名字}第二周测试题**}。
#### 任务提示
- 与C610电调通信的波特率为1Mbps。
- 程序有一定可读性,包含适当的注释;**即使没能完成任务,也请提交上来**,并且在同目录下创建一个Markdown文本文件中写明原因以及完成的进度情况。
#### 参考资料
- [大疆 RoboMaster 3508/2006/GM6020 电机使用教程](https://zhuanlan.zhihu.com/p/572827288)
- [RM C610无刷电机调速器使用说明 发布版](https://rm-static.djicdn.com/tem/RM%20C610%E6%97%A0%E5%88%B7%E7%94%B5%E6%9C%BA%E8%B0%83%E9%80%9F%E5%99%A8%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E%20%E5%8F%91%E5%B8%83%E7%89%88.pdf)
- [RoboMaster开发板C型嵌入式软件教程文档](./RoboMaster开发板C型嵌入式软件教程文档.pdf)(第十四章)
## 附加题
### 7、FreeRTOS的简单认识
#### 任务简介
> RoboMaster的赛场上,机器人同时处理的任务、同时传递的消息繁多,这时候继续采用前后端的编程模式和全局变量的消息形式,就存在一定的局限性,不利于机器人控制逻辑的实现和代码的可维护性。这时候就需要使用嵌入式操作系统。在北航机器人队中,采用的嵌入式操作系统为FreeRTOS,几乎所有控制组的成员都需要掌握FreeRTOS的使用方法。
#### 任务要求
- 子任务1:查阅相关资料,简要谈谈为什么要使用嵌入式操作系统?字数不超过100字。
- 子任务2:查阅相关资料,谈谈你对操作系统FreeRTOS中任务、信号量等概念的理解?字数不超过200字。
- 子任务3:实现《RoboMaster开发板C型嵌入式软件教程文档》第十五章教程内容。
- **任务提交**:不要求提交。如果有能力完成,可以进行**邮箱提交**,地址为`bhjqrdkzz2022@163.com`。
#### 参考资料
- [RoboMaster开发板C型嵌入式软件教程文档](./RoboMaster开发板C型嵌入式软件教程文档.pdf)(第十五章)
### 8、了解RoboMaster比赛
#### 任务简介
> 全国大学生机器人大赛RoboMaster机甲大师赛,详情点击[RoboMaster 机甲大师赛](https://www.robomaster.com/zh-CN)
#### 任务要求
- 子任务1:查阅相关资料,简要谈谈你对RoboMaster的认识。
- 子任务2:北航机器人队计划于2024年首次参加RoboMaster的高校联盟赛,如果你能加入我们,简单谈谈你的计划和想要完成的目标。
- **任务提交**:可以进行**邮箱提交**,地址为`bhjqrdkzz2022@163.com`。