×

使用DNN IP生成器的自主机器人控制建模

消耗积分:2 | 格式:zip | 大小:0.27 MB | 2022-10-26

刘芳

分享资料个

描述

介绍

我们的目标是创建一个自主的室内机器人,它使用不同的控制策略来处理它的运动。在这个项目中,我们提出了一种解决方案,它对传感器进行建模并实施模型预测控制 (MPC)。

关于 MPC 控制的一些话: 模型预测控制 (MPC) 是一种众所周知的用于解决在线优化问题的控制策略,广泛用于自动驾驶汽车应用。MPC 的计算成本高且资源消耗大,尤其是当涉及到嵌入式计算平台的有限资源时,例如片上系统 (SoC) 和现场可编程门阵列 (FPGA) 平台。最近,机器学习(ML)在减少执行时间和资源消耗方面已成为经典控制系统的有效替代方案。模型预测控制 (MPC) 是最常用的控制策略之一,因为它能够解决在线优化问题并处理软约束和硬约束。但是,对于复杂的高非线性系统,MPC的实现是一个很大的挑战;

深度神经网络被认为是一种自我优化的方法,因为它能够根据提供的信息优化其行为,这使得 DNN 适用于复杂的动态系统。使用 Matlab Simulink 和 MPC 工具,我们发现这会让人头疼,因为我们使用的是小型 FPGA。出于这个原因,在米什科尔茨大学,我们创建了一个 DNN 工具,它从给定的输入数据创建一个基于给定数据中的 System Generator 库元素的可参数化 DNN 网络。

一个传统的 MPC 控制器如图 1 所示。MPC 控制器的预测策略是在预测范围内执行的,它代表了控制器期待未来的下一个 P 时间步长。MPC 控制器模拟几个未来场景,优化器根据成本函数选择最佳场景,成本函数代表参考目标和预测输出之间的误差。最优方案对应于最小成本函数。

poYBAGNYinOAUMZ_AAArI9svc3w896.png
图 1 传统 MPC 图。
 

该控制器计算量大,因为它解决了每个时间步的在线优化问题,这需要高计算能力和大内存。计算负载和高资源消耗使 MPC 在有限资源上的实现成为一个巨大的挑战。

设计MPC模型的第一步是确定车辆内部模型的输入输出信号,第二步是设置参数和确定约束条件。操纵变量(转向角 δ)和扰动(vx ρ)被确定为输入信号,而横向速度 vy、横向偏差 d、偏航角 θ 和偏航率 ω 被确定为输出信号(见图 2)。

pYYBAGNYinWADE1qAAAp0a2ct1k448.png
Fig.2 车辆模型的全局位置。
 

模型方程如下:

pYYBAGNYineAcswVAABe-9VqHeU444.png
图 3 车辆方程。
 

约束条件如下确定:转向角在 [-1.04, 1.04] rad 范围内,偏航角速率在 [-0.26, 0.26] rad 范围内。在设计过程中保持这些参数,直到获得满意的行为。MPC 和工厂模型的总体设计如图 4 所示。

pYYBAGNYinmAYFZsAABUjm3y2jY789.png
图4 MPC和工厂模型设计的总图。
 

深度神经网络 IP 程序的自动生成

