MoveIt!
패키지 설치
sudo apt-get install ros-noetic-moveit ros-noetic-moveit-plugins ros-noetic-moveit-planners

move_group 노드가 포인트 클라우드, 조인트 상태, TF와 같은 로봇 정보를 토픽 및 서비스 형태로 수집한다.
move_group 노드가 pick/place, 역기구학, 순기구학 등 작업을 수행하도록 명령하는 API를 제공한다.
move_group 노드는 ROS 액션/서버를 바탕으로 모션 플래너 플래그인과 통신한다. 기본 플래너 라이브러리는 OMPL (Open Motion Planning Library)이다.
모션 플래너에 기구적 제약조건을 추가로 설정할 수 있다. (위치, 방향, 가시성, 조인트, 사용자 제약 조건 등) move_group 노드는 모든 제약 조건을 준수하는 적절한 궤적을 생성하고 이를 조인트 궤적 컨트롤러 (JointTrajectoryController)로 보낼 수 있다.
모션 프래닝 요청 어댑터 : 모션 플래닝 요청을 사전 처리하고 응답을 사후 처리하는 데 도움이 된다.
다음은 몇 가지 기본 플래닝 요청 어댑터다.
FixStartStateBounds: 조인트 상태가 제약조건을 벗어난 경우, 초기 조인트 제약 조건을 수정할 수 있다.
FixWorkspaceBounds: 큐브 크기가 10cm x 10cm x 10cm인 플래닝을 위한 작업 공간을 지정한다.
FixStartStateCollision: 조인트들이 충돌하는 경우, 충돌 없는 구성을 새로 샘플링한다.
FixStartStatePathConstraints: 로봇의 초기 포즈가 모션 제약 조건을 따르지 않을 때 사용한다.
AddTimeParameterization: 속도 및 가속 제약 조건을 적용해 모션 플래닝을 파라미터화한다.
플래닝 씬 모니터

플래닝 씬 모니터는 joint_states 토픽을 읽고 센서 정보와 월드 기하를 읽는다. 그리고 플래닝된 모션 수행 중 장애물과의 충돌 가능성을 고려한다.
MoveIt! 기구학 처리
기본 IK 솔버는 수치자코비안 기반 솔버(numerial Jacobian-based solver)이다. IKFast 패키지는 IK를 풀기 위한 C++코드를 생성하는 데 사용할 수 있다. 자유도가 작을수록 더 잘 수행된다. 이 C++코드는 ROS 도구를 사용해 MoveIt! 플러그인으로 변환할 수도 있다. (7장)
FK와 자코비안을 구하는 것은 이미 MoveIt! RobotState 클래스에 통합돼어 있다.
MoveIt! 충돌 검사
CollisionWorld 객체는 충돌을 찾기 위해 FCL (Flexible Collision Library) 패키지를 사용한다.
총돌 검사는 모션 플래닝 중 가장 연산 비용이 많이 드는 작업 중 하나이다. 충돌을 확인하는 데 이진 값을 사용하는 행렬인 ACM (Allowed Collision Matrix)을 제공한다. 행렬의 값이 1이면 충돌 검사를 하지 않음을 의미한다. 물체가 항상 너무 떨어져 있어서 서로 충돌하지 않을 때 값을 1로 설정할 수 있다. ACM을 최적화하면 충돌 회피에 필요한 총 연산을 줄일 수 있다.
move_group노드에서 모션 플래닝을 수행하려면 URDF, SRDF, Config 파일 같은 파라미터와 조인트 상태 토픽, 로봇의 TF가 필요하다. MoveIt!에서는 이 모든 요소의 생성을 위해 셋업 어시스턴스라는 GUI기반의 도구를 제공한다.
SRDF 파일에는 팔 조인트, 엔드 이펙터 조인트, 가상 조인트, 충돌 링크에 대한 세부 정보가 포함돼 있다.
Cofig파일에는 기구학 솔버, 조인트 제한, 컨트롤러 등에 대한 세부 정보가 들어있다.