MATLAB robotics toolbox机器人工具箱 (Index exceeds the number of array elements报错)解决方案

本文针对MATLAB2019及以上版本中使用Robotics工具箱时出现的plot/teach命令可视化错误进行了详细解析,并提供两种解决办法:一种是临时性的解决方案,在每次运行可视化之前加入特定命令;另一种是永久性修改源代码的方法。
该文章已生成可运行项目,

MATLAB 机器人工具箱 plot/teach可视化程序 数组越界报错/解决方案

报错信息

当在MATLAB 2019及以上版本中使用Robotics工具箱时,运行plot或teach等含可视化功能的命令时出现以下报错信息:

Index exceeds the number of array elements. Index must not exceed 4.

出错 SerialLink/plot>create_robot (第 469 行)
            d = norm( d(4:6)-d(1:3) ) / 72;

出错 SerialLink/plot (第 252 行)
        handle = create_robot(robot, opt);

在这里插入图片描述
索引超出数组数目
在MATLAB2018b以前版本中不会出现这个问题

解决方法

一、临时解决方案
每次都在可视化语句前加入以下命令:

view(3);

虽能解决可视化问题,但仍会报错

此类型的变量不支持使用点进行索引。

出错 SerialLink/animate (第 105 行)
                        if h.link(L) ~= 0

出错 SerialLink/plot (第 299 行)
    robot.animate(qq);

二、一劳永逸方案
1、在命令行窗口中输入

edit SerialLink.plot

此时会打开工具箱中的plot.m文件,如下图:
在这里插入图片描述
2、在程序的开头处加入如下程序

[myModifyForViewErrorA,myModifyForViewErrorB]=view(gca);
if isequal([myModifyForViewErrorA,myModifyForViewErrorB],[0,90])
    view(3)
end

如下图:
在这里插入图片描述
再次执行可视化程序,即可成功运行!

运行效果

1、运行示例程序

startup_rvc
L1 = Link('d', 0, 'a', 1, 'alpha', pi/2)
L2 = Link('d', 0, 'a', 1, 'alpha', 0)
bot = SerialLink([L1 L2], 'name', 'my robot')
bot.fkine([0.1 0.2]) 
bot.plot([pi/4 pi/3])

2、绘图效果
在这里插入图片描述
参考博客:
解决高版本MATLAB robotics toolbox在plot/teach时报错问题

