工程师的浪漫:用机械臂画一个爱心

简介: 工程师的浪漫:用机械臂画一个爱心

目录

0 写在前面

本文基于过去的博客平面2R机器人(二连杆)运动学与动力学建模+附仿真模型做一个运动学应用,即控制机械臂末端执行特定的轨迹,事实上,在机械臂工作空间内可以绘制任意图形,这里以爱心为例,效果动图如下所示,看完本文相信你也可以做到!

4acfab9be28647f2ae7f18929064699c.gif

1 生成爱心轨迹

定义二连杆机械臂的臂长为1,则工作空间应在半径为2的圆内。

x_ = -1.15:0.01:1.15;
y1 = real(1/2*(x_.^2.^(1/3)+(x_.^4.^(1/3)-4*x_.^2+4).^(1/2)));
y2 = real(1/2*(x_.^2.^(1/3)-(x_.^4.^(1/3)-4*x_.^2+4).^(1/2)));
x = [x_,fliplr(x_)];
y = [y1,y2];
plot(x,y);
saveddata.x = x;
saveddata.y = y;

效果如下:


image.png

将其保存为.mat文件以便复用:

save a2 saveddata

2 机械臂逆运动学实现

根据:平面2R机器人(二连杆)运动学与动力学建模+附仿真模型可知平面2R机器人运动学反解为:

