IKPy v3.3.3运行机械臂Demo报缺失origin_translation参数错误
报错直接原因
你使用的IKPy v3.3.3版本中,URDFLink类构造函数的必填位置参数名为origin_translation,但当前utils.py里所有URDFLink实例化时传入的关键字参数为translation,参数名不匹配导致必填参数缺失,触发TypeError: __init__() missing 1 required positional argument: 'origin_translation'报错。
隐藏关联bug
修复上述参数问题后,代码还会触发第二个错误:utils.py的Wam4IK.__init__方法中,self.active_joints = list(map(lambda x: x == 1, active_joints))行引用了未定义的变量active_joints,会抛出NameError。
具体修复步骤
修正URDFLink参数名
将utils.py中所有URDFLink初始化时的translation=关键字参数,全部替换为origin_translation=,示例修改片段:# 原错误写法 URDFLink(name="wam/links/base", translation=base_translation, origin_orientation=base_orientation, rotation=[0, 0, 0] ) # 修正后写法 URDFLink(name="wam/links/base", origin_translation=base_translation, origin_orientation=base_orientation, rotation=[0, 0, 0] )其余所有
URDFLink(shoulder_yaw、shoulder_pitch、shoulder_roll、upper_arm等)的同名参数都按此规则修改。修复未定义变量问题
你的self.all_joints已经标记了所有主动关节对应的link位置(长度和links列表一致,共9个元素,True位置对应主动关节),可以直接将其作为active_links_mask使用,替换原有错误的active_joints相关代码:# 原错误代码 self.all_joints = [False, False, True, True, True, True, False, False, False] self.active_joints = list(map(lambda x: x == 1, active_joints)) self.active_links = [False, False, *self.active_joints, False, False, False] # 修正后代码 self.all_joints = [False, False, True, True, True, True, False, False, False] self.active_links = self.all_joints可选逻辑优化(非必须,避免后续关节维度错误)
你在Wam4IK类中已经封装了自动补全首尾零值关节的fk()方法,但kinematics.py中直接调用了父类的forward_kinematics()方法,后续修改关节数时容易出现维度不匹配问题,可将kinematics.py中的chain.forward_kinematics(...)调用替换为chain.fk(...)。
补充说明
当前代码的link定义中缺少wam/links/forearm段,不会触发初始化报错,但会导致正运动学计算结果和Mujoco仿真值存在偏差,你可以后续对照Mujoco模型的URDF参数补全该段link定义、调整各link的平移旋转参数即可。
内容的提问来源于stack exchange,提问作者Longsen Gao

