机缘巧合知道了Matlab Arduino这个东西,可以看官方的文档https://ww2.mathworks.cn/help/supportpkg/arduinoio/index.html
当时就想到可以把robotics tool仿真的结果发到Arduino控制舵机模拟,大概有点ROS的意思?(根本没有接触ROS的机会啊,遗憾)
于是就想试试看,首先拿出了师兄给我的一个祖传机械臂,比较简单。用robotics搭建模型就是这样的(有没有大神知道怎么让这个模型立起来?)
L1=Link('d',0,'a',97,'alpha',0,'qlim',[-pi/2 pi/2]);
L2=Link('d',0,'a',91,'alpha',0,'qlim',[-pi/2 pi/2]);
L3=Link('d',-13,'a',96,'alpha',-pi/2,'qlim',[-pi/2 pi/2]);
L4=Link('d',0,'a',38,'alpha',0,'qlim',[-pi/2 pi/2]);
bot = SerialLink([L1 L2 L3 L4], 'name', 'my robot');
bot.plot([0 0 0 0]);
% T1=transl(322,0,0);
% T2=transl(0,-200,0);
% T = ctraj(T1, T2, 20);
% q = bot.ikine(T,[0 0 0 0],[1 1 1 1 0 0]);
% bot.plot(q);
去掉注释就能得出机器人的运动轨迹,q是各个关节的弧度值。
然后要实现Matlab Arduino联调首先要安装Arduino Hardware Package,我是Matlab 2016A,从网上down下来一个ArduinoIO,然后把相应的文件通过Arduino IDE烧进Arduino里才能实现联调。帮我同学弄Matlab 2017A的时候发现他的好像可以直接安装,比较方便。
% a=arduino('COM5','Uno');
% s0 = servo(a,'D2','MinPulseDuration',7.00e-4,'MaxPulseDuration',2.3e-3);
% s1 = servo(a,'D3','MinPulseDuration',7.00e-4,'MaxPulseDuration',2.3e-3);
% s2 = servo(a,'D4','MinPulseDuration',7.00e-4,'MaxPulseDuration',2.3e-3);
A=size(q);
qt=q(:,1:3)/pi+0.5;
qt=max(qt,0);
writePosition(s0, 0.5);
writePosition(s1, 0.5);
writePosition(s2, 0.5);
pause(5);
for i=1:A(1)
writePosition(s0, qt(i,1));
writePosition(s1, qt(i,2));
writePosition(s2, qt(i,3));
pause(0.2);
end
这是Matlab的代码,去掉注释,运行即可。
这里需要注意的是,当我第二次运行这个程序的时候,会提示板子上已经有Matlab Arduino的程序了,不能再次烧入。这里我摸索出来的土办法是,给Arduino断电,然后发烧
writePosition(s0, 0.5);
之类的指令,它会提示Matlab和Arduino失去连接,这时候再去跑上面的代码就重新烧入了。