本文章已经生成可运行项目
<think>好的,用户之前遇到了关于SerialLink对象不支持点索引的问题,现在又遇到了新的错误,具体是在调用robot.plot(theta)时出现“此类型的变量不支持使用点进行索引”的错误,并且指向animate函数中的h.link(L) ~= 0和plot函数中的robot.animate(qq)。我需要仔细分析这个问题。 首先,用户可能使用的是旧版Robotics Toolbox,因为新版中已经弃用了Link和SerialLink,改用Revolute和Prismatic等关节类型。旧版中的SerialLink对象在调用plot方法时,内部可能调用了animate方法,而在这个过程中出现了点索引的问题。 错误信息提到在SerialLink/animate的第105行,检查h.link(L)是否不等于0。这里的h可能是一个图形句柄对象,而h.link可能不是一个结构体或对象,导致无法使用点索引。这可能是因为在旧版本中,图形对象的属性访问方式不同,或者用户使用的MATLAB版本与新版本工具箱不兼容。 另一个可能的原因是用户代码中的robot变量在之前的操作中被覆盖或修改,导致robot对象不再是SerialLink实例。例如,可能在之前的代码中,用户将robot重新赋值为了一个结构体或其他类型的变量,导致调用plot方法时出现错误。 还需要检查用户是否正确创建了SerialLink对象。用户之前的代码中使用了Link类,但新版工具箱可能已经不再支持,所以用户可能在混合使用新旧版本的语法,导致对象类型不正确。 此外,用户可能在调用plot时传入的theta参数维度不正确,比如不是行向量或列向量,导致内部处理时出错,间接引发点索引的问题。 可能的解决方案包括: 1. 检查robot对象是否正确创建,确保其类型为SerialLink。 2. 确认使用的Robotics Toolbox版本,如果是新版,改用Revolute和SerialLink的新语法。 3. 确保在调用plot之前没有修改robot变量,避免覆盖。 4. 检查theta的维度,确保是正确的一维数组,长度与机器人关节数匹配。 5. 更新工具箱到最新版本,或者根据版本调整代码。 另外,用户可能在之前的修正中已经将robot.comment改为robot.name,但可能还存在其他属性设置的问题。需要确保所有属性设置符合当前使用的工具箱版本的API。 如果用户使用的是新版工具箱,可能需要将代码改为使用Revolute关节和SerialLink的新构造函数,例如: robot = SerialLink([L1 L2 L3], 'name', 'qunlan'); 同时,检查plot函数的调用方式,确保传入的角度是行向量,并且数量正确。 总结,用户的问题可能源于版本不兼容或对象类型错误,需要针对不同版本进行调整,并确保代码语法与所用工具箱版本一致。</think>--- ### **问题分析** 你的错误信息表明在调用 `robot.plot(theta)` 时,工具箱试图访问某个对象的 `.link` 属性,但该对象不支持点索引(即不是 MATLAB 的结构体或对象)。此问题通常由以下原因导致: 1. **工具箱版本不兼容** 你使用的可能是 **新版 Robotics Toolbox(V10+)**,但代码中仍在使用旧版语法(如 `Link` 和 `SerialLink`)。 2. **对象类型错误** `robot` 变量可能被意外覆盖,导致其不是有效的 `SerialLink` 对象。 --- ### **解决方案** #### **方法 1:适配新版 Robotics Toolbox(推荐)** 新版工具箱废弃了 `Link` 类,改用 `Revolute`(旋转关节)和 `Prismatic`(移动关节)。修改代码如下: ```matlab % 使用 Revolute 定义旋转关节 L1 = Revolute('d', 16, 'a', 0, 'alpha', pi/4); % 参数顺序:d, a, alpha L2 = Revolute('d', 12, 'a', 0, 'alpha', pi/3); L3 = Revolute('d', 8, 'a', 0, 'alpha', pi/2); % 创建 SerialLink 机器人对象 robot = SerialLink([L1, L2, L3], 'name', 'qunlan'); robot.display(); % 定义关节角度并绘图(角度需为行向量) theta1 = [0, 0, 0]; % 行向量 [&theta;1, &theta;2, &theta;3] robot.plot(theta1); theta2 = [0, pi/2, 0]; robot.plot(theta2); theta3 = [0, pi/3, 0]; robot.plot(theta3); ``` #### **方法 2:修复旧版语法(V9 及以下)** 如果坚持使用旧版,需确保代码符合旧版规范: ```matlab L1 = Link([16, pi/4, 0, pi/4, 0]); % 旧版参数顺序:[theta, d, a, alpha, sigma] L2 = Link([12, pi/3, 0, pi/3, 0]); % sigma=0 表示旋转关节 L3 = Link([8, pi/2, 0, pi/2, 0]); robot = SerialLink([L1, L2, L3]); robot.name = 'qunlan'; % 旧版使用 name 属性 % 确保 theta 是行向量 theta1 = [0, 0, 0]; robot.plot(theta1); ``` --- ### **关键注意事项** 1. **参数顺序差异** - **旧版 `Link`**: `[theta, d, a, alpha, sigma]` - **新版 `Revolute`**: 直接指定 `'d'`, `'a'`, `'alpha'` 等属性。 2. **角度输入格式** `robot.plot(theta)` 要求 `theta` 是 **行向量**(如 `[&theta;1, &theta;2, &theta;3]`),而非列向量。 3. **工具箱版本验证** 通过以下命令检查版本: ```matlab ver('robotics') % 查看 Robotics Toolbox 版本 ``` 4. **对象完整性检查** 确保 `robot` 未被覆盖: ```matlab class(robot) % 应返回 'SerialLink' ``` --- ### **常见错误排查表** | 错误现象 | 原因 | 解决方案 | |-------------------------|-------------------------|------------------------------| | `.link` 索引错误 | 新版工具箱不兼容旧语法 | 改用 `Revolute` 和 `SerialLink` 新语法 | | 角度维度错误 | `theta` 不是行向量 | 使用 `theta = [&theta;1, &theta;2, &theta;3]` | | `SerialLink` 对象无效 | `robot` 变量被覆盖 | 重新创建机器人对象 | --- ### **代码验证** 1. 运行修正后的代码,确保无报错。 2. `robot.display()` 应输出 DH 参数表。 3. `robot.plot(theta)` 应显示机器人不同构型。 若仍有问题,建议参考官方文档:[Peter Corke Robotics Toolbox](https://petercorke.com/toolboxes/robotics-toolbox/)
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值