利用神经网络解决机器人动力学问题

利用神经网络解决机器人动力学问题

总览

提出了利用神经网络解决机器人动力学问题的新观念。主要介绍了神经网络相关技术背景,BP神经网络的基本原理。在Matlab中建立了一个6自由度的机器人,采用BP神经网络和径向神经网络,进行了对机器人动力学预测的仿真验证。结果表明神经网络能有效地解决该问题。

背景介绍

在开发机器人牵引技术过程中,需要对机器人进行动力学建模。而机器人动力学建模通常由牛顿欧拉法和牛顿拉格朗日法,两种方法推导过程都较为复杂,且计算量随着机器人自由度的增加而迅速增加,计算结果容易出错。我受到人工智能的启发,灵机一动,想到可以尝试采用神经网络的方法来解决该问题,让机器人自己学会对动力学的建模。

神经网络是一个让人感觉很妙不可言的人工智能技术。在机器学习领域,人工神经网络的计算模型灵感来自动物的中枢神经系统,它是对人脑的抽象简化和模拟,它是根植于神经科学,数学,统计学,物理学,计算机科学和工程学的一门技术。它可以根据大量的输入和输出历史数据,可以对一件事物,一个过程,一个函数进行预测估计。神经网络理论可应用于模式识别、自动控制、信号处理,图像处理,数据挖掘,医疗,经济金融,气象等领域。

技术原理

BP  神经网络结构

我采用了BP神经网络与径向神经网络两种典型的神经网络结构,其中70%的实际应用均是采用BP神经网络结构,故我将重点介绍其原理。

图1

 

图1显示了一个具有R个输入,S个logsig神经元构成的单层BP神经网络,其中,左边的是详细结构图。右边的是以向量形式表示的结构图。

BP算法

BP算法沿着沿误差减小最快的方向,也就是梯度反向改变权值和偏差。

Xk代表当前权值和偏差,Xk+1代表迭代的下一次权值与偏差,xk+1代表下一次权值与偏差,gk为当前误差函数的梯度,ak代表学习速率。推导过程如下:

如果你不想知道推导过程,那么只需要看上面中的两个所以(有三个点的地方)的内容,就可以知道所需要的误差量是什么样的了;如果想要想弄明白的话,或许需要自己在稿子上画画看推导推导。

Matlab仿真

仿真思路

1.首先采用robotictoolbox ,建立了一个SIASUN 六自由度机器人。包含了DH参数,杆件质量,质心矢量,转动惯量,摩擦系数等动力学参数信息。

2.随机生成2200个机器人姿态,变量名为PoseInput(6X2200的矩阵)。

3.采用roobtic toolbox里的动力学计算函数 rne 计算出对应姿态下的各个关节的力矩。

4.采用matlab神经网络工具箱,建立BP神经网络,设定输入为6个关节角度,9个神经节点数,输出为6个关节对应的力矩值,1000次的迭代,学习速率0.1,期望目标,误差小于0.001。神经网络的隐层函数与输出函数均为默认。

5.取前2000组数据作为训练,取后200组作为预测。

预测结果:

可以看到神经网络经过184次迭代,就达到了目标6次验证均符合要求。下面画出曲线图进行分析。

 

从上图中可知,对于一个典型的6DOF机器人,其主要的重力矩由2,3关节承受。

所以2,3关节的误差也是最大的。而对于第二个关节,200组数据中仅有3个数据的偏差在1.5牛左右,大部分均在0.5牛内。而这个结果是完全满足用于牵引示教的用途的。其他关节的误差都非常小。

径向神经网络

径向神经元的输入是权值向量和输入向量之间的向量距离与偏差b的乘积。||dist||表示权值与输入向量的点积。

经过1332次的训练,才达到目标值0.05.而BP网络才经过182次迭代就达到0.025的均方差。并且从下图看到误差出现了较大的波动。

结论:从目前仿真的结果来看,采用BP神经网络的方式结果要优于径向神经网络的结果。

BP神经网络C语言实现

通过仿真,证明了BP神经网络能够非常好的解决机器人动力学问题。但是唯一遗憾的是Mathworks公司考虑到版权问题,Matlab的神经网络工具箱并不支持直接编译成C语言。

故想要真正实现就需要根据BP神经网络原理,自己编程写出神经神经网络。

在这里,先不考虑具体函数的执行细节,从大体上来介绍程序的执行过程。用伪代码来表示,如下:

