[SoftErrorLimiter] fix priority among vel, err, pos #1294
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
#785 以降、SoftErrorLimiterは、
ことを防ぐために、
という仕様になっています。この仕様の問題を直すPull Requestです。
vel=>pos=>errorの順で書き換えられたときに前のリミットをみたさないのは、速度、角度、エラーの3つのリミットを同時に満たす関節角度が存在しない場合なので、3つのリミットを調停する必要があります。しかし、#785 の「一番厳しいリミット値で制限する」というのは定義が曖昧なので、現在の実装ではどのような挙動になるのか整理されていない状態になっています。その結果、複数リミットの境界付近の動作を行わせることができませんでした。
このPull Requestでは、
3. vel (highest priority)
2. error
1. pos (lowest priority)
の順の優先順位で調停するようにしました。すなわち、速度リミットを満たす範囲内でエラーリミットを満たし、それらのリミットを満たす範囲内で位置リミットを満たすように指令関節角度を修正します。
posが低優先度である理由は、velとerrorは一瞬でもリミットを侵すとRobotHardwareの機能によって全身が脱力してしまい、動作続行困難になるためです。
hrpsys-base/rtc/RobotHardware/robot.cpp
Line 622 in e98cf26
hrpsys-base/rtc/RobotHardware/robot.cpp
Line 657 in e98cf26
velがerrよりも高優先度である理由は、SoftErrorLimiterの
setServoErrorLimit
サービスによってerrorのリミットが不連続に変化した場合に、velのリミットを侵しRobotHardwareの機能によって全身が脱力してしまい動作続行困難になることを防ぐためです。hrpsys-base/rtc/RobotHardware/robot.cpp
Line 622 in e98cf26
実装上は、
速度、角度、エラーの3点につきそれぞれ角度形式のリミットを計算したあと、単純にpos=>error=>velの順でチェックして指令関節角度を修正することで、上記優先度に基づく調停と等価な処理が行われます。
また、これによって
hrpsys-base/rtc/SoftErrorLimiter/SoftErrorLimiter.cpp
Line 342 in e98cf26
の、指令関節角度が位置リミットを満たす方向に動いている場合は位置リミットを考慮しないでOK、というif文が不要になったため、削除しました。