基于约束条件下的六自由度机械臂运动空间仿真?

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果

基于蒙特卡洛方法求六自由度机械臂运动空间,给系统增加一个约束条件,如最后一个坐标系Z轴与基坐标系Z轴保持一致,这个约束条件下如何求六自由度机械臂运动空间?

尝试的方法? 给蒙特卡洛方法求运动空间程序加了一个循环,内循环是求N个运动空间点,外循环是使得T(3,3)=1,程序出错。

文档
https://1library.net/document/zln6e2rq-solving-method-workspace-dof-robot-based-vision.html
https://www.researchgate.net/publication/352307153_Novel_use_of_the_Monte-Carlo_methods_to_visualize_singularity_configurations_in_serial_manipulators
参考代码
https://github.com/topics/inverse-kinematics?l=matlab

迭代出机械手的位置云,就知道范围了


 
clear;clc
%定义D-H参数
a1=0.3;
a2=0.89;
a3=0.15;
d1=0.68;
d4=1.02;
%定义XYZ的坐标值
for i=1:10000
  theta1=-(11/12)*pi+(11/6)*pi*rand;
  theta2=-(1/2)*pi+(8/9)*pi*rand;
  theta3=-(1/3)*pi+(2/3)*pi*rand; 
  theta4=-(10/9)*pi+(20/9)*pi*rand;
  theta5=-(2/3)*pi+(4/3)*pi*rand;
  theta6=-2*pi+4*pi*rand; 
  x(i)=cos(theta1)*(a1 + a3*cos(theta2 + theta3) - d4*sin(theta2 + theta3) + a2*cos(theta2));
  y(i)=sin(theta1)*(a1 + a3*cos(theta2 + theta3) - d4*sin(theta2 + theta3) + a2*cos(theta2));
  z(i)= d1 - d4*cos(theta2 + theta3) - a3*sin(theta2 + theta3) - a2*sin(theta2);
end
figure(1);clf
plot3(x,y,z,'r','MarkerSize',0.5);hold on
xlabel('x-axis/m'),ylabel('y-axis/m'),zlabel('z-axis/m');
title('机器人三维工作空间');
figure(2);clf
plot3(x,y,z,'r','MarkerSize',0.5);
view(0,90);hold on%俯视图
xlabel('x-axis/m'),ylabel('y-axis/m');
title('机器人XY平面工作空间投影');

【六自由度机械臂控制系统设计与运动学仿真-论文笔记整理】https://minipro.baidu.com/ma/qrcode/parser?app_key=y1lpwNoOyVpW33XOPd72rzN4aUS43Y3O&launchid=0813451b-521a-471d-ac4d-1e428b89e311&path=%2Fpages%2Fblog%2Findex%3FblogId%3D96496985%26_swebFromHost%3Dbaiduboxapp

可以参考一下这个代码

%% 0.设定初始参数
% xyz_start=[0,-120.02,533.96];       %轨迹起点(关节角为0)的末端坐标,单位mm;
xyz_start=[0,-120.02,533.96];
xyz_end=[-30,-45,385];     %轨迹终点的末端坐标;
T=10;       %完成轨迹规划的时间;

%% 1.轨迹规划
L=sqrt((xyz_end(1)-xyz_start(1))^2+(xyz_end(2)-xyz_start(2))^2+(xyz_end(3)-xyz_start(3))^2);
dt=T/7;        %每段的时间长度
v1=L/(16*dt);   %第一次加速度拐点
J=2*v1/(dt*dt); %加加速度
amax=dt*J;      %最大加速度
v2=v1+dt*amax;  %第二次加速度拐点
vmax=v2+v1;     %第三次速度拐点

t1 = 1*dt;
t2 = 2*dt;
t3 = 3*dt;
t4 = 4*dt;
t5 = 5*dt;
t6 = 6*dt;
t7 = 7*dt;

t=0:0.1:T;

vt1=1/2*J*t.^2.*(t>=0 & t<t1);
vt2=(v1+amax*(t-t1)).*(t>=t1 & t<t2);
vt3=(vmax-1/2*J*(t3-t).^2).*(t>=t2 & t<t3);
vt4=vmax.*(t>=t3 & t<t4);
vt5=(vmax-1/2*J*(t-t4).^2).*(t>=t4 & t<t5);
vt6=(v2-amax*(t-t5)).*(t>=t5 & t<t6);
vt7=(1/2*J*(t7-t).^2).*(t>=t6 & t<t7);

vt=vt1+vt2+vt3+vt4+vt5+vt6+vt7;     %各时刻速度

S=zeros(1,length(t));       %各时刻位移
for i=2:length(t)
    S(i)=trapz(t(1:i),vt(1:i));
end 

%各时刻xyz的位移
x_s=xyz_start(1)+(xyz_end(1)-xyz_start(1))/L*S;     
y_s=xyz_start(2)+(xyz_end(2)-xyz_start(2))/L*S;
z_s=xyz_start(3)+(xyz_end(3)-xyz_start(3))/L*S;

%各时刻xyz轴的速度分量
v_x=(xyz_end(1)-xyz_start(1))/L*vt;
v_y=(xyz_end(2)-xyz_start(2))/L*vt;
v_z=(xyz_end(3)-xyz_start(3))/L*vt;

你是想实现什么样的需求


L1.qlim = [(-165/180)*pi,(165/180)*pi];
L2.qlim = [( -95/180)*pi, (70/180)*pi];
L3.qlim = [( -85/180)*pi, (95/180)*pi];
L4.qlim = [(-180/180)*pi,(180/180)*pi];
L5.qlim = [(-115/180)*pi,(115/180)*pi];
L6.qlim = [(-360/180)*pi,(360/180)*pi];

看下这个对你是否有用: https://bbs.csdn.net/topics/606246641