学习自B站:Nino_FM
采用 Standard DH 建模法
R = rotx(pi/2)
R =
1.0000 0 0 0 0.9996 -0.0274 0 0.0274 0.9996 % 显然结果有问题
rotx(pi/2/pi*180)
ans =
1 0 0 0 0 -1 0 1 0
rotx(90)
ans =
1 0 0 0 0 -1 0 1 0

clc;clear
% Standard DH
L(1) = Link('revolute','d',0.216,'a',0,'alpha',pi/2);
L(2) = Link('revolute','d',0,'a',0.5,'alpha',0,'offset',pi/2);
L(3) = Link('revolute','d',0,'a',sqrt(0.145^2+0.42746^2),'alpha',0,'offset',-atan(427.46/145));
L(4) = Link('revolute','d',0,'a',0,'alpha',pi/2,'offset',atan(427.46/145));
L(5) = Link('revolute','d',0.258,'a',0,'alpha',0);
Five_dof = SerialLink(L,'name','5-dof');
Five_dof.base = transl(0,0,0.28);
Five_dof.teach

rotx() roty() rotz() eul2r() tr2eul() rpy2r() tr2rpy()
例子: r1 = eul2r(90,60,30) 与 r2 = rotz(90) * roty(60) * rotz(30) 等价
r1 =
-0.5000 -0.8660 0 0.4330 -0.2500 0.8660 -0.7500 0.4330 0.5000
r2 =
-0.5000 -0.8660 0 0.4330 -0.2500 0.8660 -0.7500 0.4330 0.5000
例子: r3 = rpy2r(90,60,30) 与 r4 = rotz(30)roty(60)rotx(90) 等价
r3 =
0.4330 0.7500 0.5000 0.2500 0.4330 -0.8660 -0.8660 0.5000 0
r4 =
0.4330 0.7500 0.5000 0.2500 0.4330 -0.8660 -0.8660 0.5000 0
旋转<------------------>变换矩阵
trotx() troty() trotz() eul2tr() tr2eul() rpy2tr() tr2rpy()
例子: T1 = eul2tr(90,60,30) 与 T2 = trotz(90) * troty(60) * trotz(30) 等价
T1 =
-0.5000 -0.8660 0 0 0.4330 -0.2500 0.8660 0 -0.7500 0.4330 0.5000 0 0 0 0 1.0000
T2 =
-0.5000 -0.8660 0 0 0.4330 -0.2500 0.8660 0 -0.7500 0.4330 0.5000 0 0 0 0 1.0000
例子: T3 = rpy2tr(90,60,30) 与 T4 = trotz(30) * troty(60) * trotx(90) 等价
T3 =
0.4330 0.7500 0.5000 0 0.2500 0.4330 -0.8660 0 -0.8660 0.5000 0 0 0 0 0 1.0000
T4 =
0.4330 0.7500 0.5000 0 0.2500 0.4330 -0.8660 0 -0.8660 0.5000 0 0 0 0 0 1.0000
位移、旋转矩阵<------------------>变换矩阵
transl() t2r() r2t()
例子: T = transl(1.5,1,0.5) * trotx(30) * trotz(60)
P = transl(T)
R = t2r(T)
T =
0.5000 -0.8660 0 1.5000 0.7500 0.4330 -0.5000 1.0000 0.4330 0.2500 0.8660 0.5000 0 0 0 1.0000
P =
1.5000 1.0000 0.5000
R =
0.5000 -0.8660 0 0.7500 0.4330 -0.5000 0.4330 0.2500 0.8660
doc SerialLink
创建一个SerialLink机器人对象
SerialLink.teach
模型展示(SerialLink.plot)
q = [0 0 0 0 0]; % 初始位姿 Five_dof = SerialLink(L,'name','5-dof'); Five_dof.plot(q)
三维模型展示(plot3d)
mdl_puma560; p560.plot3d(qz,'view',[0 0]);
正向运动学(fkine)
q0 = [pi/2 pi/2 0 0 0]; T = Five_dof.fkine(q0)
T =
0 1 0 0
-1 0 0 -0.645
0 0 1 0.9015
0 0 0 1
逆向运动学(ikine、ikunc......)
q1 = Five_dof.ikine(T,'mask',[1 1 1 1 1 0]) q2 = Five_dof.ikunc(T)
q1 =
1.5708 1.5708 -0.0000 0.0000 0
q2 =
1.5708 1.5708 0.0000 0.0000 -0.0000
关节空间随机生成变量------(fkine)------>变换矩阵------(transl)------>三维坐标
rand函数
在[m,n]内随机生成一个数字:m + rand * (m-n)
随机关节空间变量:q= q_min + rand * (q_max - q_min)
L(1).qlim = [-150,150]/180*pi; L(2).qlim = [-100,90]/180*pi; L(3).qlim = [-90,90]/180*pi; L(4).qlim = [-100,100]/180*pi; L(5).qlim = [-180,180]/180*pi; num = 30000; % 迭代次数 P = zeros(num, 3); % 初始化P for i =1:num q1 =L(1) .qlim(1) + rand * (L(1).qlim(2) - L(1).qlim(1)); q2 =L(2) .qlim(1) + rand * (L(2).qlim(2) - L(2).qlim(1)); q3 =L(3) .qlim(1) + rand * (L(3).qlim(2) - L(3).qlim(1)); q4 =L(4) .qlim(1) + rand * (L(4).qlim(2) - L(4).qlim(1)); q5 =L(5) .qlim(1) + rand * (L(5).qlim(2) - L(5).qlim(1)); q = [q1 q2 q3 q4 q5]; T = Five_dof.fkine(q); P(i, :) = transl(T); end plot3(P(:,1),P(:,2),P(:,3),'b.','markersize',1); hold on grid on daspect([1 1 1]); view([45 45]); Five_dof.plot([0 0 0 0 0]);
可视化显示

