使用matlabFunction生成四连杆机器人动力学函数时报horzcat错误
问题原因
你遇到的报错是Matlab旧版本符号工具箱matlabFunction的已知问题,触发原因如下:
Vars参数中多余的[]包裹操作,导致符号引擎在自动解析输入变量名时出现异常,内部拼接变量名列表时触发维度不匹配错误- 部分情况下未显式指定输入名称,符号引擎自动生成名称时出现冲突也会触发该报错
解决方案
- 首先删除
Vars参数中每个变量外层多余的[],输入参数直接传入符号变量本身即可,示例代码如下:
matlabFunction(D,C,G,'File','getDynamicsFnc','Vars',{q, q_dot, I1, I2, I3, I4, th_a, DH_params, m, com, g});
- 若修改后仍报错,可增加
InputNames参数显式指定每个输入的名称,避免自动生成名称时出现冲突:
matlabFunction(D,C,G,'File','getDynamicsFnc',... 'Vars',{q, q_dot, I1, I2, I3, I4, th_a, DH_params, m, com, g},... 'InputNames',{'q','q_dot','I1','I2','I3','I4','th_a','DH_params','m','com','g'});
- 若上述操作均无效,可通过
symvar函数检查D、C、G表达式中是否存在未被列入输入参数的隐藏符号变量,确认变量完全匹配即可:
% 输出所有出现在D/C/G中的符号变量,和你传入的输入参数逐一比对 all_used_vars = symvar([D(:); C(:); G(:)]); disp(all_used_vars);
额外优化提示
你可以使用轻量级简化函数替代simplify,既不会大幅增加计算耗时,还能压缩表达式长度,提升matlabFunction的生成效率:
- 用
simplifyFraction化简分数形式的表达式 - 用
combine合并同类项
注:计算势能P之前需要先初始化P = sym(0),避免出现未定义变量的问题。
内容的提问来源于stack exchange,提问作者Reigndeer
相关产品推荐
相关产品推荐

