机器人学——姿态表示方式相互转换(Matlab代码)

姿态描述方式通常有:旋转矩阵、四元数、欧拉角、旋转向量等,在此给出几种描述相互转换Matlab代码,方便以后使用时查询。

Matlab也有提供一些封装好的函数可直接使用,这里的函数是根据公式进行转换,采用其他语言重写时也比较方便。

欧拉角说明:通常有两类,分别为z-x-z经典的欧拉角和z-y-x泰特-布莱恩表示法,具体参考博客[1],这里采用z-y-x泰特-布莱恩表示法。

旋转向量说明:通常采用[rx,ry,rz,theta]或者[rx*theta,ry*theta,rz*theta],这里采用第二种。

目录

【旋转矩阵—>四元数】

【四元数—>旋转矩阵】

【旋转矩阵—>欧拉角】

【欧拉角—>旋转矩阵】

【欧拉角—>四元数】

【四元数—>欧拉角】

【旋转向量—>旋转矩阵】

【旋转矩阵—>旋转向量】

【旋转矩阵—>四元数】
function q = R2qua(R)
    %旋转矩阵转四元数
    if 1+R(1,1)+R(2,2)+R(3,3) > 0
        w = sqrt(1+R(1,1)+R(2,2)+R(3,3))/2;
        if w > 0
            x = (R(3,2)-R(2,3))/(4*w);
            y = (R(1,3)-R(3,1))/(4*w);
            z = (R(2,1)-R(1,2))/(4*w);
        elseif w==0
            list = [R(1,1) R(2,2) R(3,3)];
            t = sqrt(1-R(1,1)-R(2,2)-R(3,3));
            if max(list)==R(1,1)     
                x = t/4;
                w = (R(3,2)-R(2,3))/t;
                y = (R(1,3)+R(3,1))/t;
                z = (R(2,1)+R(1,2))/t;
            elseif max(list)==R(2,2)
                y = t/4;
                w = (R(1,3)-R(3,1))/t;
                x = (R(1,2)+R(2,1))/t;
                z = (R(3,2)+R(2,3))/t;
            elseif max(list)==R(3,3)
                z = t/4;
                y = (R(3,2)-R(2,3))/t;
                x = (R(1,3)+R(3,1))/t;
                w = (R(2,1)-R(1,2))/t;
            end
        end
    end
    q = [x y z w];
end
【四元数—>旋转矩阵】
function R = qua2R(q) 
    % q = [x,y,z,w]
    %四元数转旋转矩阵
    x = q(1);
    y = q(2);
    z = q(3);
    w = q(4);
    R = [1-2*y*y-2*z*z, 2*x*y-2*w*z, 2*x*z+2*w*y;
        2*x*y+2*w*z,  1-2*x*x-2*z*z, 2*y*z-2*w*x;
        2*x*z-2*w*y,  2*y*z+2*w*x, 1-2*x*x-2*y*y];
end
【旋转矩阵—>欧拉角】
function ang = R2eluer(R)
    %旋转矩阵转欧拉角
    x = atan2(R(3,2),R(3,3));
    y = atan2(-R(3,1),sqrt(R(3,2)^2+R(3,3)^2));
    z = atan2(R(2,1),R(1,1));
    ang = [x y z];
end
【欧拉角—>旋转矩阵】
function R = eluer2R(ang) 
    %欧拉角转旋转矩阵
    x = ang(1);
    y = ang(2);
    z = ang(3);
    Rx = [1  0      0;
    0 cos(x) -sin(x);
    0 sin(x) cos(x)];
    Ry = [cos(y)  0 sin(y);
        0       1      0;
        -sin(y) 0 cos(y)];
    Rz = [cos(z) -sin(z) 0;
        sin(z) cos(z)  0;
        0      0       1];
    R = Rz*Ry*Rx;
end
【欧拉角—>四元数】
function q = eluer2qua(ang)
    %欧拉角转四元数
    %q = [w,x,y,z]
    x = ang(1);
    y = ang(2);
    z = ang(3);
    q = [cos(x/2)*cos(y/2)*cos(z/2) + sin(x/2)*sin(y/2)*sin(z/2) ...
        sin(x/2)*cos(y/2)*cos(z/2) - cos(x/2)*sin(y/2)*sin(z/2) ...
        cos(x/2)*sin(y/2)*cos(z/2) + sin(x/2)*cos(y/2)*sin(z/2) ...
        cos(x/2)*cos(y/2)*sin(z/2) - sin(x/2)*sin(y/2)*cos(z/2)];
end
【四元数—>欧拉角】
function ang = qua2eluer(q)
    % q = [w,x,y,z]
    %四元数转欧拉角
    x = atan2(2*(q(1)*q(2)+q(3)*q(4)),1 - 2*(q(2)^2+q(3)^2));
    y = asin(2*(q(1)*q(3) - q(2)*q(4)));
    z = atan2(2*(q(1)*q(4)+q(2)*q(3)),1 - 2*(q(3)^2+q(4)^2));
    ang = [x y z];
end
【旋转向量—>旋转矩阵】
function R = rv2R(rv)
    % 输入为列向量
    % 旋转向量转旋转矩阵
   theta = norm(rv);
   rv = rv/theta;
   I = eye(3);
   R = cos(theta)*I + (1-cos(theta))*rv*rv'+sin(theta)*[0,-rv(3),rv(2);
                                                        rv(3),0,-rv(1);                                                       -rv(2),rv(1),0];
end
【旋转矩阵—>旋转向量】
function rv = R2rv(R)
    % 旋转矩阵转旋转向量
    theta = acos((trace(R)-1)/2);
    T = (R-R')/(2*sin(theta));
    disp(T)
    rv = [T(3,2)*theta,T(1,3)*theta,T(2,1)*theta];
end

注:旋转对应的代数运算不同于通常使用的经典代数运算,因此不要对欧拉角、旋转向量和四元数进行加减乘除操作。

最后给出一个好用的在线转换网站:3D Rotation Converter

参考博客:

[1]三维旋转之欧拉角 - 知乎

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
遗传算法是一种基于生物进化理论的优化方法,在优化问题中广泛应用。扫地机器人路径规划作为一种优化问题,可以利用遗传算法来寻找最优路径。首先,我们需要定义适应度函数,该函数用来评估每条路径的优劣,例如路径长度、避开障碍物的能力等。然后,我们随机生成一组初始路径作为种群,再利用遗传算法的选择、交叉和变异操作来不断优化这些路径,直到达到一定迭代次数或者满足优化条件为止。 以下是一个简单的扫地机器人路径规划的遗传算法优化的MATLAB代码: ```matlab % 遗传算法参数设置 popSize = 50; % 种群大小 maxGen = 100; % 最大迭代次数 pc = 0.8; % 交叉概率 pm = 0.1; % 变异概率 % 初始化种群 population = initPopulation(popSize); for gen = 1:maxGen % 评估种群适应度 fitness = evaluateFitness(population); % 选择操作 selected = selection(population, fitness); % 交叉操作 offsprings = crossover(selected, pc); % 变异操作 offsprings = mutation(offsprings, pm); % 更新种群 population = updatePopulation(population, offsprings); end % 找到最优路径 bestPath = findBestPath(population, fitness); % 输出最优路径 disp(['最优路径为:', num2str(bestPath)]); ``` 以上就是一个基本的遗传算法优化扫地机器人路径规划的MATLAB代码,通过不断迭代和优化,最终可以得到最优的路径规划方案。这种方法可以有效解决扫地机器人在复杂环境中的路径规划问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值