五次多项式轨迹(tpoly)
t = linspace(0,2,51); [P,dP,ddP] = tpoly(0,3,t); % 指定初末速度 %[P,dP,ddP] = tpoly(0,3,51,0.02,0.01);
混合曲线轨迹(lspb)
t = linspace(0,2,51); [P,dP,ddP] = lspb(0,3,t); % 指定最大速度 %[P,dP,ddP] = tpoly(0,3,51,0.1);
多维轨迹(mtraj)
% 例子: (0,0)--------->(3,4) t = linspace(0,2,51); [P,dP,ddP] = mtraj(@tpoly,[0 0],[3 4],t);
多维多段轨迹(mstraj)
% 例子: (0,0)----(2s)---->(3,4)----(1s)---->(1,2) % TRAJ = mstraj(WP,QDMAX,TSEG,Q0,DT,TACC,OPTIONS) WP = [0,0;3,4;1,2]; P1 = mstraj(wp,[],[2,1],[],0.04,0); P2 = mstraj(wp,[],[2,1],[],0.04,0.5);
实例演示
给定位置(0.7,-0.5,0)--------------------->(0.7,0.5,0.5)
T1 = transl(0.7,-0.5,0)*trotx(180); T2 = transl(0.7,0.5,0)*trotx(180); q1 = Five_dof.ikunc(T1); q2 = Five_dof.ikunc(T2); Five_dof.plot(q1); pause; Five_dof.plot(q2);

P1/P2 -----------(mtraj)----------->Traj-----------(transl)----------->T-----------(ikunc)----------->Qtraj
轨迹:'trail' , 'b'
保存动画:'movie' , 'trail.gif'
P1 = [0.7,-0.5,0]; P2 = [0.7,0.5,0.5]; t = linspace(0,2,51); Traj = mtraj(@tpoly,P1,P2,t); n = size(Traj,1); T = zeros(4,4,n); for i = 1:n T(:, :, i) = transl(Traj(i,:))*trotx(180); end Qtraj = Five_dof.ikunc(T); Five_dof.plot(Qtraj); % 绘制末端轨迹 %Five_dof.plot(Qtraj,'trail','b') % 自动保存动画 %Five_dof.plot(Qtraj,'movie','trail.gif');
绘制图像
hold on
plot(t,Traj(:,1),'.-','linewidth',1);
plot(t,Traj(:,2),'.-','linewidth',1);
plot(t,Traj(:,3),'.-','linewidth',1);
grid on
legend('x','y','z');
xlabel('time');
ylabel('position');

% 线性插值
T_liner = trinterp(T1,T2,51);
P_liner = transl(T_liner);
t1 = linspace(0,2,51);
subplot(1,2,1);
hold on
plot(t1,P_liner(:,1),'.-','linewidth',1);
plot(t1,P_liner(:,2),'.-','linewidth',1);
plot(t1,P_liner(:,3),'.-','linewidth',1);
grid on
legend('x','y','z');
xlabel('time');
ylabel('position');
% 五次多项式插值
T_tpoly = trinterp(T1,T2,tpoly(0,2,50)/2);
P_tpoly = transl(T_tpoly);
t2 = linspace(0,2,50);
subplot(1,2,2);
hold on
plot(t2,P_tpoly(:,1),'.-','linewidth',1);
plot(t2,P_tpoly(:,2),'.-','linewidth',1);
plot(t2,P_tpoly(:,3),'.-','linewidth',1);
grid on
legend('x','y','z');
xlabel('time');
ylabel('position');