{ θ 1 = π 2 − ( β ± ψ ) , θ 2 > 0 时取 + θ 1 = π 2 + ( β ± ψ ) , θ 2 > 0 时取 − θ 1 = 3 π 2 − ( β ± ψ ) , θ 2 > 0 时取 + θ 1 = 3 π 2 + ( β ± ψ ) , θ 2 > 0 时取 −

⎧⎩⎨⎪⎪⎪⎪⎪⎪⎪⎪θ1=π2−(β±ψ),θ2>0时取+θ1=π2+(β±ψ),θ2>0时取−θ1=3π2−(β±ψ),θ2>0时取+θ1=3π2+(β±ψ),θ2>0时取−

{θ1=π2−(β±ψ),θ2>0时取+θ1=π2+(β±ψ),θ2>0时取−θ1=3π2−(β±ψ),θ2>0时取+θ1=3π2+(β±ψ),θ2>0时取−


 

θ

1


=

2

π


−(β±ψ),θ

2


>0时取+

θ

1


=

2

π


+(β±ψ),θ

2


>0时取−

θ

1


=

2


−(β±ψ),θ

2


>0时取+

θ

1


=

2


+(β±ψ),θ

2


>0时取−



运动学正解为


T B T ( θ ) = [ cos ⁡ ( θ 1 + θ 2 ) − sin ⁡ ( θ 1 + θ 2 ) 0 l sin ⁡ ( θ 1 + θ 2 ) + l sin ⁡ θ 1 sin ⁡ ( θ 1 + θ 2 ) cos ⁡ ( θ 1 + θ 2 ) 0 − l cos ⁡ ( θ 1 + θ 2 ) − l cos ⁡ θ 1 0 0 1 0 0 0 0 1 ] _{T}^{B}\boldsymbol{T}\left( \boldsymbol{\theta } \right) =\left[

cos(θ1+θ2)sin(θ1+θ2)00−sin(θ1+θ2)cos(θ1+θ2)000010lsin(θ1+θ2)+lsinθ1−lcos(θ1+θ2)−lcosθ101

cos⁡(θ1+θ2)−sin⁡(θ1+θ2)0lsin⁡(θ1+θ2)+lsin⁡θ1sin⁡(θ1+θ2)cos⁡(θ1+θ2)0−lcos⁡(θ1+θ2)−lcos⁡θ100100001

\right]

T

B


T(θ)=


 

cos(θ

1


2


)

sin(θ

1


2


)

0

0


 

−sin(θ

1


2


)

cos(θ

1


2


)

0

0


 

0

0

1

0


 

lsin(θ

1


2


)+lsinθ

1


−lcos(θ

1


2


)−lcosθ

1


0

1


 



下面封装一个函数实现上面的模型:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% @file : IKrob.m
% @function : [theta] = IKrob(coord,l)
% brief : 二轴机械臂逆运动学求解函数
% version : 1.0
% input : coord ------------- 笛卡尔空间坐标
%         l     ------------- 连杆长度
% output: theta ------------- 机械臂关节角
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [theta] = IKrob(coord,l)
x = coord(:,1);
y = coord(:,2);
L1 = l(1);
pts = size(x);
fai = abs(acos(sqrt(x.^2+y.^2)/(2*L1)));
beta = abs(atan(y./x));
theta2 = acos((x.^2+y.^2)/(2*L1^2)-1);
theta1 = zeros(pts(1), 1);
for k=1:pts(1)
    if(x(k,1) >= 0 && y(k,1) >= 0)
        theta1(k,1) = pi/2 - (beta(k,1) + fai(k,1));    
    elseif(x(k,1) < 0 && y(k,1) >= 0)
        theta1(k,1) = - pi/2 + (beta(k,1) - fai(k,1));
    elseif(x(k,1) < 0 && y(k,1) < 0)
        theta1(k,1) = -pi/2 - (beta(k,1) - fai(k,1));
    elseif(x(k,1) >= 0 && y(k,1) < 0)
        theta1(k,1) = pi/2 + (beta(k,1) - fai(k,1));
    end
end
theta = [theta1 theta2];
end

实现了逆运动学后只需要根据轨迹点反解当前机械臂的位姿参数并记录即可。

3 实现机械臂画指定轨迹

3.1 读取数据

% 读取轨迹信息
   load a2.mat                                          % 轨迹数据对应名称为saveddata,包含坐标数据x,y等,轨迹为手写字母a的轨迹
   trajactory_length = size(saveddata.x,2);             % 读取轨迹长度
   trajcoord = [saveddata.x',saveddata.y'];             % 读取轨迹坐标
   trajcoord(:,1) = trajcoord(:,1) - 1;                 % 改变一下轨迹的位置,方便机械臂运动
   dt = 0.02;
%% 机械臂逆运动学求关节空间轨迹(求解thetaA(包含theta1,theta2)),并作出机械臂运动图(需要求关节1的位置)<---------
    thetaA  = zeros(trajactory_length,2);                   % 初始化theta的角度
    midtrajA = zeros(trajactory_length,2);                  % 初始化关节1的位置

3.2 绘制机械臂

 figure
 Robotarm = VideoWriter('Robotarm.avi');                     % 新建叫Robotarm.avi的文件
 open(Robotarm);                                             % 打开Robotarm.avi的文件
 axis([-2 1.3 -1.8 1.5])                                     % 固定坐标轴
 hold on
 plot(trajcoord(:,1),trajcoord(:,2),'r-','linewidth',2);     % 画出轨迹    
 h1 = line([0 midtrajA(1,1)],[0 midtrajA(1,2)],'LineWidth',3);                             % 画杆1
 h2 = line([midtrajA(1,1) trajcoord(1,1)],[midtrajA(1,2) trajcoord(1,2)],'LineWidth',3);   % 画杆2
 h3 = plot(midtrajA(1,1),midtrajA(1,2),'bo','LineWidth',6);                                % 画关节1
 M=moviein(trajactory_length);                               % 前面要有plot帮助moviein初始化


image.png

3.3 反解位姿

% 计算逆运动学     
theta = IKrob(trajcoord, l);  % 解出对应的关节角 <------------------
midtrajA = [l(1) * sin(theta(:,1)),l(1) * cos(theta(:,1))];
for k=1:trajactory_length  
   delete(h1);
   delete(h2);
   delete(h3);
   axis([-2.5 1.3 -1.8 1.5])
   h1 = line([0 midtrajA(k,1)],[0 midtrajA(k,2)],'LineWidth',3);                             % 画杆1
   h2 = line([midtrajA(k,1) trajcoord(k,1)],[midtrajA(k,2) trajcoord(k,2)],'LineWidth',3);   % 画杆2
   h3 = plot(midtrajA(k,1),midtrajA(k,2),'bo','LineWidth',6);                                % 画关节1
   M(:,k)=getframe;                                        % 抓取图形作为电影的画面
   writeVideo(Robotarm,M(:,k));
end
%     movie(M,1,30);                                            % 以每秒30帧的速度播放1次
close(Robotarm);                                            % 关闭


image.png

运行的结果保存在'Robotarm.avi',直接播放即可。

4 拓展

本项目旨在实践机械臂运动学模型,将图形换成字母也可以实现简单的写字应用,例如:


image.png

完整代码关注下方公众号回复 R001 获取


🔥 更多精彩专栏

目录
相关文章
|
7月前
|
传感器 算法 机器人
斯坦福李飞飞团队祭出“灵巧手”,泡茶剪纸炫技
【2月更文挑战第26天】斯坦福李飞飞团队祭出“灵巧手”,泡茶剪纸炫技
82 5
斯坦福李飞飞团队祭出“灵巧手”,泡茶剪纸炫技
|
编解码 芯片
聊聊身边的嵌入式:价格不菲的护眼灯,是眼睛保护神还是智商税?
聊聊身边的嵌入式:价格不菲的护眼灯,是眼睛保护神还是智商税?
|
传感器 人工智能 算法
无人机都能买菜了,为什么还有这么多研究组,执着地要让人形机器人飞起来?
无人机都能买菜了,为什么还有这么多研究组,执着地要让人形机器人飞起来?
198 0
无人机都能买菜了,为什么还有这么多研究组,执着地要让人形机器人飞起来?
现实版《三体》上演,麻省理工研究员要用激光吸引外星人来地球
虽然目前的方法和技术接触的概率很低,但未来几年的进展可能使其成为可能。
372 0
|
人工智能 安全 机器人
机器人要取代宇航员?这家公司想把“阿凡达”送上太空
机器人在地球上代替人类工作已经不足为奇,现在,他们又要去太空完成任务了。近日,一家名为GITAI的日本初创企业正在研发一项新技术,计划将仿真机器人而不是人类宇航员送上太空。
|
机器人 atlas
逆天!波士顿动力再出视频,机器狗大跳火星哥热舞
波士顿动力又出新视频了!这次是机器狗SpotMini,在视频中,该机器人伴着大热单曲《Uptown Funk》秀了一段热舞。网友大叹:现在连机器人都比我会跳舞了!快来跟着SpotMini老师一起学舞蹈吧!
6875 0