码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-05-06 15:05:19      阅读:1536      评论:0      收藏:0      [点我收藏+]

标签:

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

总览

提出了利用神经网络解决机器人动力学问题的新观念。主要介绍了神经网络相关技术背景,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神经网络  朱凯 王正林 编著

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

标签:

原文地址:http://blog.csdn.net/xpqhqy1314/article/details/51322238

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!