人工智能不仅要复现人类的大脑,还要构建容纳智能大脑的身体,机器人将是人工智能的完全体。8月7日-8月9日,2020年全球人工智能和机器人峰会(简称“CCF-GAIR 2020”)在深圳如期举办!CCF-GAIR由中国计算机学会(CCF)主办,雷锋网、香港中文大学(深圳)联合承办,鹏城实验室、深圳市人工智能与机器人研究院协办,以“AI新基建 产业新机遇”为大会主题,致力打造国内人工智能和机器人领域规模最大、规格最高、跨界最广的学术、工业和投资领域盛会。今年CCF-GAIR 2020 的“机器人前沿专场”汇集了来自学术界和产业界的专家、有院士级人物、承担国家级机器人研究项目的大牛以及产研能力兼具、奋斗在机器人商业化一线战场的开拓者。本次专场首先出场的嘉宾是加拿大阿尔伯塔大学终身教授张宏。张宏教授是加拿大工程院院士、IEEE Fellow。曾经担任在温哥华举行的2017年IEEE 世界智能机器人与系统大会(IROS)总主席,最近马上要加入中国南方科技大学电子与电器工程系。迄今为止,张宏教授已在国际顶级期刊及重要会议上发表了将近200余篇文章,涉及机器人操作、多智能系统、视觉检测和视觉导航。张宏教授今天的演讲主题是《移动机器人全局定位技术与方法》。张宏:大家早上好,非常高兴有机会和大家在这里交流一下我在移动机器人全局定位话题的了解。今天是以分享学术研究的角度给大家做报告,其中包括我所了解到这方面研究的回顾,也包括我本人近年的工作。
1
机器人导航大家都知道,机器人分不同形式,有操作的机器臂,还有移动机器人,所有移动机器人都需要进行导航,包括防爆机器人、双足机器人、四足机器人、清洁机器人、UVA、自动驾驶机器人等等,所有的移动机器人都必须有一个自主导航的功能。我今天的报告围绕移动机器人导航这个话题,首先给大家介绍一下导航都牵涉到的几个方面,今天的重点是放在移动机器人的全局定位的这个问题上。机器人定位这件工作需要一些传感信息,对于环境感知的传感器,主要讲两大类:激光雷达和视觉。主要的时间回顾一下过去和最近机器人、移动机器人定位方面的研究工作,最后花几分钟和大家分享这个研究方向的展望。大家对于移动机器人这个题目应该不陌生,传统的研究方向起码包括这几类:轨迹规划、避碍、构建地图和定位。构建地图和定位这两个工作又是耦合的,没有地图也就谈不到定位,我们做地图的过程当中也需要定位,所以这两件工作必须同时完成。二者的同时研究称之为SLAM, 即simultaneouslocalization and mapping的缩写。
2
机器人定位:局部vs全局今天的报告侧重于定位问题,定位又分为全局定位和局部定位,为了完成这件工作,有三类传统方式:优化方法、全景描述方法和局部特征匹配方法。任何一种方法都必须有传感器信息的支持,我今天主要讲如何利用激光雷达和视觉信息完成全局定位。如何完成全局定位呢?可以用传统的手工建立模型的方法,也可以用机器学习的方法,我们讲定位这件事时有一个假设:地图是已知的。刚刚已经提到,定位这件工作分两个类,一类是局部定位/精定位,前一瞬间机器人做动作的时候位置是已知的。另一类为全局定位更难一些。全局定位的困难和挑战,来源于三个方面:1、缺乏先验知识;即前一瞬间机器人的位置是未知的。2、在重新定位和闭环检测的时候,即机器人回到某个曾访问过的位置,会发生各种各样的变化,包括光照、视角的变化,同时也有一些动态的物体造成的变化;3、大尺度。因为常常地图包含了很多不同的位置,把目前传感器观察到的信息和地图里面的不同位置的信息进行匹配时,会牵涉到计算复杂性的问题,我们把这个挑战称之为大尺度问题。谈到这里不妨从仿生学看看自然界的鸟类是如何完成这件工作的,并从中得到启发。大家肯定知道候鸟导航能力是相当强的,可以跨越超过一万公里之外的目的地,顺利完成导航任务。它们是如何完成的呢?无外乎是依靠如下几类传感技术:1、眼睛。视觉是使得它们完成中距离和近距离的导航;2、方向。通过地球磁场、太阳偏振光、星星和时间的概念,来完成长距离的导航工作。3、地图。也许我们人在这方面不是很强,但是自然界的动物,包括鱼和鸟都通过嗅觉来完成导航。还有一些鸟有声纳能力,可以通过声音来测距。这些鸟类使用的传感技术实际上和机器人完成全局定位使用的传感技术是非常类似的。
3
机器人定位传感器
机器人做定位也需要传感器,主要分两大类:激光雷达和视觉。早年激光雷达由西方的公司Velodyne、Hokuyo 和SICK垄断,但今年国内科学技术突飞猛进的发展,出现了令人兴奋的激光雷达产品。导航定位也需要其他的传感器,比如说全球定位、雷达声纳和视觉深度像机传感器等。 不同的传感器有不同的优缺点,我谈一下激光雷达和视觉之间的比较。激光雷达产生的是点云,做全局定位需要解决的工作是把激光雷达观察到的点云跟地图中若干个点云进行匹配或者是数据关联。优点是精度高、具有三维信息;缺点是缺乏纹理信息。相比之下,视觉提供了激光雷达不能提供的纹理信息,但是精度低一些,在室外能达到十几米、几十米的定位精度,室内则可以达到厘米级。当然,视觉最大的问题之一就是失去了三维信息。刚刚谈到了什么是全局定位,它和局部定位有什么区别;同时也谈到了传感技术,接下来谈一下全局定位技术,即完成该工作的算法。全局定位的问题有二十余年的研究历史,很有趣的是,最开始全局定位方法是由激光雷达做起的,主要利用传统的手工特征,即对激光雷达点云进行处理、提取特征,通过特征匹配完成全局定位,匹配算法是基于优化的方法。目前发展方向主要是基于视觉完成全局定位,特征提取的手段主要是依靠深度学习,而且是利用对局部的特征进行提取和匹配,完成全局定位。从方法分类上,全局定位的技术有三个维度:1、传感信息的来源:激光雷达、视觉和多模式融合。2、特征提取方法:传统手工模型—由于原始数据量非常大,而且辨别力往往不好,所以需要对其进行特征提取—和通过深度学习完成的方法。3、定位算法,利用提取出来的特征完成定位这件事情:优化方法--定位损失函数到达最小值的时候就为机器人的位置、通过全景描述符匹配或局部特征匹配完成定位的事情。任何一种全局定位方法无外乎就是选择某种传感器+特征提取方法+算法构成。
4
机器人定位研究:过去和现在我这里首先介绍一些比较经典的工作,这篇文章是在1999年完成的,是我能想到最经典的方法,还有很多同学和朋友用过ROS (robot operating system),对AMCL函数非常的熟悉,假设下图中间蓝色的地图是已知的,给定激光雷达的点云,这个点云是单线也即由二维的激光雷达获取,通过对机器人可能出现的位置进行逐步的更新、优化,最后可以完成对机器人定位这件工作。ACML利用的工具是离子滤波器,也是一种优化的方法。那么我们可以把这个最经典的方法从三个维度分类,它是利用二维激光雷达、手工特征和优化计算方法完成全局定位工作。再往前推进10年,到2008年的时候,也有代表性的文章,通过子地图匹配的方法。刚刚讲到了做全局定位时往往需要对原始数据进行处理,原始数据量大,辨别力低,处理比较麻烦,所以需要对其进行特征提取。这个文章提出了一个基于直方图的特征,用这些直方图来刻画子地图,完成对子地图之间的匹配。相当于用一个点云对准的方法完成这个定位的过程,就是把定位的问题转换为点云对准的问题加以解决。
再往前推进10年是谷歌推出的大家比较熟悉的激光雷达SLAM算法,这也牵涉到全局定位的问题,通过对地图网格化,对机器人的位置进行估计,对特征提取这件事它最大的特点是它所使用的branch-and-bound优化方法很成熟,使得它做全局定位的方法比前人提出方法效果好很多。
最近有代表性的方法体现在这篇CVPR 2019发表的文章,用深度学习的方法来完成全局定位这件工作。这个网络分两大部分:
1、最左边三个不同的点云,对每个点云初步计算,把每个点云位置确定出来。2、右边的部分是把这几个已经初定位的定云进行精定位。就是把全局定位分解成地图、点云对齐的两步。是一种利用优化解决全局定位的方法,单优化的过程不是通过经典的解析优化算法,而是通过神经网络来完成优化,效果相当好。
以上介绍的所有方法都是基于二维的点云完成全局的定位,到了10年前,即2010年左右,三维点云、多线激光雷达技术慢慢地成熟,随之而来的是基于三维点云分析方法和移动机器人全局定位方法。这篇文章解决了尺度问题:首先对三维多线激光雷达产生的点云进行特征(NARF)提取,把现在观察到的NARF特征跟地图中的NARF特征进行快速匹配,完成全局定位。此外,和上一件工作类似,这篇文章介绍了更新颖的三维特征点Gestalt的提取方法,提高辨别力,使得点云匹配的效果非常好。 以上的所有的工作都是基于对三维点云中局部特征点的匹配来完成全局定位工作,2016年我有两个学生首次提出了如何产生所谓全局描述符:给定一组由若干个点云组成的地图,之后对每一个点云进行描述,把地图所有点云变成了描述符;当机器人观察到某一个点云时用同样的方法对其进行刻划,产生描述符。然后把观察到的描述符和地图中的描述符进行一一匹配之后,进行相似度计算,可以产生当下机器人的位置。 这件工作中描述符是如何产生的呢?输入是一个点云,输出是向量,该向量描述了点云的特征,产生过程包括若干个步骤。首先把点云投影到几个特定的二维平面,再产生直方图,直方图拼接构成矩阵,通过对矩阵进行奇异值分解(SVD)计算该矩阵的左右特征向量,最后把两个对应最大奇异值的左右特征向量拼在一起,构成一个一维的向量作为点云的描述符。描述符的代码是开源的:https://github.com/LiHeUA/M2DP视频中介绍的是验证实验 (https://www.youtube.com/watch?v=o87MGK8qQaY)。工作是在很流行的公共数据集上完成的,左上角是机器人观察到的视觉图像(在定位中没有使用),右上角是不同位置采集的点云,每一个点云都要进行描述符的计算,地图中的不同位置由若干个描述符刻画,当机器人回到曾访问过的某个位置时,对现在观察的描述符和地图中描述符进行相似度计算后,当该相似度超越某个阈值后,就可以完成当下机器人全局定位的工作。 近两年全景描述符越来越流行了,包括现在用深度学习的方法产生一维的向量,作为全局点云图的刻画,用视觉完成这件事的时候受光照变化影响很大,但是激光雷达产生的点云则对光照变化有更好的鲁棒性,可以有效完成高精度全局地位工作。 之前给大家介绍了如何利用二维和三维点云完成全局定位,下面介绍如何利用视觉信息来完成全局定位。需要完成的定位工作可以通过这个画面去理解:给定一个地图,对地图关键帧和比较有特点的地方、地点进行视觉采样,即照一副照片,当下机器人观察到的是另外一个图像,这幅图像是不是在地图里面已经存储的某一幅图像?如果当下图像和地图中的图像成功匹配,那么也就完成了全局定位工作。
完成基于视觉的全局定位有几个挑战,挑战来源于:首先是光照变化和视角变化的挑战:第一次和第二次访问不一定是同样的时间,光照和视角会发生变化。举例来说,上面两幅图像问大家是不是来源于同一个地方?大家可能需要认真地看一会儿才能作出正确判断,通过比如说这个楼和这个楼是同样一座楼,还有路旁的树木。大尺度的挑战
这张地图里面包含了千万张关键帧图像,如何实时完成图像匹配是个巨大的挑战。如果不考虑计算复杂性,图像匹配工作原则上讲不是很难,给你两幅图像,看看是不是来自于同一个地点。我们对第一和第二张图片进行点对点的特征匹配,如果有足够多的特征点匹配,我们就能初步判断图像来自于同一个位置。当然,如果有光照和视角点变化时,特征点匹配则不是那么容易。再有就是刚刚讲到的大尺度问题,如果地图包含很多不同的地点,一幅图像跟几万个地点匹配,这件工作的计算量是相当大的,对实时运算产生挑战。如何解决这三个挑战?先谈一下大尺度的挑战。解决方法之一,就是通过对图像中俄特征点进行筛选。这是因为在完成特征点匹配时,不是所有的特征点都有效。在我2011年完成的一件工作中,证明了大尺度的角点或者特征点检匹配率是很高,我们可以用这个特点对提取出来的特征进行筛选,去除占比例非常高的小尺度特征点,提高整幅图像匹配效率。 还可以利用有效的数据结构来加速完成匹配这件事,比如说用树结构存储特征来完成匹配,用图结构来存储地图里面所有的局部角点,以完成观察到图像中的角点和地图图像中的角点的快速匹配。另外一种方法是通过查表方法,在所有的搜索引擎里,百度和谷歌在搜索网页的时候,给几个关键词就能迅速把互联网中相关的网页找到,就是通过查表的方法。同样的方法可以利用到图像特征匹配,以完成全局定位这件工作。以上讲的是如何利用局部特征描述视觉图像,解决全局定位的问题。我们也可以通过全局描述符、全景描述符的方法来对一幅图像进行刻画,完成全局定位的工作。我们在2012年提出了一种全局描述符的算法。如何对一副图像进行描述呢?首先把它分成若干个块,每一个网格用滤波器进行处理,每一个区域都有若干个反应量,把所有反应量叠加在一起就形成了对整幅图像的描述符,描述图的维度不是很高,所以,我们就可以利用描述图进行图像匹配,以完成全局定位的目的。 随着深度学习的发展,近几年有很多基于深度学习完成移动机器人全局定位的算法出现,我们也做过这方面的工作。深度学习很成功的研究方向之一就是图像分类,如图是其中一个比较流行的网络,它的输入层是一幅图像,输出用来分类,我们可以把神经网络的中间层想象成是对输入图像的刻画,即任何一个中间层都是输入图像的描述幅。利用中间层产生出来的向量描述符,完成图像匹配和全局定位这件工作。
我们在2015年的时候做了这件工作,下图左边是不同的深度神经网络在做图像匹配工作的表现,曲线越高表现越好。右边这幅图介绍了神经网络产生出来的描述符,天蓝色和棕色都是深度神经网络产生的描述符,比传统的手工完成的描述符方法更好,以证明深度学习/深度神经网络是产生全景描述符很好的方法。这些年这个方向也有了很快的发展,最近趋势可以通过下面这件工作来了解。首先是对一副图像更细的处理,检测和描述图像中的物体。框图左边和右边是类似的过程。进行图像中的物体检测后,再对每一个检测出的物体用神经网络进行描述,图像和图像之间匹配的工作可以通过匹配刻画物体的特征向量来完成,这个工作在全局定位算法中有最好的表现。基于上述的全局定位的框架,我的另外一个学生在2018年完成了对这个框架的加速,下图中右上部分代表我们方法保留了现有框架的精度;下图右下的绿色和红色是我们提出的方法,运行的速度比其他方法要快很多,从绝对数量来说,几十毫秒就能完成在有2.1万张图像地图中的全局定位。最后介绍的工作是为了解决全局定位中最难的情况,做甚至不可思议的事情,就是极端变化条件下完成全局定位。这个照片代表着白天拍下一张黄色汽车从左往右行驶的照片,下面的图片是在晚上汽车拍下从右向左行驶时的照片。从位置角度看,汽车到达了同一地点,但图像获取的方向和光照条件完全不一样,在这种极度变化条件下如何完成这两组图像匹配?上图右上面的两张图是机器人拍下来的。解决方案分两步走:1、粗匹配,对图像进行语义分割,分割出来的每一类做描述符,通过图像之间的描述符进行匹配之后初步的筛选。2、对每幅图像的特征点精匹配,最后达到全局定位。最后介绍两篇基于传感信息融合的全局定位方法。下图中的方法中,第一步通过视觉信息完成,第二步通过激光雷达完成。在今年刚刚发表的文章中,同样也是利用对激光雷达和视觉图像信息融合完成全局定位,但全部工作是利用深度神经网络完成。在该方法中,由点云、图像分别各产生一幅描述符,然后对两个描述符进行融合,之后产生融合后的描述符,这个融合后的描述符为全局描述符,用来完成全局定位工作。
5
未来展望和总结最开始把导航工作分成几个模块,其中包括刚刚提到了的SLAM,泛义SLAM把避障和轨迹规划也归纳到其中。SLAM技术是移动机器人必不可少的工具,过去二三十年的移动机器人导航研究工作重心放在SLAM,但构建地图的目的局限于为了完成定位。现在大家逐渐发现,我们只支持定位的地图是不足以完成导航的,因为导航同样也需要避障和轨迹规划,所以我们就需要搭建更稠密的地图,开发Dense Mapping算法。另外一个移动机器人导航重要的研究方向是如何对环境进行有效的语义刻画。为什么要对环境做语义刻画呢?首先,语义刻画衔接了我们与机器人对环境的理解的差距,起着桥梁的作用。再者,通过对环境的语义表达,其结果会更简洁和抽象,具备环境信息处理时的优点。所以语义刻画是目前业界比较关注的研究方向,ppt中这个白皮书的作者,是做SLAM工作、大家熟悉的AndrewDavison,白皮书中他提出了Spatial AI的概念。我们做移动机器人工作也是在做人工智能,只是跟空间息息相关的人工智能,而SLAM技术是人工智能的基础工作,是必不可少的工作。
道翰天琼CiGril认知智能机器人API用户需要按步骤获取基本信息:
请求地址:http://www.weilaitec.com/cigirlrobot.cgr
请求方式:post
请求参数:
参数 |
类型 |
默认值 |
描述 |
userid |
String |
无 |
平台注册账号 |
appid |
String |
无 |
平台创建的应用id |
key |
String |
无 |
平台应用生成的秘钥 |
msg |
String |
"" |
用户端消息内容 |
ip |
String |
"" |
客户端ip要求唯一性,无ip等可以用QQ账号,微信账号,手机MAC地址等代替。 |
接口连接示例:http://www.weilaitec.com/cigirlrobot.cgr?key=UTNJK34THXK010T566ZI39VES50BLRBE8R66H5R3FOAO84J3BV&msg=你好&ip=119.25.36.48&userid=jackli&appid=52454214552
注意事项:参数名称都要小写,五个参数不能遗漏,参数名称都要写对,且各个参数的值不能为空字符串。否则无法请求成功。userid,appid,key三个参数要到平台注册登录创建应用之后,然后查看应用详情就可以看到。userid就是平台注册账号。
示例代码JAVA:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class apitest {
/**
* Get请求,获得返回数据
* @param urlStr
* @return
*/
private static String opUrl(String urlStr)
{
URL url = null;
HttpURLConnection conn = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try
{
url = new URL(urlStr);
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5 * 10000);
conn.setConnectTimeout(5 * 10000);
conn.setRequestMethod("POST");
if (conn.getResponseCode() == 200)
{
is = conn.getInputStream();
baos = new ByteArrayOutputStream();
int len = -1;
byte[] buf = new byte[128];
while ((len = is.read(buf)) != -1)
{
baos.write(buf, 0, len);
}
baos.flush();
String result = baos.toString();
return result;
} else
{
throw new Exception("服务器连接错误!");
}
} catch (Exception e)
{
e.printStackTrace();
} finally
{
try
{
if (is != null)
is.close();
} catch (IOException e)
{
e.printStackTrace();
}
try
{
if (baos != null)
baos.close();
} catch (IOException e)
{
e.printStackTrace();
}
conn.disconnect();
}
return "";
}
public static void main(String args []){
//msg参数就是传输过去的对话内容。
System.out.println(opUrl("http://www.weilaitec.com/cigirlrobot.cgr?key=UTNJK34THXK010T566ZI39VES50BLRBE8R66H5R3FOAO84J3BV&msg=你好&ip=119.25.36.48&userid=jackli&appid=52454214552"));
}
}