Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix collision loop #990

Closed

Conversation

YoheiKakiuchi
Copy link
Contributor

collision_loopを設定すると、挙動がおかしくテストが通らない問題を修正しました。

主には、recover時のcollision_check姿勢の更新タイミングがsafe時と違っているのを修正しました。

collision_loopを使うと、lastsafe_jointdataと出力されている関節角度が違ってしまう
(collision_loopの回数前のデータがlastsafe_jointdata)のをcollision判定されたら戻すようにしました。

@k-okada
Copy link
Contributor

k-okada commented May 12, 2016

Refer to this link for build results (access rights to CI server needed):
http:https://jenkins.jsk.imi.i.u-tokyo.ac.jp:8080/job/hrpsys-qnx/2620/
Test PASSed.

@k-okada
Copy link
Contributor

k-okada commented May 12, 2016

Refer to this link for build results (access rights to CI server needed):
http:https://jenkins.jsk.imi.i.u-tokyo.ac.jp:8080/job/hrpsys-qnx/2621/
Test PASSed.

@snozawa
Copy link
Contributor

snozawa commented May 13, 2016

多分これと同様の問題が発生していて、今までcollision_loopが設定できませんでしたが、ありがとうございます。
具体的にどんな問題でしょうか。
こちらで確認したのは、
 collision状態から抜けてこない
だった気がします(前のことなので記憶がアレですが)

@k-okada
Copy link
Contributor

k-okada commented May 13, 2016

11 のテストが落ちているのは期待通り?
https://github.com/fkanehiro/hrpsys-base/blob/master/sample/SampleRobot/samplerobot_stabilizer.py#L30
みたいにバージョンチェックしましょう.

できれば,テストだけ入れた段階でpushしてtravisはしらせて全部Xになることを確認して,修正をpushして治ったか見たい所.

    1. TEST_TYPE=work_with_315_1_10 TEST_PACKAGE=hrpsys-base

[ROSTEST]-----------------------------------------------------------------------

[hrpsys.rosunit-samplerobot_co_loop/test_demo][FAILURE]-------------------------
File "/usr/lib/python2.7/unittest/case.py", line 327, in run
    testMethod()
  File "/home/travis/hrpsys_ws/install_isolated/share/hrpsys/test/test-samplerobot-collision.py", line 14, in test_demo
    samplerobot_collision_detector.demo()
  File "/home/travis/hrpsys_ws/install_isolated/share/hrpsys/samples/SampleRobot/samplerobot_collision_detector.py", line 127, in demo
    demoCollisionCheckFail()
  File "/home/travis/hrpsys_ws/install_isolated/share/hrpsys/samples/SampleRobot/samplerobot_collision_detector.py", line 42, in demoCollisionCheckFail
    assert((not cs.safe_posture) is True)
--------------------------------------------------------------------------------


