weixin_54792645 2024-09-28 12:43 采纳率: 0%
浏览 2

这段matlab的包围盒并没有包围所有关节,坐标转换完空间分布很乱,如何修改代码能使包围盒将对应关节包围住

% 定义机械臂的关节
L1(1) = Link('prismatic', 'offset', 0, 'a', 0, 'alpha', 0, 'modified');
L1(2) = Link('revolute', 'd', 250, 'a', 0, 'alpha', pi/2, 'offset', pi/2, 'modified');
L1(3) = Link('revolute', 'd', 0, 'a', 0, 'alpha', pi/2, 'offset', pi/2, 'modified');
L1(4) = Link('prismatic', 'offset', 975, 'a', 0, 'alpha', pi/2, 'theta', pi/2, 'modified');
L1(5) = Link('revolute', 'd', 47, 'a', 0, 'alpha', pi/2, 'offset', pi, 'modified');
L1(6) = Link('revolute', 'd', 0, 'a', 0, 'alpha', pi/2, 'offset', pi, 'modified');
L1(7) = Link('prismatic', 'offset', -266, 'a', 0, 'alpha', pi/2, 'modified');

% 创建机械臂模型
T_base1 = transl(-1100, 650, 650)* trotx(-pi/2);  

% 创建第一个机械臂模型
arm1 = SerialLink(L1, 'name', '7dof_arm1','base', T_base1);


% 设置关节范围
L1(1).qlim = [0, 1200]; % 移动关节1
L1(2).qlim = [-30, 30]/180*pi; % 转换为弧度
L1(3).qlim = [-30, 30]/180*pi; % 转换为弧度
L1(4).qlim = [0, 600]; % 移动关节2
L1(5).qlim = [-90, 90]/180*pi; % 转换为弧度
L1(6).qlim = [-120, 120]/180*pi; % 转换为弧度
L1(7).qlim = [0,1500]; % 移动关节3

% 绘制机械臂的每个关节的包围盒
figure;
hold on;
view(3);
axis equal;
grid on;

% 设定关节变量 q
q = [1000, 30/180*pi, 20/180*pi, 500, 60/180*pi, 90/180*pi, 1000]; 

% 计算每个关节的齐次变换矩阵
T01 = arm1.A(1, q);  
T12 = arm1.A(2, q);  
T23 = arm1.A(3, q);  
T34 = arm1.A(4, q);  
T45 = arm1.A(5, q);  
T56 = arm1.A(6, q);  
T67 = arm1.A(7, q);  

% 定义包围盒
b1 = [-100, 100; -100,100; 0, q(1)];
b2 = [-100, 100; -250, 0; -100, 100];
b3 = [-100, 100; -100, 100; -100, 100];
b4 = [-100, 100; -975-q(4), 100; -100, 100];
b5 = [-100, 100; 0, 47; -100, 100];
b6 = [-100, 100; -100, 100; -100, 100];
b7 = [-100, 100; -266-q(7),0;-100, 100];
% 绘制每个关节的包围盒
draw_bounding_box( T_base1*T01.T, b1);        % 绘制关节 1 的包围盒
draw_bounding_box( T_base1*T01.T * T12.T, b2); % 绘制关节 2 的包围盒
draw_bounding_box( T_base1*T01.T * T12.T * T23.T, b3); % 绘制关节 3 的包围盒
draw_bounding_box( T_base1*T01.T * T12.T * T23.T * T34.T, b4); % 绘制关节 4 的包围盒
draw_bounding_box( T_base1*T01.T * T12.T * T23.T * T34.T * T45.T, b5); % 绘制关节 5 的包围盒
draw_bounding_box( T_base1*T01.T * T12.T * T23.T * T34.T * T45.T * T56.T, b6); % 绘制关节 6 的包围盒
draw_bounding_box( T_base1*T01.T * T12.T * T23.T * T34.T * T45.T * T56.T * T67.T, b7); % 绘制关节 7 的包围盒

% 绘制机械臂模型
arm1.plot(q);

% 调整坐标范围和视图
axis([-5000 5000 -5000 5000 -5000 5000]);  % 缩小坐标范围以便更好地显示机械臂
grid off 

