function J_geo = geometric_jacobian_from_q_corrected(q)
% 根据关节角度计算几何雅可比矩阵,匹配 MATLAB 工具箱的顺序
% 输入:q - 7x1 关节角向量 (弧度)
% 输出:J_geo - 6x7 几何雅可比矩阵
% Franka Panda 的 DH 参数 (Modified DH)
% 格式:[alpha, a, d, theta]
MDH = [0, 0, 0.333, q(1);
-pi/2, 0, 0, q(2);
pi/2, 0, 0.316, q(3);
pi/2, 0.0825, 0, q(4);
-pi/2, -0.0825, 0.384, q(5);
pi/2, 0, 0, q(6);
pi/2, 0.088, 0.107, q(7)];
n = 7;
T = eye(4);
T_all = cell(n, 1);
p_all = zeros(3, n);
z_all = zeros(3, n);
% 正运动学累积
for i = 1:n
alpha = MDH(i, 1);
a = MDH(i, 2);
d = MDH(i, 3);
theta = MDH(i, 4);
% 改进 DH 变换矩阵 Ti
Ti = [cos(theta), -sin(theta), 0, a;
sin(theta)*cos(alpha), cos(theta)*cos(alpha), -sin(alpha), -d*sin(alpha);
sin(theta)*sin(alpha), cos(theta)*sin(alpha), cos(alpha), d*cos(alpha);
0, 0, 0, 1];
T = T * Ti;
T_all{i} = T;
p_all(:, i) = T(1:3, 4);
z_all(:, i) = T(1:3, 3);
end
% 末端执行器位置
p_ee = p_all(:, end);
% 计算几何雅可比
J_geo = zeros(6, n);
for i = 1:n
if i == 1
% 关节 1:使用基坐标系
p_i = [0; 0; 0];
z_i = [0; 0; 1];
else
% 改进 DH:使用当前连杆 i 的坐标系信息
p_i = p_all(:, i);
z_i = z_all(:, i);
end
% MATLAB 顺序:线速度在前,角速度在后
J_geo(4:6, i) = z_i;
J_geo(1:3, i) = cross(z_i, p_ee - p_i);
end
end
function T = forward_kinematics_mdh(q)
% 改进 DH 正运动学辅助函数
MDH = [0, 0, 0.333, q(1);
-pi/2, 0, 0, q(2);
pi/2, 0, 0.316, q(3);
pi/2, 0.0825, 0, q(4);
-pi/2, -0.0825, 0.384, q(5);
pi/2, 0, 0, q(6);
pi/2, 0.088, 0.107, q(7)];
T = eye(4);
for i = 1:7
alpha = MDH(i, 1);
a = MDH(i, 2);
d = MDH(i, 3);
theta = MDH(i, 4);
Ti = [cos(theta), -sin(theta), 0, a;
sin(theta)*cos(alpha), cos(theta)*cos(alpha), -sin(alpha), -d*sin(alpha);
sin(theta)*sin(alpha), cos(theta)*sin(alpha), cos(alpha), d*cos(alpha);
0, 0, 0, 1];
T = T * Ti;
end
end