笛卡尔轨迹ctraj
% 笛卡尔轨迹ctraj
T = ctraj(T1,T2,51);
t1 = linspace(0,2,51);
P1 = transl(T);
hold on
plot(t1,P1(:,1),'.-','linewidth',1);
plot(t1,P1(:,2),'.-','linewidth',1);
plot(t1,P1(:,3),'.-','linewidth',1);
T = ctraj(T1,T2,tpoly(0,2,50)/2);
t2 = linspace(0,2,50);
P2 = transl(T);
hold on
plot(t2,P2(:,1),'.-','linewidth',1);
plot(t2,P2(:,2),'.-','linewidth',1);
plot(t2,P2(:,3),'.-','linewidth',1);
grid on
legend('x1','y1','z1','x2','y2','z2');
xlabel('time');
ylabel('position');

给定位置和姿态
(0.7,-0.5,0)* troty(150)--------------->(0.7,0.5,0.5)* trotx(200)
T1 = transl(0.7,-0.5,0)*troty(150); T2 = transl(0.7,0.5,0.5)*trotx(200); q1 = Five_dof.ikunc(T1); q2 = Five_dof.ikunc(T2); Five_dof.plot(q1); pause Five_dof.plot(q2);
T1、T2------(tr2rpy)----->rpy1、rpy2------(mtraj)----->rpy_traj------(tr2rpy)----->T_raj_rot
rpy1 = [0,150,0]; %绕y轴转150度 rpy2 = [200,0,0]; %绕x轴转200度 t = linspace(0,2,51); rpy_traj = mtraj(@tpoly,rpy1,rpy2,t); T_traj_rot = rpy2tr(rpy_traj); P1 = transl(T1); P2 = transl(T2); P_traj = mtraj(@tpoly,P1',P2',t); T_traj_transl = transl(P_traj); n = length(t); T_traj = zeros(4,4,n); for i = 1:n T_traj(:,:,i) = T_traj_transl(:,:,i)*T_traj_rot(:,:,i); end q_traj = Five_dof.ikunc(T_traj); Five_dof.plot(q_traj,'trail','r')

上面的轨迹效果不太好,可用下面的代码替换
线性插值
% 线性插值 t = linspace(0,2,51); T_traj = trinterp(T1,T2,t/2); q = Five_dof.ikunc(T_traj); Five_dof.plot(q,'trail','r')

梯形速度图像插值
% 梯形速度图像插值 t = linspace(0,2,51); T_traj = ctraj(T1,T2,t/2); q = Five_dof.ikunc(T_traj); Five_dof.plot(q,'trail','r')

jtraj
% jtraj t = linspace(0,2,51); [q,dq,ddq] = jtraj(q1,q2,t); Five_dof.plot(q,'trail','r')

关节变量、速度图像、加速度图像
% 关节变量、速度图像、加速度图像
subplot(1,3,1)
plot(t,q)
grid on
xlabel('time')
ylabel('q')
legend('joint1','joint2','joint3','joint4','joint5')
subplot(1,3,2)
plot(t,dq)
grid on
xlabel('time')
ylabel('dq')
legend('joint1','joint2','joint3','joint4','joint5')
subplot(1,3,3)
plot(t,ddq)
grid on
xlabel('time')
ylabel('ddq')
legend('joint1','joint2','joint3','joint4','joint5')

这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO
require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
我正在尝试上传文件。一个简单的hello.txt。我正在关注文档,但无法将其上传到我的存储桶。#STARTAWSCLIENTs3=Aws::S3::Resource.newbucket=s3.bucket(BUCKET_NAME)begins3.buckets[BUCKET_NAME].objects[KEY].write(:file=>FILE_NAME)puts"Uploadingfile#{FILE_NAME}tobucket#{BUCKET_NAME}."bucket.objects.eachdo|obj|puts"#{obj.key}=>#{obj.etag}"endresc
我有一个Highstock图表(带有标记和阴影的线条),并且想以编程方式显示一个highstock工具提示,例如,当我选择某个表上的一行(包含图表数据)我想显示相应的highstock工具提示。这可能吗? 最佳答案 股票图表thissolution不起作用:在thisexample你必须更换这个:chart.tooltip.refresh(chart.series[0].data[i]);为此:chart.tooltip.refresh([chart.series[0].points[i]]);解决方案可用here.