# 2021年算法组线上测试 **Repository Path**: buaarobot_admin/Online-test-of-algorithm-group-in-2021 ## Basic Information - **Project Name**: 2021年算法组线上测试 - **Description**: No description available - **Primary Language**: Unknown - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 3 - **Forks**: 1 - **Created**: 2021-07-15 - **Last Updated**: 2022-07-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 2021控制组PC方向入队测试 ### 测试三 #### 主要目的 * 学习webots的使用 * 掌握使用激光雷达计算机器人全局坐标的方法 * 学习webots和ros的联合仿真 ------- #### 任务一:学习webots的简单使用 > webots是一款跨平台的机器人仿真软件,我们可以用它来对我们的机器人进行仿真。在本次任务中,我们在`test3/task_workspace`中给出了一个ROS工作空间,其中包含有一个名为`lidar_simulation`的功能包,通过执行命令 > ``` > roslaunch lidar_simulation robot.launch > ``` > 启动该功能包。 > 该功能包提供了一个搭载有激光雷达的小车的webots仿真,要求创建名为`my_robot_1`的python控制器,并实现对小车的简单控制,将录屏保存为`test3_task1.mp4` > > 要求: > > > 1、需要控制小车分别演示前进,后退,左转,右转功能。实现以上四个功能即可,不对行进距离作规定。 > > 提示: > > 1、webots对电机有速度控制和位置控制,可参阅相关资料了解相应的控制函数 > > 2、请尽量安装webots2021a。2021b版本可能无法加载图片和纹理 > > 3、webots的入门使用请参考(https://www.guyuehome.com/6039) > > 4、小车的转弯可以通过轮子差速实现 > > 5、电机的名称可以在webots左侧栏节点树中查看 #### 相关资料 > [相关资料一](https://www.guyuehome.com/6039) #### 任务二:通过读取激光雷达的数据获取机器人当前在全局坐标系下的位置,并控制机器人沿指定轨迹运动 > 通过读取webots中激光雷达的数据,然后进行处理从而计算出机器人在全局坐标系下的位置。据此控制机器人运动完成一条特定的轨迹。 > 要求: > > > 1、使用webots和ROS联合仿真 > > 2、自行查阅webots中SickLms291雷达的相关函数,并将获取到的雷达扫描数据发送到ROS的`/lidar_data`话题上 > > 3、新建ROS节点,在新建的节点中订阅`/lidar_data`话题,并获得雷达数据. > > 4、使用第二周测试中完成的圆桶识别算法实时识别出所获取的点云中的圆桶的位置. > > 5、已知壶的半径为0.12m,场地中各个壶的位置如下图所示(单位:m): > ![](pic/test3_task2_pic1.jpg) > > 试根据激光雷达点云中识别出的各个桶相对激光雷达的位置和方向,实时求解出激光雷达(或小车)运动过程中在全局坐标系下的位置和方向角。将运行结果录屏保存为`test3_task2.mp4` > > 考虑到该定位问题难度较大,且算法可能较为复杂,这里要求在文档中写出算法实现的详细思路,保存为`test3_task2.docx`,即使最终算法没有完成,也可以在该文档中介绍自己在尝试解决该问题时所作的思考. > > > 提示: > > 1、对于陌生的传感器,除了上网搜索外还可以查看其document,webots传感器的document可以通过在右键点击原件,选择View PROTO Source查看 > > 2、轨迹较为简单,可以减小机器人的速度,每隔一段时间计算一次位置 > > 3、若webots报错/usr/local/webots/projects/default/controllers/ros/ros: error while loading shared libraries: libroscpp.so: cannot open shared object file: No such file or directory,只需要在命令行中用roslaunch命令打开webots(而不是点击图标)即可解决。 #### **提交要求** > * **提交方式: 将测试三中所需提交的所有文件打包在一个压缩包中命名为`{pc第三周测试题+你的名字}.zip`,提交到邮箱bhjqrdkzz2021@163.com** > * **无论结果正确与否,最后都请提交上来,结果的正确性不是唯一的评判标准。即使没有完成,也请在文档中说明当前的进度和遇到的困难** ### 测试二 #### 主要目的: * 学习基于opencv的图像处理和识别的方法 * 学习激光雷达的工作原理,了解激光雷达测量数据的特点 * 学习和探索从激光雷达测量数据中获取重要信息的方法 ------ #### 任务一:足球的识别 > `test2/task1`中有两段包含足球的视频,要求使用opencv找出视频中足球的位置,在视频的每一帧中用方框(其他明显标志也可)标识出足球,将处理后的视频保存在`test2/task1`。代码保存在`test2/task1`目录下。 > > 要求: > > > 1、代码必须含有完整的注释,而且需要在代码的开头,说明一下整体的代码思路,包含必要的函数说明(注:代码可读性和可移植性也在评判的标准里,含有一定的占比) > > > > 2、考虑到题目难度,这里不推荐使用神经网络。推荐使用opencv的支持向量机(svm),训练和测试数据自行从视频中截取。 > > > > 3、此类识别问题属于较困难的问题,因此允许一定比例识别错误的情况存在。 #### 相关资料 > [相关资料一](https://www.cnblogs.com/panchuangai/p/12619167.html) > > [相关资料二](https://blog.csdn.net/wangwei19871103/article/details/97514825?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_v2~rank_aggregation-2-97514825.pc_agg_rank_aggregation&utm_term=%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3&spm=1000.2123.3001.4430) > > ------ #### 任务二:借助激光雷达识别定位场地中的壶 > 1、查找激光雷达相关资料,了解激光雷达的工作原理。简述激光雷达的基本原理。 > > **请将上述内容总结归纳在一个文档中提交**,字数不限(请注意不要大段复制或过于简略),文档命名为`task2_1.md` > > 2、在本届robocon比赛中我们使用了激光雷达识别定位壶,本测试题中,要求利用给出的点云数据(机器人坐标系下)和世界坐标系下机器人的位置,给出世界坐标系下壶的位置,并将识别结果利用opencv在世界坐标系下绘制出来。 > > 已知:机器人的位置:x:1500mm y:1500mm yaw:0.785rad,坐标系示意图如下,O'xy为机器人坐标系,OXY为世界坐标系。 > > ![](pic/test2_task3.png) > > ​ `test2/task2/point_cloud`给出七组点云数据(机器人坐标系下,第一列x,第二列y,单位:mm),七组点云的识别难度递增,要求用同一套代码完成点云数据的识别**(点云数据5、6、7添加了噪声,做为选做)**。 > > ​ 壶的半径:200mm > > 要求: > > > 1、给出世界坐标系下壶的位置,并将识别结果利用opencv在世界坐标系下绘制出来,注意坐标系的转换,代码中每一个变量的参考坐标系必须要在变量名中体现出来。代码保存在`test2/task2`目录下。须将代码运行的结果录屏,和代码放在同一目录下保存。 > > > > 2、代码必须含有完整的注释,而且需要在代码的开头,说明一下整体的代码思路,包含必要的函数说明(注:代码可读性和可移植性也在评判的标准里,含有一定的占比)。 > > > > 3、此类识别问题属于较困难的问题,因此允许一定比例识别错误的情况存在。 #### 提示 > 这里给出一种简单的方法:将点云绘制在灰度图中→霍夫圆检测找到圆心坐标→坐标系转换,由于霍夫圆检测可能会检测到墙壁,这里给出墙壁的位置,以便更好地得到结果。墙壁围成一个矩形,四个角点在世界坐标系下的坐标为(0, 0), (0, 10000), (10000, 10000), (10000, 0) 单位:mm #### **提交要求** > * 提交方式: 将测试二中所需提交的所有文件打包在一个压缩包中命名为`{pc第二周测试题+你的名字}.zip`,提交到邮箱bhjqrdkzz2021@163.com。 > * 无论识别结果正确与否,最后都请提交上来,结果的正确性不是唯一的评判标准。 #### **相关资料** >> [python代码注释要求参考标准规范1](https://www.jianshu.com/p/d414e90dc953) >> [python代码注释要求参考标准规范2](https://www.runoob.com/w3cnote/google-python-styleguide.html) >> [opencv-python学习资料](https://www.kancloud.cn/aollo/aolloopencv/269602) >> [书籍:OpenCV-Python-Toturial-中文版](https://bhpan.buaa.edu.cn:443/link/BBE5AF8C03744B175217FB39BCD40D41) ------ ### 测试一 #### 主要目的: * 学习PID控制基础知识和调参方法 * 学习Linux安装与基本环境配置 * 学习ROS的安装和基本使用方法 * 学习git的基本应用 #### 任务1: 学习PID控制基础知识和调参方法 > PID控制是一种使用简单且非常常用反馈控制方法,请自行查阅文献资料并总结PID > 控制的原理,目的,各参数意义和调参的原则或方法。 > > **请将上述内容总结归纳在一个文档中提交**,字数不限(请注意不要大段复制或过于简略),文档命名为`task1.docx` ------ #### 任务2.1: 安装Ubuntu系统(推荐[18.04或20.04版本](https://ubuntu.com/download/alternative-downloads)),学习基本的Linux命令操作 > Ubuntu是Linux的发行版之一, 拥有比较友好的图形界面,因ROS一般会选择在Ubuntu上运行,故我们选用Ubuntu。 > > 在之后的入队测试中我们会在Ubuntu中安装`ROS`(Robot Operating System,开源的机器人操作系统)和`Webots`(一款基于ODE的开源动力学仿真软件),因此不推荐在虚拟机中安装Ubuntu系统。安装双系统时需特别**注意数据安全,备份好电脑中重要的数据**,避免误删文档或误格式化磁盘。 > > 安装Ubuntu之后,建议先进行更换软件源操作,具体操作方式:[清华源Ubuntu镜像](https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/)。 > > 推荐资料:[Linux基本命令](https://www.jianshu.com/p/3a40cc6f20f5) (常用命令简介),[鳥哥的 Linux 私房菜](http://linux.vbird.org/) (经典的Linux入门教程,内容较长,选读),[*GNOME扩展](https://linuxconfig.org/how-to-install-gnome-shell-extensions-on-ubuntu-18-04-bionic-beaver-linux) 可方便地为GNOME桌面环境增加第三方插件,其中包括屏幕录制插件`Easyscreencast`,**如不使用该插件,请自行找寻安装录屏软件,提交任务时需要屏幕录像**) #### 以下任务请全部在Ubuntu系统中完成 #### 准备工作: > > 首先安装git,在终端中输入以下代码(如果安装速度很慢,则需要更换apt软件源) > > ``` > sudo apt update > sudo apt install git > ``` > > 之后使用以下命令,将本仓库克隆到本地 > > ``` > git clone https://gitee.com/buaarobot_admin/Online-test-of-algorithm-group-in-2021.git > ``` #### 任务2.2: 以下操作均要求使用命令在终端中完成 > 1. 安装`vim`文本编辑器,以便命令行界面下编辑文本文件 > > 2. 在`test1/task2/children`目录下有1000个文件,每个文件中均有一些文字 > > 3. 请利用Linux基本命令找到内容中包含`bad guy`字符串的文件,并将其改名为`Tom.txt`. > > 4. 在`test1/task2`目录下新建名为`kindergarten`的文件夹,将`Tom.txt`移动到`kindergarten`文件夹下 > > 5. 最后使用`vim`将`Tom.txt`中的`bad guy`修改为`good guy`并保存. > > **请录制以上2~5步操作全部过程,作为视频文件提交**,视频命名为`task2.mp4` ------ #### 任务3: ROS的安装和使用 #### 任务背景 > 为具有复杂系统的机器人编写上位机程序时,为确保代码具有良好的可读性、逻辑性以及扩展性,就需要设计良好的程序结构。这项工作是很困难的,需要编写大量代码使各个不同功能模块能够协调地工作,且需要解决好各个进程间通信的问题。ROS系统的出现使这一问题得到了很好的解决。 > > ROS中,将一个完成特定功能的单元抽象为一个“节点(node)”,节点之间可以通过多种通信接口方便地通信。同时,还整合了多种机器人常用的功能包(如导航)。借助ROS,我们的机器人一般有如下的系统结构: > > ![test1_task2_pic1](pic/test1_task3_pic1.png) > > 当上位机代码写好后需要进行测试时,为了避免因bug造成机器人的损坏,前期的测试通常在仿真环境下进行。使用仿真软件测试时,只需要将上下位机通信的节点替换成仿真软件的控制节点,其他控制节点不做修改。系统结构如下图所示: > > ![test1_task3_pic2](pic/test1_task3_pic2.png) > > ##### 准备工作 > > 1.安装ROS系统,所安装的ROS版本和ubuntu系统版本存在一一对应关系,ubuntu18安装[ros-melodic](http://wiki.ros.org/melodic/Installation/Ubuntu), ubuntu20安装[ros-noetic](http://wiki.ros.org/noetic/Installation/Ubuntu). > > 如果遇到下载速度慢,则需要更换为从国内的镜像源下载。[参考方法](https://www.cnblogs.com/letisl/p/11815191.html)。这个教程里还介绍了部分安装中问题的解决方法,虽然这个教程适用的版本比较老,但方法仍然适用。 > > ros的pythonAPI参考[ros python API](http://wiki.ros.org/rospy/Overview) 或者可以参考题目的代码 > > 本任务中大量时间将会花在ROS的学习上,建议借助[视频教程](https://www.bilibili.com/video/BV1zt411G7Vn?from=search&seid=1072408026659763320)帮助学习 #### 任务3.1: 运行ROS项目 > 1. 在`test1/task3`目录下有一ROS工作空间,在该目录下使用`catkin_make`命令编译该工作空间 > 2. 使用`source devel/setup.bash`加载资源 > 3. 工程中`src`目录下包含两个功能包:`turtle_pkg`和`controller_pkg`.其中`turtle_pkg`包中包含有一仿真节点`turtle_node.py`,模拟了一只小海龟在冰面上爬行寻找食物的场景.由于冰面十分光滑小海龟运动时将会在冰面上滑行.`turtle_node`节点会以topic的形式发布小海龟当前的位置和速度信息,并在参数服务器中`food`键下发布食物的位置信息,通过订阅名为`force`的topic获取小海龟爬行时的用力.`controller_pkg`包中包含有一控制器示例节点`controller_node,py`,该节点向名为`force`的topic上发布小海龟爬行时的用力信息,从而实现对小海龟运动的控制. > 4. 使用`roslaunch turtle_pkg turtle.launch`命令启动该工程(该工程使用了python3的pygame和numpy库,如未安装则需要现安装这两个python库才能运行),工程启动后将看到如下界面. > ![test1_task2_pic3](pic/test1_task3_pic3.png) #### 任务3.2: 编写自己的控制器 >1. 在本工作空间内创建自己的ROS功能包,并参照`controller_pkg`功能包中`controller_node.py`编写自己的控制器节点对小海龟的运动进行控制. > >2. 通过修改`turtle_pkg`功能包中`turtle.launch`文件中的内容,使项目启动时不再启动`controller_node.py`实现的节点,并同时添加启动1.中自己创建的功能包中控制小海龟运动的节点. > >3. 使用自己编写的控制器控制小海龟的运动并吃到所有食物,可手动控制. > >4. 选做: 使用自己编写的控制器控制小海龟的运动并吃到所有食物,要求控制过程为自动控制,控制算法不限,但不能手动操作移动. > > > >**请将以上两个任务的最终运行结果录制视频,作为视频文件提交,视频命名为`task3_1.mp4`和`task3_2.mp4`** > >**将最终工的作空间(`test1/task3`)打包提交,命名为`task3_workspace.zip`** > >**注意: 不可以修改`test1/task3/src/turtle_pkg`目录下除launch文件之外的任何文件** ### 注意事项: > * **提交方式: 将测试一中所需提交的所有文件打包在一个压缩包中命名为`{pc第一周测试题+你的名字}.zip`,提交到邮箱bhjqrdkzz2021@163.com** > * **如果没有完成,请在测试一的文档最后说明当前的进度和遇到的困难** > * **如果发现有相互抄袭者,直接取消入队资格** > * 我们将会发布对于测试一的难易程度调查,请注意留意群内消息及时回复,测试二与测试三的难度可能据此动态调整 > * 对于测试的任何问题,都可以在群内提问,我们鼓励群内交流与讨论