Python Sympy:';Mul&x27;对象没有属性';cos';对于分层函数 总结
我有一个Jupyter实验室笔记本,我一直试图用它来发展机械臂的雅可比矩阵,象征性地用Sympy。我有一些表达式,然后在后续表达式中使用,等等。尝试运行lambdified final表达式时,我收到消息“Mul”对象没有属性“cos” 我试过的 以下是其他问题,如 我已确保使用以下方式给sympy打电话:Python Sympy:';Mul&x27;对象没有属性';cos';对于分层函数 总结,python,jupyter,sympy,Python,Jupyter,Sympy,我有一个Jupyter实验室笔记本,我一直试图用它来发展机械臂的雅可比矩阵,象征性地用Sympy。我有一些表达式,然后在后续表达式中使用,等等。尝试运行lambdified final表达式时,我收到消息“Mul”对象没有属性“cos” 我试过的 以下是其他问题,如 我已确保使用以下方式给sympy打电话: 将sympy作为sp导入 然后用sp前缀调用所有内容: sp.cos() sp.pi 这是我的代码(我为长代码道歉) 符号分析 将sympy作为sp导入 #变数 θ1,θ2,θ3,θ
将sympy作为sp导入
然后用sp
前缀调用所有内容:
sp.cos()
sp.pi
这是我的代码(我为长代码道歉)
符号分析
将sympy作为sp导入
#变数
θ1,θ2,θ3,θ4,θ5,θ6=sp.symbols(‘θ1θ2θ3θ4θ5θ6’)
#常数(待定)
a1、a2、a3=sp符号('a1 a2 a3'))
d1、d4、d6=sp符号('d1 d4 d6')
#常数(预定)
d2、d3、d5、a4、a5、a6、alpha2、alpha6=0、0、0、0、0、0、0
字母1,字母3,字母5=(sp.pi/2,)*3
alpha4=-sp.pi/2
#绕x旋转
def rotx(角度):
返回sp.Matrix([[1,0,0,0],[0,sp.cos(角度),-sp.sin(角度),0],[0,sp.sin(角度),sp.cos(角度),0],[0,0,1])
#绕y旋转
def roty(角度):
返回sp.Matrix([[sp.cos(角度),0,sp.sin(角度),0],[0,1,0,0],-sp.sin(角度),0,sp.cos(角度),0],[0,0,0,1])
#绕z旋转
def rotz(角度):
返回sp.Matrix([[sp.cos(角度),-sp.sin(角度),0,0],[sp.sin(角度),sp.cos(角度),0,0],[0,0,1,0],[0,0,0,1])
#x、y或z方向的平移
def变速器(x、y、z):
返回sp.Matrix([[1,0,0,x]、[0,1,0,y]、[0,0,0,z]、[0,0,0,1]]
def dh_矩阵(d,θ,a,α):
返回trans(0,0,d)*rotz(θ)*trans(a,0,0)*rotx(α)
t_0_1=dh_矩阵(d1,θ1,a1,α1)
t_1_2=dh_矩阵(d2,θ2,a2,α2)
t_2_3=dh_矩阵(d3,θ3,a3,α3)
t_3_4=dh_矩阵(d4,θ4,a4,α4)
t_4_5=dh_矩阵(d5,θ5,a5,α5)
t_5_6=dh_矩阵(d6,θ6,a6,α6)
t_0_6=t_0_1*t_1_2*t_2_3*t_3_4*t_4*t_5*t_6
最后一列=t\u 0\u 6.列(-1)
x=最后一列。行(0)
y=最后一列。行(1)
z=最后一列。第(2)行
#x的偏导数
dxd1=sp.diff(x,θ1)
dxd2=sp.diff(x,θ2)
dxd3=sp.diff(x,θ3)
dxd4=sp.diff(x,θ4)
dxd5=sp.diff(x,θ5)
dxd6=sp.diff(x,θ6)
#y的偏导数
dyd1=sp.diff(y,θ1)
dyd2=sp.diff(y,θ2)
dyd3=sp.diff(y,θ3)
dyd4=sp.diff(y,θ4)
dyd5=sp.diff(y,θ5)
dyd6=sp.diff(y,θ6)
#z的偏导数
dzd1=sp.diff(z,θ1)
dzd2=sp.diff(z,θ2)
dzd3=sp.diff(z,θ3)
dzd4=sp.diff(z,θ4)
dzd5=sp.diff(z,θ5)
dzd6=sp.diff(z,θ6)
雅可比矩阵([[dxd1,dxd2,dxd3,dxd4,dxd5,dxd6],[dyd1,dyd2,dyd3,dyd4,dyd5,dyd6],[dzd1,dzd2,dzd3,dzd4,dzd5,dzd6])
雅可比数值=sp.lambdify([θ1,θ2,θ3,θ4,θ5,θ6,a1,a2,a3,d1,d4,d6],雅可比)
雅可比数值(0,sp.pi/2,0,0,0,0,0,0,1,0.3,0.1)
预期产量
包含数值的3x6矩阵
实际产量
以下错误归因于最后一行:
AttributeError:“Mul”对象没有属性“cos”
我想这与我如何将函数和多个表达式扭曲在一起有关,但我不太确定如何找到它的失败之处
回溯
它有点巨大;我用…
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在里面
---->1当前_jacobian=雅可比数值(0,sp.pi/2,0,0,0,0,0,0,0,1,0.3,0.1)#由于x_2和x_3之间的初始偏移,将pi/2添加到θ2
2电流雅可比矩阵
在λλf中生成(θ1、θ2、θ3、θ4、θ5、θ6、a1、a2、a3、d1、d4、d6)
生成的1个定义λf(θ1、θ2、θ3、θ4、θ5、θ6、a1、a2、a3、d1、d4、d6):
---->2返回(数组([[a1*sin(theta1)-a2*sin(theta1)*cos(theta2)+a3*sin(theta1)*sin(theta2)*sin(theta3)-a3*sin(theta1)*cos(theta2)*cos(theta3)+。。。
AttributeError:“Mul”对象没有属性“cos”
我不完全确定原因,但当我在代码雅可比数值(0,np.pi/2,0,0,0,0,0,0,1,0.3,0.1)的最后一行将sp.pi
替换为np.pi
错误消失了。我已经看到了其他几个问题与此类似,但目前没有很好的答案。这可能是simpy
中的一个错误,或者希望其他人有更好的解释。在使用lambdify
创建可执行函数后,您不再处于s的“符号数学”世界中ympy
,并且必须传入数值,而不是符号值
您可以传递StackOverflow欢迎!您可以添加回溯吗?添加回溯到初始问题,减去我用
…
切断的表达式的其余部分哇,这非常简单,谢谢!我想知道这是否是因为,一旦lambdify
-ed,只应提供数值作为表达式jacobian\u numeric
,而sp.pi
是符号。带有符号的numpy数组将具有对象数据类型。np.cos
将计算委托给每个对象的cos
方法。这为@BenT提供了相同的“what”,但提供了一个非常值得赞赏的“why”。谢谢!