% 添加坐标轴
xlabel('X');
ylabel('Y');
zlabel('Z');
title('Mechanical Arm with Bounding Boxes');

% 绘制包围盒的函数
function draw_bounding_box(T, box)
    % 定义包围盒的8个顶点
    vertices = [box(1,1), box(2,1), box(3,1);  % (xmin, ymin, zmin)
                box(1,2), box(2,1), box(3,1);  % (xmax, ymin, zmin)
                box(1,2), box(2,2), box(3,1);  % (xmax, ymax, zmin)
                box(1,1), box(2,2), box(3,1);  % (xmin, ymax, zmin)
                box(1,1), box(2,1), box(3,2);  % (xmin, ymin, zmax)
                box(1,2), box(2,1), box(3,2);  % (xmax, ymin, zmax)
                box(1,2), box(2,2), box(3,2);  % (xmax, ymax, zmax)
                box(1,1), box(2,2), box(3,2)]; % (xmin, ymax, zmax)

    % 使用变换矩阵 T 对顶点进行坐标变换
    vertices = (T * [vertices, ones(size(vertices,1),1)]')';
    vertices = vertices(:, 1:3);  % 提取变换后的 x, y, z 坐标

    % 定义包围盒的面
    faces = [1 2 3 4;  % 底面
             5 6 7 8;  % 顶面
             1 2 6 5;  % 侧面1
             2 3 7 6;  % 侧面2
             3 4 8 7;  % 侧面3
             4 1 5 8]; % 侧面4

    % 使用 patch 绘制包围盒
    patch('Vertices', vertices, 'Faces', faces, ...
          'FaceColor', 'r', 'FaceAlpha', 0.5, 'EdgeColor', 'k')
end

img

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-28 13:16
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    根据您提供的代码和描述,您正在尝试为机械臂的每个关节绘制包围盒。为了确保包围盒正确地包围每个关节,您需要确保包围盒的尺寸和位置适应每个关节的实际尺寸和位置。以下是一些建议的步骤和修改,以帮助您改进代码:

    1. 理解关节类型和位置:首先,了解每个关节的类型(旋转关节或移动关节)以及它们在机械臂上的位置。这将有助于确定如何为每个关节定义包围盒。
    2. 计算关节位置和方向:为每个关节计算其位置和方向。这将涉及到考虑机械臂的DH参数和当前关节角度。然后,您可以为每个关节定义合适的包围盒尺寸和方向。
    3. 调整包围盒尺寸和位置:根据每个关节的实际尺寸和位置调整包围盒的尺寸和位置。对于旋转关节,包围盒可能需要围绕关节轴旋转一定的角度。对于移动关节,您可能需要根据关节的位移来调整包围盒的位置。
    4. 使用正确的变换矩阵:确保您正确地应用了变换矩阵(从基座到每个关节的齐次变换矩阵)来计算包围盒在全局坐标系中的位置和方向。
    5. 修改包围盒绘制函数:在draw_bounding_box函数中,使用正确的变换矩阵T对每个关节的包围盒顶点进行坐标变换。确保此函数能够处理不同尺寸和形状的包围盒。
    6. 逐个调试:逐个绘制每个关节的包围盒,检查是否正确地包围了每个关节。调整包围盒的尺寸和位置,直到满意为止。

    以下是一些代码修改的建议:

    • 对于不同的关节,可能需要不同的包围盒尺寸和方向。考虑为每个关节定义不同的b1, b2, ...变量。
    • 考虑使用机械臂的DH参数和当前关节角度来计算包围盒的实际位置和尺寸。
    • 检查并调整draw_bounding_box函数中的逻辑,以确保它能正确处理不同尺寸和形状的包围盒。

    最后,您可能需要多次尝试和调整来获得最佳的显示效果。此外,考虑使用机械臂的实际运动范围来测试包围盒的显示效果,以确保在所有可能的关节配置中都能正确显示。

    评论

报告相同问题?

问题事件

  • 修改了问题 9月28日
  • 创建了问题 9月28日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?