设计步骤如下:

  • 首先制作了传统的MPC控制器;验证和测试 MPC 设计;深度神经网络模型设计,生成数据集;训练 DNN 模型;验证和测试 DNN 模型;(这些步骤对于每个新的 DNN 都是特定的,因此这里不介绍这些步骤);
  • 下一步是运行IP工具生成器(见附件中的工具);
  • 运行仿真和硬件在环仿真(见模型和随附的初始化文件);
  • FPGA 在硬件中的部署和测试。
  • 为 KRIA SOM KV260 创建自适应硬件平台(参见教程https://github.com/Xilinx/Vitis-Tutorials/tree/2021.2/Vitis_​​Platform_Creation/Design_Tutorials/01-Edge-KV260)
  • 将 AXI IP DNN 导入 Vivado 或 Vitis(在编辑和提交项目时,我们没有收到 Xilinx 的反馈如何在 Vitis 中导入翻译后的项目)

对于深度神经网络 IP 的自动生成,创建的 DNN 工具(见附件 DNN 工具 IP 生成器)。

首先使用 DNN 工具创建 DNN。一般而言,将使用该工具的人应提供以下参数:

该工具的输入如下:

  • 每层的神经元数量
  • 精度(浮点或 FIX16 或 FIX8)
  • 权重
  • 偏见

输出是在 Matlab Simulink 中生成的 DNN IP。

备注:该工具正在工作,但应考虑针对不同的 AMD Xilinx 平台进行一些优化和修饰。这是 PL(可编程逻辑)包含的神经元和 DSP 元素数量的函数。该工具已针对 KC705 板和 Kria KV260 SOM 成功测试。

首先加载DNN_Generator.m文件并根据需要进行编辑:

%Edit model_parameters_here...神经元计数 = [6 20 10 10 1]; % 7 层中每一层的神经元数量%starting model... init;

然后运行。该模型已创建并可用于自己的目的。

仿真/硬件在环仿真 (HIL)

在 Simulink 环境下进行了仿真,取得了不错的效果。不幸的是,对于 Kria KV260 模块,系统生成器不允许我们进行硬件在环仿真。我们使用 KC705 板为生成的 DNN 制作了 HIL。使用 KV260 仿真和使用 KC705 的 HIL 获得的结果相似。

如下图(图 5)所示创建的 Vivado 项目已成功翻译并导出到 Vitis。在 Vitis 软件中,我们甚至无法运行“hello world”项目。Vitis 报告“平台无法识别。

poYBAGNYinyATY10AAFXwN3leH4122.png
图 5. Vivado 模块设计视图。
 

在图中(图 5)可以观察到,我们创建了两个 IP-s,一个与 AXI 兼容,一个没有 AXI 接口。我们的经验是,没有 AXI 接口的设备在 KC705 平台上工作得更正确。

只是为了在下图中显示一个示例,我们展示了 KC705 模块的结果,因为我们无法在 KV260 上进行 HIL 和测试。

pYYBAGNYin6AIIDBAAA9_CZZGxU041.png
图 6. 在 FPGA 上计算的估计转向角与传统 MPC 和 DNN 模型的仿真结果相比。
 
poYBAGNYioGAa7miAAAv0dQaMLk764.png
图 7. 车辆对估计转向角的横向偏差响应:FPGA 和仿真结果的比较。
 
poYBAGNYioOADcEwAAA1OWyYzAQ807.png
图 8. 偏航角对估计转向角的车辆响应:FPGA 和仿真结果的比较。
 

结果

创建的 DNN_tool 可用于实现任何 DNN 网络,并且可以在 Simulink 中进行测试。模拟、HIL 和实施可以在 FGPA 中完成。

创建的工具可供任何人免费使用。

不幸的是,我们无法在 Kria 板上测试模型预测控制,但可能在不久的将来我们会在 AMD-Xilinx 工作人员的帮助下解决这个问题。

我们面临的主要问题是如何在不使用 RTL 内核向导的情况下将 DNN MPC 模型集成到 Vitis。

评论

(对于具有高级知识的人)构建一个项目需要多长时间?

答案是:1 小时来训练和准备 DNN。5 分钟安装 DNN 工具并生成 IP。10-20 分钟通过导入 IP 并进行所有必要的设置来创建 Vivado 项目。5-30 分钟(取决于 DNN 的大小和优化策略)创建比特流。10 分钟迁移到 Vitis 并运行项目。30 - 60 分钟编写 C 程序并测试结果。

我们花了多长时间构建 DNN 工具并在不同平台上测试该工具?

答案是:5个月每天工作3-5小时左右。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.lene-v.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用DNN IP生成器的自主机器人控制建模',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.lene-v.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);