控制器 API¶
三类控制器共享 get_task_space_state(q, v) 遥测接口,但主控制律的数据契约不同:
经典阻抗和 HQP-AC 接收世界轴对齐的任务空间线量;SE(3) Lie 控制器接收 body
运动参考与 EE body wrench。坐标约定与推导见
SE(3) Lie 群阻抗控制器。
任务空间阻抗(CIC)¶
任务空间动力学控制器(平动+姿态阻抗,动力学一致映射,零空间阻尼)/ Task-space dynamics controller (translation + rotation impedance; dynamics-consistent mapping; null damping)
源代码位于: src/compliant_docking/control/task_space.py
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 | |
方法:¶
__init__ ¶
__init__(
robot_model: Model,
dt: float,
impedance: ImpedanceConfig | None = None,
ee_frame: str = "cylinder_link",
frictionloss: ndarray | None = None,
damping: ndarray | None = None,
friction_integral_gain: float | None = None,
friction_mode: str = "torque",
friction_tau_scale: float = 2.0,
)
初始化控制器:设定 Pinocchio 模型、步长与阻抗参数 / Initialize controller: set Pinocchio model, time step and impedance params
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
robot_model
|
Model
|
Pinocchio 模型 / Pinocchio model |
必需 |
dt
|
float
|
控制步长 [s] / control time step |
必需 |
impedance
|
ImpedanceConfig | None
|
阻抗参数(None 时取 ImpedanceConfig 默认值) / impedance params |
None
|
ee_frame
|
str
|
末端 frame 名(由模型/场景决定;默认值为组合 URDF 的
|
'cylinder_link'
|
frictionloss
|
ndarray | None
|
关节摩擦损耗幅值 [N·m](nq 维;None 时取零向量)。 Pinocchio 的 MJCF/URDF 导入不保留 frictionloss,需由调用方 从组装 MjModel 的 dof_frictionloss 传入;控制器以前馈补偿, 模式由 friction_mode 选择(默认 "torque",见下) / joint friction-loss magnitudes for feedforward compensation |
None
|
friction_integral_gain
|
float | None
|
任务空间积分增益 [N/(m·s)],用于克服 静摩擦死区(前馈在零速时消失)。None 时自动:摩擦非零取 150.0,否则 0(iiwa14 零摩擦路径行为不变) |
None
|
Note
重力置零由 compliant_docking.models.load_pin_model 负责(加载时统一处理)/ gravity zeroing is owned by compliant_docking.models.load_pin_model
Note
末端 frame 由 ee_frame 决定,方法内所有矩阵/向量维数均按
model.nq 泛化(iiwa14 nq=7 时与历史实现数值逐位一致)。
源代码位于: src/compliant_docking/control/task_space.py
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 | |
get_task_space_state ¶
get_task_space_state(
q: ndarray, v: ndarray
) -> tuple[ndarray, ndarray, ndarray]
计算当前末端位置与线速度(世界系)/ Compute current end-effector position and linear velocity (world frame)
源代码位于: src/compliant_docking/control/task_space.py
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | |
get_task_space_state_with_orientation ¶
get_task_space_state_with_orientation(
q: ndarray, v: ndarray
) -> tuple[ndarray, ndarray, ndarray]
返回末端位置、线/角速度,以及相对于期望姿态的李代数姿态误差 / Return EE position, linear/angular velocity, and orientation error (log map)
源代码位于: src/compliant_docking/control/task_space.py
136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | |
compute_control_task_space_with_orientation_and_imp ¶
compute_control_task_space_with_orientation_and_imp(
q: ndarray,
v: ndarray,
pos_des: ndarray,
vel_des: ndarray,
acc_des: ndarray,
current_pos: ndarray,
current_vel: ndarray,
force_ext: ndarray,
torque_ext: ndarray,
) -> ndarray
任务空间控制(含姿态 + 阻抗 + 外力补偿):输出关节力矩 / Task-space control (orientation + impedance + external force): output joint torques
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
q
|
ndarray
|
当前关节状态 / current joints |
必需 |
v
|
ndarray
|
当前关节状态 / current joints |
必需 |
pos_des
|
ndarray
|
期望项 / desired |
必需 |
vel_des
|
ndarray
|
期望项 / desired |
必需 |
acc_des
|
ndarray
|
期望项 / desired |
必需 |
current_pos
|
ndarray
|
实际项 / current |
必需 |
current_vel
|
ndarray
|
实际项 / current |
必需 |
force_ext
|
ndarray
|
外力 / external |
必需 |
torque_ext
|
ndarray
|
外力 / external |
必需 |
返回:
| 名称 | 类型 | 描述 |
|---|---|---|
tau |
ndarray
|
关节力矩 / joint torques |
源代码位于: src/compliant_docking/control/task_space.py
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 | |
HQP-AC¶
HQP-AC 控制器:约束 QP 主任务 + 自适应刚度 + 零空间奇异性规避/关节位姿阻抗。
与 TaskSpaceController 鸭子类型兼容:提供同签名的
compute_control_task_space_with_orientation_and_imp 与
get_task_space_state,可在 experiments/run_docking.py 中直接互换。
源代码位于: src/compliant_docking/control/hqp_ac.py
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 | |
属性¶
方法:¶
__init__ ¶
__init__(
robot_model: Model,
dt: float,
config: HQPConfig | None = None,
ee_frame: str = "cylinder_link",
r_des: ndarray | None = None,
frictionloss: ndarray | None = None,
damping: ndarray | None = None,
impedance: ImpedanceConfig | None = None,
friction_mode: str = "torque",
friction_tau_scale: float = 2.0,
force_source: str = "sensor",
observer_kp: float = 20.0,
observer_ki: float = 40.0,
preload_force: float = 0.0,
preload_ramp_s: float = 1.5,
preload_axis: ndarray | None = None,
contact_deadband: float = 0.0,
)
初始化控制器:预解析限位并预建两个 ProxQP 实例(主任务/零空间)。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
robot_model
|
Model
|
Pinocchio 模型(重力置零由 load_pin_model 负责) |
必需 |
dt
|
float
|
控制步长 [s] |
必需 |
config
|
HQPConfig | None
|
HQPConfig 参数(None 时取默认值) |
None
|
ee_frame
|
str
|
末端 frame 名(与 TaskSpaceController 同口径) |
'cylinder_link'
|
r_des
|
ndarray | None
|
期望姿态(世界系 3×3);None 时取
|
None
|
frictionloss
|
ndarray | None
|
关节摩擦损耗幅值 [N·m](nv 维;None 时取零向量)。 Pinocchio 导入器不保留 MJCF frictionloss,需由调用方从组装 MjModel 的 dof_frictionloss 传入;以前馈并入 ĥ(同时进入力矩 硬约束与输出力矩),模式由 friction_mode 选择(默认 "torque") |
None
|
Note
QP 实例复用策略:proxsuite 支持 qp.update(...) 原地更新 H/g/C/u,
两个实例在 init 各建一次,之后每个控制步只 update+solve,
不再重新构造。
源代码位于: src/compliant_docking/control/hqp_ac.py
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 | |
compute_control_task_space_with_orientation_and_imp ¶
compute_control_task_space_with_orientation_and_imp(
q: ndarray,
v: ndarray,
pos_des: ndarray,
vel_des: ndarray,
acc_des: ndarray,
current_pos: ndarray,
current_vel: ndarray,
force_ext: ndarray,
torque_ext: ndarray,
) -> ndarray
HQP-AC 控制律:返回关节力矩 τ = M·q̈_c + ĥ。
参数与 TaskSpaceController 同名方法完全一致 / Same signature as the TaskSpaceController method of the same name.
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
q
|
ndarray
|
关节状态 |
必需 |
v
|
ndarray
|
关节状态 |
必需 |
pos_des
|
ndarray
|
期望任务位置 |
必需 |
vel_des
|
ndarray
|
期望任务速度 |
必需 |
acc_des
|
ndarray
|
期望任务加速度 |
必需 |
current_pos
|
ndarray
|
实际末端位置 |
必需 |
current_vel
|
ndarray
|
实际末端线速度 |
必需 |
force_ext
|
ndarray
|
世界系末端外力(3 维) |
必需 |
torque_ext
|
ndarray
|
世界系末端外力矩(3 维) |
必需 |
返回:
| 类型 | 描述 |
|---|---|
ndarray
|
关节力矩 τ(n 维) |
Note
回退语义 / Fallback: 主 QP 非 solved → 该步主任务分量回退为
无约束最小二乘解(min‖Jq̈-(target-J̇q̇)‖²),并跳过零空间 QP;
零空间 QP 非 solved → 零空间分量取 0。
每次失败 n_solver_failures 自增 1。
Note
直接使用 F/T 传感器输入(无传感器动量观测器留作后续)。
源代码位于: src/compliant_docking/control/hqp_ac.py
288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 | |
update_momentum_observer ¶
update_momentum_observer(
q: ndarray, v: ndarray, tau_applied: ndarray
) -> None
以步进后的关节状态与实际施加力矩推进一步动量观测器。
仅 force_source == "observer" 时有效(其余为 no-op); τ_applied 应为限幅后的实际力矩(上一控制周期)。
源代码位于: src/compliant_docking/control/hqp_ac.py
462 463 464 465 466 467 468 469 470 | |
SE(3) Lie 群阻抗¶
SE3LieImpedanceController(
robot_model,
dt,
config=None,
ee_frame="cylinder_link",
frictionloss=None,
damping=None,
friction_mode="torque",
friction_tau_scale=2.0,
A=None,
D=None,
K=None,
)
get_task_space_state(q, v):返回世界系位置、线速度与姿态,供统一遥测使用;get_body_state(q, v):返回 EE 位姿、LOCAL Jacobian 与其时间导数;compute_control(q, v, T_d, V_d, Vdot_d, F_body, F_d=None):执行 Eq. 44–66 标称控制律并返回关节力矩;运动量和 wrench 均为线量在前;latest_diagnostics:最近一步的lam、lam_dot、任务矩阵条件数、wrench 范数与力矩范数等诊断,不承载控制状态。
A、D、K 可直接注入一般 6×6 矩阵;未提供时由
SE3ImpedanceConfig 的对角参数构造。
Lie 群数学工具¶
公开函数均采用 Pinocchio 的线量在前排列:twist [v; ω]、wrench [f; n]。
lie_se3.py — SE(3)/SO(3) 微分指数映射(dexp)闭式工具集
实现 Kim et al. 2025(IEEE T-RO, Vol. 41)"Impedance Control Design Framework Using Commutative Map Between SE(3) and se(3)" Section II-C / II-D(Eq. 26-43):
- Lemma 1(Eq. 26-27):SO(3) 的 dexp / dexp⁻¹
- Lemma 2(Eq. 28-31):SE(3) 的 dexp / dexp⁻¹(含旋转-平移耦合块 C_ξ(η)、D_ξ(η))
- Lemma 3(Eq. 34-35):d/dt dexp_ξ = C_ξ(ξ̇) 与 d/dt dexp_ξ⁻¹ = D_ξ(ξ̇)
- Lemma 4(Eq. 36-43):SE(3) 的 d/dt dexp_λ 与 d/dt dexp_λ⁻¹(解析实现)
约定(论文 Eq. 1-5,与 Pinocchio Motion 一致):
- twist
V = [v; ω](线量在前、角量在后),wrenchF = [f; n] - ceiling form
[V] = [[ω], v; 0, 0] ad_V = [[ω], [v]; 0, [ω]],Ad_T = [R, [r]R; 0, R]- 标量系数(Eq. 9):
α = sinθ/θ、β = 2(1-cosθ)/θ²、γ = α/β = (θ/2)cot(θ/2)
dexp 约定(本模块实现的是论文 Eq. 17a/22 的右平凡化版本)::
vee(Ṫ T⁻¹) = dexp(λ) λ̇, T = Exp(λ)
即 dexp 把指数坐标速度映射为空间(spatial)twist。论文控制器(Eq. 48)中
相对位姿 T̃ 以当前末端系 {b} 为参考"空间系",因此 Ṽ = dexp_λ λ̇ 恰是用
{b} 系表达的相对 twist——接线见 control/se3_impedance.py。
数值稳定性:θ→0 时 (1-α)/θ² 等标量系数存在灾难性消去,统一在
θ < _TAYLOR_EPS 时切换显式 Taylor 展开(含 Γ1..Γ5 与 2(1-γ/β)/θ⁴)。
dexp⁻¹ 族函数在 ‖ξ‖ ≥ 2π 抛 ValueError(论文 Lemma 1:定义域 ‖ξ‖ < 2π,
2kπ 处 β→0 奇异;控制器经 log6 取得的 λ 满足 ‖ξ‖ < π,不会触界)。
函数:¶
skew3 ¶
skew3(x: ndarray) -> ndarray
⌈x⌉ ∈ so(3)(论文 Eq. 1)。
源代码位于: src/compliant_docking/control/lie_se3.py
49 50 51 52 53 54 55 56 | |
vee3 ¶
vee3(S: ndarray) -> ndarray
so(3) → R³,skew3 的逆算子。
源代码位于: src/compliant_docking/control/lie_se3.py
59 60 61 62 | |
hat4 ¶
hat4(V: ndarray) -> ndarray
[V] ∈ se(3) 的 4×4 ceiling form(论文 Eq. 2),V = [v; ω]。
源代码位于: src/compliant_docking/control/lie_se3.py
65 66 67 68 69 70 71 | |
vee4 ¶
vee4(M: ndarray) -> ndarray
se(3) 4×4 矩阵 → [v; ω],hat4 的逆算子。
源代码位于: src/compliant_docking/control/lie_se3.py
74 75 76 77 | |
ad6 ¶
ad6(V: ndarray) -> ndarray
伴随算子 ad_V(论文 Eq. 3-4),V = [v; ω]。
源代码位于: src/compliant_docking/control/lie_se3.py
80 81 82 83 84 85 86 87 | |
adjoint ¶
adjoint(T) -> ndarray
伴随变换 Ad_T(论文 Eq. 5)。
T = ^A T_B(B 在 A 中的位姿)时满足 V_A = Ad_T V_B。
源代码位于: src/compliant_docking/control/lie_se3.py
98 99 100 101 102 103 104 105 106 107 | |
adjoint_wrench ¶
adjoint_wrench(T) -> ndarray
wrench 变换矩阵 Ad_T^{-T}(co-adjoint 作用)。
T = ^A T_B 时满足 F_A = Ad_T^{-T} F_B 且功率不变
V_Aᵀ F_A = V_Bᵀ F_B。显式形式 [[R, 0], [[p]R, R]]
的左下块即矩平移项 p × f。
源代码位于: src/compliant_docking/control/lie_se3.py
110 111 112 113 114 115 116 117 118 119 120 121 | |
dexp_so3 ¶
dexp_so3(xi: ndarray) -> ndarray
dexp_ξ(论文 Eq. 26,右平凡化):vee(Ṙ Rᵀ) = dexp_ξ ξ̇。
源代码位于: src/compliant_docking/control/lie_se3.py
286 287 288 289 290 291 | |
dexp_inv_so3 ¶
dexp_inv_so3(xi: ndarray) -> ndarray
dexp_ξ⁻¹(论文 Eq. 27),dexp_so3 的矩阵逆。
源代码位于: src/compliant_docking/control/lie_se3.py
294 295 296 297 298 299 | |
dexp_dot_so3 ¶
dexp_dot_so3(
xi: ndarray, xi_dot: ndarray
) -> ndarray
d/dt dexp_ξ(论文 Lemma 3 / Eq. 34)= C_ξ(ξ̇)。
源代码位于: src/compliant_docking/control/lie_se3.py
302 303 304 | |
dexp_inv_dot_so3 ¶
dexp_inv_dot_so3(
xi: ndarray, xi_dot: ndarray
) -> ndarray
d/dt dexp_ξ⁻¹(论文 Lemma 3 / Eq. 35)= D_ξ(ξ̇)。
源代码位于: src/compliant_docking/control/lie_se3.py
307 308 309 | |
dexp_se3 ¶
dexp_se3(lambda_: ndarray) -> ndarray
dexp_λ(论文 Lemma 2 / Eq. 28)。
满足右平凡化微分关系 vee(Ṫ T⁻¹) = dexp_λ λ̇(λ = [η; ξ])。
注意右上耦合块 C_ξ(η) 不可省略——block_diag(dexp_ξ, dexp_ξ) 会丢掉
旋转-平移耦合。
源代码位于: src/compliant_docking/control/lie_se3.py
315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 | |
dexp_inv_se3 ¶
dexp_inv_se3(lambda_: ndarray) -> ndarray
dexp_λ⁻¹(论文 Lemma 2 / Eq. 29),dexp_se3 的矩阵逆。
源代码位于: src/compliant_docking/control/lie_se3.py
335 336 337 338 339 340 341 342 343 344 345 346 347 | |
dexp_dot_se3 ¶
dexp_dot_se3(
lambda_: ndarray, lambda_dot: ndarray
) -> ndarray
d/dt dexp_λ(论文 Lemma 4 / Eq. 36),解析实现。
源代码位于: src/compliant_docking/control/lie_se3.py
350 351 352 353 354 355 356 357 358 359 360 361 | |
dexp_inv_dot_se3 ¶
dexp_inv_dot_se3(
lambda_: ndarray, lambda_dot: ndarray
) -> ndarray
d/dt dexp_λ⁻¹(论文 Lemma 4 / Eq. 37),解析实现。
源代码位于: src/compliant_docking/control/lie_se3.py
364 365 366 367 368 369 370 371 372 373 374 375 | |
Wrench 坐标与参考点变换¶
transform_wrench(
force, torque, p_source, R_source, p_target, R_target
) -> tuple[np.ndarray, np.ndarray]
wrench_to_body(
force, torque, p_source, R_source, T_target
) -> np.ndarray
transform_wrench 返回 target frame 表达、target 原点参考的 (force, torque);
wrench_to_body 是面向控制器的便利封装,返回 [f_E; n_E]。两者都会保留
参考点变更产生的 (p_source-p_target)×f 力矩项,不负责更改传感器读数符号。
摩擦与关节阻尼前馈¶
friction.py — 关节摩擦/阻尼前馈的共享实现。
从 TaskSpaceController 已验证逻辑中逐位抽取(tests/test_friction_comp.py 与 slow 回归锚点保证行为不变),供 task_space 与 SE(3) Lie 阻抗控制器 共用,保证 iiwa14 / FR3 上多控制器对比的摩擦补偿公平性。
背景:Pinocchio 的 URDF/MJCF 导入不保留 MuJoCo 的 dof_frictionloss 与 dof_damping(被动广义力 -f·sign(q̇)、-d·q̇),故以前馈补偿:
torque模式(默认):τ_ff = f·tanh(τ_pre·scale/f),用补偿前力矩 方向决定摩擦方向(τ₀=f/scale),零速静摩擦死区一出发即被抬过阈值;velocity模式:τ_ff = f·tanh(q̇/v₀),零速时补偿消失,低速易粘滑。
属性¶
函数:¶
validate_friction_mode ¶
validate_friction_mode(mode: str) -> None
源代码位于: src/compliant_docking/control/friction.py
21 22 23 | |
friction_feedforward ¶
friction_feedforward(
tau_pre: ndarray,
v: ndarray,
frictionloss: ndarray,
damping: ndarray,
mode: str = "torque",
tau_scale: float = 2.0,
v0: float = 0.01,
) -> ndarray
在逆动力学力矩上叠加摩擦/阻尼前馈,返回补偿后力矩。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
tau_pre
|
ndarray
|
补偿前关节力矩(摩擦力矩模式用其方向) |
必需 |
v
|
ndarray
|
关节速度 |
必需 |
frictionloss
|
ndarray
|
摩擦损耗幅值(零向量 = 无补偿) |
必需 |
damping
|
ndarray
|
关节阻尼系数(前馈 +damping·v) |
必需 |
mode
|
str
|
"torque"(默认)或 "velocity" |
'torque'
|
tau_scale
|
float
|
torque 模式的力矩-摩擦换算 scale(τ₀=f/scale) |
2.0
|
v0
|
float
|
velocity 模式的 tanh 平滑速度阈值 [rad/s] |
0.01
|
源代码位于: src/compliant_docking/control/friction.py
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | |
PI 动量观测器¶
无传感器外力估计:PI 动量观测器(世界系 LWA 口径)。
用法(每控制步,τ_applied 为实际施加——限幅后的力矩): tau_ext = obs.update(q, v, tau_applied) force = obs.force # 世界系 3 维外力估计(同一步的 J 映射)
源代码位于: src/compliant_docking/control/momentum_observer.py
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | |
属性¶
方法:¶
__init__ ¶
__init__(
robot_model: Model,
ee_frame: str,
dt: float,
*,
kp: float = 20.0,
ki: float = 40.0,
integral_limit: float = 20.0,
frictionloss: ndarray | None = None,
damping: ndarray | None = None,
friction_v0: float = 0.01,
)
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
kp
|
float
|
观测器比例增益 [s⁻¹](K_p 量纲 1/s) |
20.0
|
ki
|
float
|
观测器积分增益 [s⁻¹](K_i 1/s²) |
40.0
|
integral_limit
|
float
|
积分项 ∫Δp 的逐关节限幅 [N·m·s],防饱和 |
20.0
|
frictionloss
|
ndarray | None
|
已知关节耗散模型(与仿真同源)。提供后
|
None
|
damping
|
ndarray | None
|
已知关节耗散模型(与仿真同源)。提供后
|
None
|
friction_v0
|
float
|
tanh 平滑化速度阈值 [rad/s](与控制器一致) |
0.01
|
源代码位于: src/compliant_docking/control/momentum_observer.py
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | |
reset ¶
reset(q: ndarray, v: ndarray) -> None
以当前状态初始化动量估计(避免初值阶跃)。
源代码位于: src/compliant_docking/control/momentum_observer.py
96 97 98 99 100 101 102 | |
update ¶
update(
q: ndarray, v: ndarray, tau_applied: ndarray
) -> ndarray
推进一步观测器,返回关节外力矩估计 τ̃_ext(n 维)。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
q
|
ndarray
|
当前关节状态(步进后) |
必需 |
v
|
ndarray
|
当前关节状态(步进后) |
必需 |
tau_applied
|
ndarray
|
上一控制周期实际施加的关节力矩(限幅后) |
必需 |
源代码位于: src/compliant_docking/control/momentum_observer.py
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 | |