www.gusucode.com > matlab编程求解机器人的正逆解 采用遗传算法对机器人进行路径规划源码程序 > code/遗传算法/evaluate.m

    function  F = evaluate(a)
%计算目标函数并求适应度
%   此处显示详细说明

%机械臂参数初始化
Initialization

%建立惯性系及求出各刚体质心坐标
CoorTransform  

t = 0;
K = cell(1,7);            %角速度的方向
JT = cell(1,7);
Jr = cell(1,7);
V_w = cell(1,7);
Jtw = zeros(3,7);
Hw = I_sat;
Hwf = zeros(3,7);
Hb2 = zeros(3,3);
Hb3 = zeros(3,3);
Jm = [];
delta_t = 0.05;

 while t<20
    %求给定时刻的关节角,角速度,角加速度
    temp = parametric(a,t);
    theta = temp(:,1);
    dtheta = temp(:,2);
    d2theta = temp(:,3);
    
    R = CD_T20(theta);
    r_0 = R{1};
    r = R{2}(:,1:7);
    p = R{2}(:,7:14);
    %求角速度的方向序列
    K{1} = r{1}-r_0;
    for i=1:6
        K{i+1} = p{i+1}-p{i};
    end
    
    %求解Jti和Jri矩阵
    for i=1:7
        V_w{i} = cross(K{i},(r{i}-p{i}));
        Jt{i} = [];
        Jr{i} = [];
        for j = 1:i
            Jt{i} = [Jt{i} V_w{j}];
            Jr{i} = [Jr{i} K{i}];
        end
        Jt{i} = [Jt{i} zeros(3,7-i)];
        Jr{i} = [Jr{i} zeros(3,7-i)];
    end
    
    %求解Jtw和Hw
    for i=1:7
        Jtw = m(i)*Jt{i}+Jtw;
        temp = r{i}-r_0;
        temp1 = Cross_operator(temp);
        Hwf = Hwf + I{i}*Jr{i}+m(i)*temp1*Jt{i};
        Hw = Hw+I{i}+m(i)*(temp1')*temp1;
        Hb2 = Hb2+m(i)*(temp1');
        Hb3 = Hb3+m(i)*temp1;
    end
    
    %求解Hb和Hbm
    Hb = [eye(3) Hb2;Hb3 Hw];
    Hbm = [Jtw;Hwf];
    Jbm = -Hb\Hbm;
    
    %求解Jm
    for i=1:7
        temp = [cross(K{i},p{7}-p{i});K{i}];
        Jm = [Jm temp];
    end
    
    %求解Jg、Jb
    Jb = [eye(3),-Cross_operator(p{7}-r_0);zeros(3),eye(3)];
    Jg = Jm+Jb*Jbm;
    Jbm_v = Jbm(1:3,:);Jg_v = Jg(1:3,:);
    Jbm_w = Jbm(4:6,:);Jg_w = Jg(4:6,:);
    
    V0 = Jbm_v*dtheta;Ve = Jg_v*dtheta;
    W0 = Jbm_w*dtheta;We = Jg_w*dtheta;
    
    Coordinate = Coordinate+V0*delta_t;
    
    %求解t时刻的位置和姿态
    dQ0 = [-q0';yita0*I_sum-Cross_operator(q0)]*Jbm_w*dtheta;
    dQe = [-qe';yitae*I_sum-Cross_operator(qe)]*Jg_w*dtheta;
    dPe = Jg_v*dtheta;
    
    Q_0 = Q0+dQ0*delta_t;
    Q_e = Qe+dQe*delta_t;
    P_e = Pe+dPe*delta_t;
    
    
    t = t+delta_t;
    
    %雅可比矩阵初始化进行下一次循环
    
    Jtw = zeros(3,7);
    Hw = I_sat;
    Hwf = zeros(3,7);
    Hb2 = zeros(3,3);
    Hb3 = zeros(3,3);
    Jm = [];
    
 end
    
%求解姿态与位置偏差量
yita_0f = Q_0(1);
q_0f = Q_0(2:4);
yita_ef = Q_e(1);
q_ef = Q_e(2:4);

delta_qe = yita_ef*q_ed-yita_ed*q_ef-Cross_operator(q_ef)*q_ed;
delta_pe = Ped-P_e;
delta_q0 = yita_0f*q0-yita0*q_0f-Cross_operator(q_0f)*q0;

F1 = [delta_qe;delta_pe];
F2 = delta_q0;    

F = sum(abs(F1))*sum(abs(F2));
disp('完成一次适应度评估');