主函数main{

    读取样本数据 readData();

初始化BP神经网络  initBPNework(){

包括数据的归一,神经元的初始化w[Neuron][In]、v[Out][Neuron]等;

}

BP神经网络训练 trainNetwork(){

do{

for(i 小于 样本容量 Data){

            计算按照第 i 个样本输入,产生的BP神经网络的输出 computO(i);

累记误差精度;

反馈调节BP神经网络中的神经元,完成第 i 个样本的学习 backUpdate(i);

}

}while(达到训练次数 或者 符合误差精度);

}

存储训练好的神经元信息 writeNeuron();

用一些数据来测试,训练出来的BP神经网络的结果;

return
0;

}

以上是处理的流程,对于读取数据、保存数据之类的处理本文将略去这方面内容,突出主干部分。

原文链接:http://www.cnblogs.com/jzhlin/archive/2012/07/30/bp_c.html

实验结果

试验表明在两轴运动过程中,输出的力矩曲线与计算的力矩曲线非常接近。

总结

1.通过训练,神经网络能够有效的预测机器人任意姿态的各关节所需力矩值。

2.相对于传统的动力学计算法,神经网络具有如下两点优势:一. 它能够避免复杂的动力学建模过程和动力学计算过程,完全不需要任何参数,包括DH参数,质心,质量,摩擦力矩等等的参数。二,动力学建模计算出的力矩与实际力矩必然因种种原因而产生误差。而神经网络计算出的预测值,只要经过充分的训练和选择适当的结构,其最终的预测结果误差与实际的将会明显小于计算法计算出的力矩值。

3.目前的仿真表明,对于动力学问题,BP神经网络的效果要优于径向神经网络。

附 matlab 

clear all

load(‘bp_neural_3dof_matlab.mat‘);

%网络结构

in_num=4;

mid_num=9;

out_num=2;

%样本数量

test_num=144;

train_num=1800;

%

trainin=traindata(:,1:4);

trainout=traindata(:,5:6);

testin=testdata(:,1:4);

%归一化范围:定义为-1到1

Ymax=1;

Ymin=-1;

%寻找最大最小值

for j=1:in_num

maxin(j)=trainin(1,j);

minin(j)=trainin(1,j);

for i=1:train_num

if trainin(i,j)>=maxin(j)

maxin(j)=trainin(i,j);

elseif trainin(i,j)<=minin(j)

minin(j)=trainin(i,j);

end

end

end

for j=1:out_num

maxout(j)=trainout(1,j);

minout(j)=trainout(1,j);

for i=1:train_num

if trainout(i,j)>=maxout(j)

maxout(j)=trainout(i,j);

elseif trainout(i,j)<=minout(j)

minout(j)=trainout(i,j);

end

end

end

%归一化过程

for j=1:in_num

for i=1:train_num

if maxin(j)== 0 & minin(j)== 0

trainin_norm(i,j)=0;

else

trainin_norm(i,j)=(Ymax-Ymin)*(trainin(i,j)-minin(j))/(maxin(j)-minin(j))+Ymin;

end

end

end

for j=1:out_num

for i=1:train_num

if maxout(j)== 0 & minout(j)== 0

trainout_norm(i,j)=0;

else

trainout_norm(i,j)=(Ymax-Ymin)*(trainout(i,j)-minout(j))/(maxout(j)-minout(j))+Ymin;

end

end

end

%将测试数据同样进行归一化

for j=1:in_num

for i=1:test_num

if maxin(j)== 0 & minin(j)== 0

testin_norm(i,j)=0;

else

testin_norm(i,j)=(Ymax-Ymin)*(testin(i,j)-minin(j))/(maxin(j)-minin(j))+Ymin;

end

end

end

%神经网络预测

for i=1:test_num

for j=1:1:mid_num

H(j)=testin_norm(i,:)*win(j,:)‘+bin(j);

Hout(j)=1/(1+exp(-H(j)));

end

testout(i,:)=wout*Hout‘+bout;

end

%将预测结果进行反归一化

for j=1:out_num

for i=1:test_num

BPoutput(i,j)=(testout(i,j)-Ymin)*(maxout(j)-minout(j))/(Ymax-Ymin)+minout(j);

end

end

plot(BPoutput);

hold on

plot(BPoutput-taosim‘,‘r‘);

书籍推荐

[MATAB神经网络30个案例分析].史峰.扫描版[jb51.net]

51CTO下载-神经网络设计(国外经典教材)中文版

精通matlab神经网络  朱凯 王正林 编著

时间: 2024-08-27 20:18:17

利用神经网络解决机器人动力学问题的相关文章

机器人动力学概述

