Pydrake中直接配点法约束定义及关节位置计算类型错误的解决方案咨询
解决Pydrake Direct Collocation中符号变量与数值接口类型不兼容的问题
这个问题的核心很明确:你在Direct Collocation中拿到的q是符号决策变量数组(属于pydrake.symbolic.Variable类型),但SetPositions()是为数值仿真设计的接口,只接受numpy.ndarray类型的数值输入,自然会触发类型错误。
要解决这个问题,你需要改用Pydrake的符号计算接口来生成足端高度的约束表达式,而不是用数值化的SetPositions()。下面是具体的实现步骤:
步骤1:提前构建足端高度的符号表达式
首先,我们需要创建一个符号上下文,用符号变量替代关节位置,然后直接计算出足端高度的符号表达式——这样后续可以直接把Direct Collocation中的决策变量代入这个表达式。
from pydrake.symbolic import Variable # 1. 创建符号关节位置变量 nq = robot.num_positions() q_sym = [Variable(f"q_{i}") for i in range(nq)] # 2. 创建符号上下文并设置符号位置 symbolic_context = robot.CreateDefaultContext() robot.GetMutablePositions(symbolic_context).SetFromVector(q_sym) # 3. 计算足端高度的符号表达式(替换成你URDF中摆动足的body名称) swing_foot = robot.GetBodyByName("swing_foot") swing_foot_height_expr = swing_foot.EvalPoseInWorldFrame(symbolic_context).translation()[2]
步骤2:将Direct Collocation的决策变量代入表达式
现在你可以把Direct Collocation中的q(决策变量数组)替换到上面的符号表达式中,生成可以直接用于约束的表达式:
# 从dircol的state中提取关节位置变量 x = dircol.state() q = x[:nq] # 将决策变量替换到高度表达式中 height_constraint_expr = swing_foot_height_expr.Substitute( {q_sym[i]: q[i] for i in range(nq)} )
步骤3:添加约束到Direct Collocation
最后,你可以根据需求将这个表达式作为约束添加到Direct Collocation问题中,比如要求摆动足高度大于某个阈值:
# 示例:约束摆动足高度不低于0.1米 dircol.AddConstraint(height_constraint_expr >= 0.1)
为什么原来的方法行不通?
Direct Collocation本质是一个非线性优化问题,所有的状态、输入都是优化变量(符号类型),优化器需要基于符号表达式来构建约束和目标函数。而SetPositions()是用于数值仿真的接口,只能处理具体的数值数组,无法识别符号变量,所以必然会报错。
通过上面的方法,我们直接在符号层面构建了足端高度的表达式,完全符合Direct Collocation对约束的要求,同时也避免了类型不兼容的问题。
内容的提问来源于stack exchange,提问作者nishio
相关产品推荐
相关产品推荐

