空地协同系统的教学与研究应用
目录
- 软件开发:机器学习、ROS、Linux以及C++和Python编程语言 1.1 Linux操作系统 1.2 ROS机器人操作系统 1.3 Python编程语言 1.4 机器学习与神经网络
在科研、教学方面的应用
空地协同系统除了在生产、办公等实际场景的应用以外,同样也适合用于辅助各高校的科研和教学任务。本系统涉及较多前沿技术,包括机械、硬件设计以及软件开发等科目,以本系统作为教学或科研工具将有效提高学生或科研人员在这三个科目的学习或研究进度。
1. 软件开发:机器学习、ROS、Linux以及C++和Python编程语言
要熟练掌握空地协同系统的使用,至少需要熟练掌握Linux操作系统、一定程度地了解ROS机器人操作系统;而要在现有的系统之上做二次开发则需要熟练掌握ROS,会写C++/Python并且了解机器学习相关的知识。这些都是目前前沿领域非常热门且对相关人才需求度极高的内容。
1.1 Linux操作系统
Linus Torvaldo 基于unix 基本架构重新编码的Linux系统是全世界被最为广泛使用的计算机操作系统,没有之一。小至掌上芯片的嵌入系统,大至超级计算机的操作系统,Linux都能极好地胜任。因此Linux系统的熟练使用是每一个数字行业从业人员都不可或缺的基本技能。
对于操作系统的学习和精通最有效的途径毫无疑问是长时间的上手使用。Linux是一项工具而不能算“专业知识”。这也就是说我们并不应该抱着“为了学用Linux而去用Linux”的心态去上手使用Linux系统——Linux本身就像是数字行业的电动螺丝刀,用熟了电动螺丝刀可以让大大提升你在机械、工程领域的实际工作。你也并不真的需要去专门学习如何使用电动螺丝刀,因为你在拧螺丝的时候给你从手工螺丝刀换电动螺丝刀是能极大提升你的操作体验的,因此对这样“基本工具”的使用技巧应该跟其他更具体的作业任务同步进行——你动手装配一台工程机械,在中途给你把手工螺丝刀换成电动螺丝刀,你的工作进度会大大加快,同时你对电动螺丝刀的使用熟练度也必然随之增长。Linux是同样的道理,不管是软件开发、安全运维、网站搭建还是机器人操作编程,你在做这些具体的工作时候自然会发现Linux的优越性,然后随着工作的进行你的Linux技巧也必然提升。
空地协同系统的操作使用以及二次开发正好提供了这样一项具体的工作任务。对ROS系统的操作开发离不开Linux;对各种单片机和嵌入式芯片的通讯编程需要Linux;编写上层应用、搭建网页服务端、操控以及开发无人机认同同样必须用到Linux。在这实践操作的强烈驱动下,学生和研究人员对Linux系统的熟练度必然能快速成长。
同时,本文空地协同操作手册以及更多的空地协同相关资料也包含了大量的Linux使用的基础讲解和案例。另外,研究院也提供技术支持和人工教学,帮助客户全面掌握所需的Linux技巧和知识。
1.2 ROS机器人操作系统
ROS 是一个适用于机器人的开源的元操作系统。它提供了操作系统应有的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。它也提供用于获取、编译、编写、和跨计算机运行代码所需的工具和库函数。在某些方面ROS相当于一种“机器人框架(robot frameworks)”类似的“机器人框架”有:Player,YARP,Orocos,CARMEN,Orca,MOOS和 Microsoft Robotics Studio。
ROS 运行时的“蓝图”是一种基于ROS通信基础结构的松耦合点对点进程网络。ROS实现了几种不同的通信方式,包括基于同步RPC样式通信的服务(services)机制,基于异步流媒体数据的话题(topics)机制以及用于数据存储的参数服务器(Parameter Server)。
ROS并不是一个实时的框架,但ROS可以嵌入实时程序。Willow Garage的PR2机器人使用了一种叫做pr2_etherCAT的系统来实时发送或接收ROS消息。ROS也可以与Orocos实时工具包无缝集成。
ROS系统通常由大量节点组成,其中任何一个节点均可以通过发布/订阅的方式与其他节点进行通信。举例来说,机器人上的一个位置传感器如雷达单元就可以作为ROS的一个节点,雷达单元可以以信息流的方式发布雷达获得的信息,发布的信息可以被其他节点如导航单元、路径规划单元获得。
ROS作为一个灵活的操作系统,其上的节点具有很大的随意性,它们可以位于不同的计算机上,甚至可以位于不同的网络上。举例来说,我们可以使用一个Arduino作为一个节点发布信息,使用一台笔记本电脑作为一个节点订阅上述信息以及使用一台手机作为一个节点驱动电机等。上述灵活性使得ROS可以适应很多不同场合的应用,另外,ROS还是一个开源的系统,由专门的社区维护。
鉴于ROS系统的以上有点,大量的机器人开发者选择将ROS作为他们的机器人控制和内部通讯框架。因此ROS社区中有相当数量的第三方厂商或独立开发者上传的功能性软件包,这对于刚起步的机器人开发者或者学生是非常有利的条件——新手们可以借前辈们的东风少走很多弯路。而ROS的开源特性更是学习者们的福音:你可以随时查看每一个ROS软件包的源代码,了解其中的算法和原理,然后尝试运用或者维护、优化它。在对ROS各软件包源代码的查看和学习中,学习者的编程知识、硬件知识、系统知识也都同步地快速提升。
本空地协同系统搭配有完整的ROS操作文档和开发手册,帮助任何想涉足机器人开发领域的新手快速入门ROS。如果是各高校或专业技术学校需要将我们的空地系统用于教学,研究院可以在适当时机组织教师或技术人员来公司进行集中培训,以最优化教学任务。
1.3 Python编程语言
随着大数据、人工智能技术的成熟和规模化应用,我国人工智能产业步入高速发展阶段。 目前,数据分析,尤其是基于 Python 的高级数据分析已成为越来越多专业领域人才的必备能力和教学改革的新热点。作为大数据、人工智能领域最流行最受欢迎的编程语言 -- Python 语言也已成为很多大数据、数据科学、数据分析、人工智能、机器学习、统计学以及相关专业的必修课程。针对大数据、人工智能类专业,尤其是数据科学与大数据技术、大数据管理与应用、大数据技术与应用、人工智能、商务智能、数据分析等专业的教学和学习需要,
Python是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。它的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。
Python有着以下优点:
简单 -- Python 是一种代表简单主义思想的语言。阅读一个良好的 Python 程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python 的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。 易学 -- 就如同你即将看到的一样,Python 极其容易上手。前面已经提到了,Python 有极其简单的语法。 免费、开源 -- Python 是 FLOSS(自由/开放源码软件)之一。简单地说,你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS 是基于一个团体分享知识的概念。这是为什么 Python 如此优秀的原因之一——它是由一群希望看到一个更加优秀的 Python 的人创造并经常改进着的。 高层语言 -- 当你用 Python 语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。 可移植性 -- 由于它的开源本质,Python 已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有 Python 程序无需修改就可以在下述任何平台上面运行。这些平台包括 Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE 甚至还有 PocketPC、Symbian 以及 Google 基于 Linux 开发的 Android 平台! 解释性 -- 这一点需要一些解释。一个用编译性语言比如 C 或 C++ 写的程序可以从源文件(即 C 或 C++ 语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而 Python 语言写的程序不需要编译成二进制代码。你可以直接从源代码运行程序。在计算机内部,Python 解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用 Python 更加简单。由于你只需要把你的 Python 程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的 Python 程序更加易于移植。 面向对象 -- Python 既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如 C++ 和 Java 相比,Python 以一种非常强大又简单的方式实现面向对象编程。 可扩展性 -- 如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用 C 或 C++ 编写,然后在你的 Python 程序中使用它们。 丰富的库 -- Python 标准库确实很庞大。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV 文件、密码系统、GUI(图形用户界面)、Tk 和其他与系统有关的操作。记住,只要安装了 Python,所有这些功能都是可用的。这被称作 Python 的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如 wxPython、Twisted 和 Python 图像库等等。 规范的代码 -- Python 采用强制缩进的方式使得代码具有极佳的可读性。
而Python在国内同样有着以下缺点:
运行速度,有速度要求的话,用 C++ 改写关键部分吧。 国内市场较小(国内以 Python 来做主要开发的,目前只有一些 web2.0 公司)。但时间推移,目前很多国内软件公司,尤其是游戏公司,也开始规模使用他。 中文资料匮乏(好的 Python 中文资料屈指可数,现在应该变多了)。托社区的福,有几本优秀的教材已经被翻译了,但入门级教材多,高级内容还是只能看英语版。 构架选择太多(没有像 C# 这样的官方 .net 构架,也没有像 ruby 由于历史较短,构架开发的相对集中。Ruby on Rails 构架开发中小型web程序天下无敌)。不过这也从另一个侧面说明,python比较优秀,吸引的人才多,项目也多。
配合空地协同系统进行Python学习,其目的与主要收获有:
- 掌握数据分析领域的核心知识、关键技术、常用方法、主要技能及最新动态;
- 掌握基于 Python 的数据理解、数据加工和数据预处理方法;
- 掌握基于 Python 的数据可视化方法;
- 掌握基于统计学的数据分析方法及其 Python 编程能力;
- 掌握基于机器学习的数据分析方法及其 Python 编程能力;
- 掌握基于 Spark 和 MongoDB 的大数据分析方法;
- 采用理论讲解与上机操作同步讲解方式,重点培养学习兴趣与信心、动手操作能力 和继续自学能力;
- 提供配套课程资源,交流相关课程的教学设计以及科学研究方法。
1.4 机器学习与神经网络
通过空地协同系统的学习,可以理解机器学习、知识图谱的思维方式和关键技术;了解机器学习 和知识图谱在当前工业界的落地应用;了解知识图谱是什么,能做什么,当前的研究及落地经典案例,能够根据数据分布选择合适的算法模型并书写代码,解决应用问题的过程,解决各自领域的具体问题。可以胜任数据挖掘、机器学习、深度学习、知识图谱等工作,全流程构建、项目架构设计并且能够实际动手完成案例。
空地协同系统对于理解机器学习和神经网络有着以下重要作用: - 理论与实现紧密结合。系统讲解了机器视觉的基本原理、核心技术及深度学习最新 应用,同时与 OpenCV 实例紧密配合,内容生动形象; - 机器学习部分采用 PyTorch,与国内常用的 Tensorflow 相比,在研究中应用更为广泛, 同时易于上手,便于今后在此基础上开展应用; - 智能系统目前处于飞速发展的状态,但目前系统讲解相对缺乏。空地协同系统从原理及机器人应用两个层面对这一部分内容进行讲解,内容新,有助于教师开展新方向研究。
对于教学任务,有着以下几个目标: - 掌握机器视觉领域的理论框架,核心技术,算法实现及前沿动态; - 掌握数字图像处理的基础原理及核心算法。配合 OpenCV 掌握 Python 实现; - 掌握运动跟踪与估计的基本方法及 OpenCV 实现; - 掌握 2-1/2 维及三维视觉的基本理论及重要方法,包括多视几何基本原理,相对位 姿估计,立体视觉,三维重构等。配合 Python 实例,掌握具体应用; - 配合 PyTorch 实例,掌握深度学习图像分类的常用基网络,包括 AlexNet, VGG, ResNet 等; - 深度学习应用于计算机视觉的热门方向及最新进展,包括目标识别,图像分割,风格 转换等,同时配合 PyTorch 实例; - 了解智能系统的最新进展及相关领域、具体研究内容,包括智能无人系统、多智能 体系统等; - 掌握机器人操作系统 ROS 的基本安装及操作。
我们来简单介绍下机器学习和神经网络。
历史上,科学家一直希望模拟人的大脑,造出可以思考的机器。人为什么能够思考?科学家发现,原因在于人体的神经网络。
外部刺激通过神经末梢,转化为电信号,转导到神经细胞(又叫神经元)。 无数神经元构成神经中枢。 神经中枢综合各种信号,做出判断。 人体根据神经中枢的指令,对外部刺激做出反应。
既然思考的基础是神经元,如果能够"人造神经元"(artificial neuron),就能组成人工神经网络,模拟思考。上个世纪六十年代,提出了最早的"人造神经元"模型,叫做"感知器"(perceptron),直到今天还在用。
上图的圆圈就代表一个感知器。它接受多个输入(x1,x2,x3...),产生一个输出(output),好比神经末梢感受各种外部环境的变化,最后产生电信号。
为了简化模型,我们约定每种输入只有两种可能:1 或 0。如果所有输入都是1,表示各种条件都成立,输出就是1;如果所有输入都是0,表示条件都不成立,输出就是0。
下面来看一个例子。城里正在举办一年一度的游戏动漫展览,小明拿不定主意,周末要不要去参观。
他决定考虑三个因素。
天气:周末是否晴天? 同伴:能否找到人一起去? 价格:门票是否可承受? 这就构成一个感知器。上面三个因素就是外部输入,最后的决定就是感知器的输出。如果三个因素都是 Yes(使用1表示),输出就是1(去参观);如果都是 No(使用0表示),输出就是0(不去参观)。
看到这里,你肯定会问:如果某些因素成立,另一些因素不成立,输出是什么?比如,周末是好天气,门票也不贵,但是小明找不到同伴,他还要不要去参观呢?
现实中,各种因素很少具有同等重要性:某些因素是决定性因素,另一些因素是次要因素。因此,可以给这些因素指定权重(weight),代表它们不同的重要性。
天气:权重为8 同伴:权重为4 价格:权重为4 上面的权重表示,天气是决定性因素,同伴和价格都是次要因素。
如果三个因素都为1,它们乘以权重的总和就是 8 + 4 + 4 = 16。如果天气和价格因素为1,同伴因素为0,总和就变为 8 + 0 + 4 = 12。
这时,还需要指定一个阈值(threshold)。如果总和大于阈值,感知器输出1,否则输出0。假定阈值为8,那么 12 > 8,小明决定去参观。阈值的高低代表了意愿的强烈,阈值越低就表示越想去,越高就越不想去。
上面的决策过程,使用数学表达如下:
上面公式中,x表示各种外部因素,w表示对应的权重。
单个的感知器构成了一个简单的决策模型,已经可以拿来用了。真实世界中,实际的决策模型则要复杂得多,是由多个感知器组成的多层网络。
这张图里,信号都是单向的,即下层感知器的输出总是上层感知器的输入。现实中,有可能发生循环传递,即 A 传给 B,B 传给 C,C 又传给 A,这称为"递归神经网络"(recurrent neural network).
我们对上面的模型进行一些数学处理:
外部因素 x1、x2、x3 写成矢量 <x1, x2, x3>,简写为 x 权重 w1、w2、w3 也写成矢量 (w1, w2, w3),简写为 w 定义运算 w⋅x = ∑ wx,即 w 和 x 的点运算,等于因素与权重的乘积之和 定义 b 等于负的阈值 b = -threshold
感知器模型就变成了下面这样:
一个神经网络的搭建,需要满足三个条件:
输入和输出 权重(w)和阈值(b) 多层感知器的结构
也就是说,需要事先画出上面出现的那张图。
其中,最困难的部分就是确定权重(w)和阈值(b)。目前为止,这两个值都是主观给出的,但现实中很难估计它们的值,必需有一种方法,可以找出答案。
这种方法就是试错法。其他参数都不变,w(或b)的微小变动,记作Δw(或Δb),然后观察输出有什么变化。不断重复这个过程,直至得到对应最精确输出的那组w和b,就是我们要的值。这个过程称为模型的训练。
因此,神经网络的运作过程如下:
确定输入和输出 找到一种或多种算法,可以从输入得到输出 找到一组已知答案的数据集,用来训练模型,估算w和b 一旦新的数据产生,输入模型,就可以得到结果,同时对w和b进行校正
可以看到,整个过程需要海量计算。所以,神经网络直到最近这几年才有实用价值,而且一般的 CPU 还不行,要使用专门为机器学习定制的 GPU 来计算。
上面的模型有一个问题没有解决,按照假设,输出只有两种结果:0和1。但是,模型要求w或b的微小变化,会引发输出的变化。如果只输出0和1,未免也太不敏感了,无法保证训练的正确性,因此必须将"输出"改造成一个连续性函数。
这就需要进行一点简单的数学改造。
首先,将感知器的计算结果wx + b记为z:
z = wx + b 然后,计算下面的式子,将结果记为σ(z): σ(z) = 1 / (1 + e^(-z)) 这是因为如果z趋向正无穷z → +∞(表示感知器强烈匹配),那么σ(z) → 1;如果z趋向负无穷z → -∞(表示感知器强烈不匹配),那么σ(z) → 0。也就是说,只要使用σ(z)当作输出结果,那么输出就会变成一个连续性函数。
原来的输出曲线是下面这样:
现在变成了这样:
实际上,还可以证明Δσ满足下面的公式:
即Δσ和Δw和Δb之间是线性关系,变化率是偏导数。这就有利于精确推算出w和b的值了。