提到动力学,我们的第一印象往往是几行甚至几百行的公式,大部分对动力学感兴趣的朋友可能会因此而止步不前,实际上动力学要比纯粹的公式生动丰富的多.为使读者对动力学控制器有个直观而又全面的了解,作者仅概略性地总结包括动力学定义.应用范围.建模方法.具体部署方式及评价标准在内的方方面面. 动力学定义 动力学(dynamics)是研究作用于物体的力和物体运动之间的一般关系,具体到工业机器人,它包括两个基本问题: 1). 已知作用在机器人各关节的力,求该关节对应的运动轨迹,即求加速度,速度和位置: 2).

利用gulp解决微信浏览器缓存问题

做了好多项目,这次终于要解决微信浏览器缓存这个令人头疼的问题了.每次上传新的文件,在微信浏览器中访问时,总要先清除微信的缓存,实在麻烦,在网上搜罗了很多解决办法,终于找到了方法:利用gulp解决缓存问题.关于gulp大家可以去gulp官网去详细了解. 这篇文章主要参考于Gulp解决发布线上文件(CSS和JS)缓存问题和Gulp.js----比Grunt更易用的前端构建工具两篇文章,在这里先谢过原作者. 本文主要记录安装gulp以及使用.解决缓存问题的过程,以便日后方便查阅. 1.安装NodeJS

利用IIS7 解决URL访问限制问题

网站可以通过URl直接访问一些不希望被访问的东西, 比如一些图片,js,css等等. 为了解决这个问题看了好多文章,不过毕竟我是新手菜鸟级别的,没有具体的解决方法,真心不知道怎么弄. 今天在看IIS的时候突然发现有一个叫"请求筛选"的东东,点击进入,发现里面可以配置筛选规则, 比如你可以自己添加 "拒绝文件扩展名",那么所有的符合你添加的那个文件扩展名的文件,都不能访问了. 具体: 打开IIS管理器--->点击你想要配置的网站,打开主页---->点击请求

AndroidStudio利用android-support-multidex解决65536问题64k问题

AndroidStudio利用android-support-multidex解决65536问题64k问题 版权声明:转载请注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003 64k的各种异常 Error:The number of method references in a .dex file cannot exceed 64K.Learn how to resolve this issue at https://developer.andro

jQuery中利用JSONP解决AJAX跨域问题

写在前面 跨域的解决方案有多种,其中最常见的是使用同一服务器下的代理来获取远端数据,再通过ajax进行读取,而在这期间经过了两次请求过程,使得获取数据的效率大大降低,这篇文章蓝飞就为大家介绍一下解决跨域问题的一种比较通用的方案——JSONP. 什么是跨域? 简单的来说,出于安全方面的考虑,页面中的JavaScript无法访问其他服务器上的数据,即“同源策略”.而跨域就是通过某些手段来绕过同源策略限制,实现不同服务器之间通信的效果. 具体策略限制情况可看下表: URL 说明 允许通信 http:/

利用闭包解决for循环里onclick事件不能捕捉实时i值问题

问题描述 我们都知道,如果我们对于一组元素(相同的标签)同时进行onclick事件处理的时候(在需要获取到索引的时候),一般是写一个for循环,但是onclick是一个异步调用的,所以会带来一个问题,当我们触发这个事件的时候,我们能获取的i值是for完整执行完后i的值,而不能获取到代码顺序里i的值 首先看一段代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title

利用jQuery 解决URL请求参数有中文时出现乱码的问题

利用jQuery 解决URL请求参数有中文时出现乱码的问题 在开发的时候经常会碰到URL中请求参数含有中文的情况,这时如果在前台不作处理,直接在后台利用request.getParameter()拿对应的参数值就会出现中文乱码. 这时可以先利用jQuery对对应中文进行encodeURI(),例子如下: 前台对应代码 <!--省畋无关代码--> <input type="button" id="submitA" value="重发短信&q

利用栈解决一些基本问题

1.括号匹配问题 #include "stdafx.h" #include "stdio.h" #include "string.h" #define maxSize 100 int main(int argc, char* argv[]) { char exp[maxSize]; char stack[maxSize]; int top=-1; int i,len; scanf("%s",exp); len=strlen(e

利用Filter解决跨域请求的问题

1.为什么出现跨域. 很简单的一句解释,A系统中使用ajax调用B系统中的接口,此时就是一个典型的跨域问题,此时浏览器会出现以下错误信息,此处使用的是chrome浏览器. 错误信息如下: jquery-1.8.0.min.js:3 Failed to load http://localhost:8081/authz/openapi/v1/token: No 'Access-Control-Allow-Origin' header is present on the requested resou