SUMMARY
�[1;31m * RESULT: FAIL�[0m
 * TESTS: 1
 * ERRORS: 0
�[1;31m * FAILURES: 1�[0m
  • 14 : TEST_TYPE=work_with_downstream TEST_PACKAGE=hrpsys-ros-bridge
[ROSTEST]-----------------------------------------------------------------------

[hrpsys_ros_bridge.rosunit-hztest_tf/test_hz][FAILURE]--------------------------
average rate (236.527Hz) exceeded minimum (300.000Hz)
  File "/usr/lib/python2.7/unittest/case.py", line 327, in run
    testMethod()
  File "/opt/ros/hydro/share/rostest/nodes/hztest/hztest", line 115, in test_hz
    self._test_hz(hz, hzerror, topic, test_duration, wait_time)
  File "/opt/ros/hydro/share/rostest/nodes/hztest/hztest", line 185, in _test_hz
    (rate, self.min_rate))
  File "/usr/lib/python2.7/unittest/case.py", line 420, in assertTrue
    raise self.failureException(msg)
--------------------------------------------------------------------------------

[hrpsys_ros_bridge.rosunit-samplerobot/test_force_sensor][passed]
[hrpsys_ros_bridge.rosunit-samplerobot/test_joint_angles][passed]
[hrpsys_ros_bridge.rosunit-samplerobot/test_load_pattern][passed]
[hrpsys_ros_bridge.rosunit-samplerobot/test_odom][passed]
[hrpsys_ros_bridge.rosunit-samplerobot/test_odom_tf][passed]

SUMMARY
�[1;31m * RESULT: FAIL�[0m
 * TESTS: 6
 * ERRORS: 0
�[1;31m * FAILURES: 1�[0m

  • 15: TEST_TYPE=work_with_315_1_10 TEST_PACKAGE=hrpsys-ros-bridge

[hrpsys_ros_bridge.rosunit-hztest_tf/test_hz][FAILURE]--------------------------
average rate (205.674Hz) exceeded minimum (300.000Hz)
  File "/usr/lib/python2.7/unittest/case.py", line 327, in run
    testMethod()
  File "/opt/ros/hydro/share/rostest/nodes/hztest/hztest", line 115, in test_hz
    self._test_hz(hz, hzerror, topic, test_duration, wait_time)
  File "/opt/ros/hydro/share/rostest/nodes/hztest/hztest", line 185, in _test_hz
    (rate, self.min_rate))
  File "/usr/lib/python2.7/unittest/case.py", line 420, in assertTrue
    raise self.failureException(msg)
--------------------------------------------------------------------------------

if (m_safe_posture && m_recover_time == 0) { // 1. current safe angle
// 1. current safe angle or collision angle .. check based on qRef
// 2. recovery .. check based on q'(m_recover_jointdata)
if (m_recover_time == 0 || m_recover_time == default_recover_time ) { // 1. current safe angle or collision angle
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m_safe_posuture の条件がが消えているけど大丈夫?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

以前の条件が冗長でして、
(!m_safe_posture && m_recover_time == 0)
という条件が成立しないので、ここはこれで大丈夫です。

@k-okada
Copy link
Contributor

k-okada commented May 13, 2016

たしかに,一回のPRでテスト中のバージョンチェックはできないですね.いっかい機能を入れてリリースしてバージョンをあげないと,ダメか.どうしましょうかね.

  • テストなしで入れておく
  • バージョンチェックをいれておいて,バージョンが上がった時に壊れないことを願う

@YoheiKakiuchi
Copy link
Contributor Author

こちらで確認したのは、
 collision状態から抜けてこない

collision_loopを設定した時は、

  • collision_loop毎にrobot->qに関節角度を設定
  • collision_loop回に分けてcollision detectionする (この間常にsafe or recoverモード)
  • collision_loop毎にモード判定が行われて、モードが変わる

となっています。

safe -> collisionの判定は問題なくて、recoverモードの時だけ、毎ループrobot->q (collision checkされる関節角度)を更新していて、
collision_loopの回数だけ、collision判定されるまでに遅れることがあって、そうするとrobot->qがcollisionしている姿勢にもかかわらず、safeであると判定され、それがlastsafe_angleになってしまうことがある状況だった。

そうなると、そこから復帰するための補間がなされると、hoffarbib補間では最初の1ステップはごく小さいので、lastsafe_angleがsafeでないと、復帰のための1ステップ目がcollisionしているため、recoverの動作に移行できないということだった。

@YoheiKakiuchi
Copy link
Contributor Author

11 のテストが落ちているのは期待通り?

これは、期待とはちょっと違うのですが、これまでのCollisionDetectorのテストは確率的に落ちていたのではないかと思っています。
というのは、collisionしたあとに、referenceがcollisionしていても、referenceとlastsafe_angleの補間がsafeならば、recoverモードになっていて、collisionする限界までrecoverを試みるという動作になっていました。
これだと、interpolationが終わったあとであっても、recover->collision->recoverと動いており、recover時はcollisionしていないため、
collision姿勢にして、collisionしているか調べると、recoverモードの時はcollisionしていないという結果になり、collisionモードの時はcollisionしているという結果になり、wait_interpolationのあとにどれぐらいループが回ったかで変化してしまいます。

これについても、collisionしたあとのcollision判定をreferenceを見るように変更しています。
recover時はこれまで通り、recoverの出力angleのcollision判定をします。

@YoheiKakiuchi
Copy link
Contributor Author

#993
にてマージされたので閉じます。

@YoheiKakiuchi YoheiKakiuchi deleted the fix_collision_loop branch May 24, 2016 04:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants