캘리브레이션용 체스보드를 4개 배치했으니 이제 캘리브레이션을 하려고 룰루랄라 하면서 이미지를 받아보았다. 그러나 큰 문제가 있었으니...
카메라의 FOV가 너무 넓은 바람에 이미지에 원하지 않는 양쪽 체스보드까지 잡히는 문제가 발생..!!
이 상태로는 체스보드를 제대로 감지 할 수 없다. 이를 해결하기 위해서는 수동으로 체스보드를 회전 시켜주면 되나 여러번 캘리브레이션 이미지 취득을 테스트 하다보니 스크립트로 자동화하는게 바람직하다고 생각했다.
우선 gazebo 내부에서 model의 pose와 orientation을 받아오고 수정 할 수 있는 기능이 필요한데 다행히도 rosservice로 지원한다는것을 발견!
/gazebo/get_model_state
/gazebo/set_model_state
위 2가지 service를 사용하면 된다.
다만 주의할점이 내가 만든 체스보드는 is_static 속성값이 True라서 좌표가 고정되는 대신(중력 영향 X) 시뮬레이션이 진행중일떄는 pose를 변경할수 없다
/gazebo/pause_physics
/gazebo/unpause_physics
따라서 위 2가지 service를 사용해 물리엔진을 일시정지후 state를 변경하고 다시 재개 시켜주는식으로 구현하였다. 또한 일시정지를 위한 통신이 조금 시간이 걸리는듯 하여 일시정지후 0.5초 대기를 걸어주었더니 원하는대로 작동했다.
결과적으로 아래처럼 원할떄 뒤집기 성공!
결과는 다음 링크에서 보실수 있습니다.