Devin.KR

벡터·행렬과 좌표 변환

map·odom·base_link·sensor 기준과 이동·회전 순서를 코드로 설명합니다.

진도 0%

레슨

  1. 벡터와 거리·단위

    2차원 위치 차이와 유클리드 거리를 계산합니다.

  2. 라디안과 회전행렬

    90도 회전과 역회전을 적용해 기준 벡터를 복원합니다.

  3. 동차 변환과 역변환

    3×3 행렬로 센서 좌표를 로봇 좌표로 옮깁니다.

  4. 프레임 트리와 변환 방향

    프레임 부모·자식 및 변환 방향을 그림으로 제출합니다.

벡터·행렬과 좌표 변환 미션

앞 모듈 robotics-m01-sensor-runtime의 solution과 회귀 테스트 15개를 그대로 이어받습니다. frames.py의 apply·inverse TODO를 완성하고 기존 센서 기록을 map 점으로 변환합니다. replay_points.py는 기존 파일 읽기와 새 변환 함수를 연결합니다.

요구사항

  • 앞 모듈 메시지의 frame_id를 해석하는 frames.py를 추가합니다.
  • SI 단위·반시계 양의 회전·열벡터·부모에서 본 자식 자세의 계약을 정합니다.
  • map→odom→base_link→sensor 트리와 고정 센서 장착 변환을 문서화합니다.
  • 거리 빔은 frame_id의 +x 방향으로 가정합니다. 메시지를 복사해 seq·stamp_s·range_m와 추가 필드를 유지하고 frame_id를 대상 프레임으로 갱신하며 source_frame_id·point_m를 추가합니다.
  • 고정 fixture: map←odom 단위 변환, odom←base_link (1m,2m,π/2rad), base_link←sensor (0.2m,0,0)입니다. 실제 동적 버퍼나 ROS 통신은 구현 범위에 포함하지 않습니다.
  • 기존 sensor.py·cli.py·run.sh·config.json·fixture·테스트를 유지합니다. unknown frame·cycle·duplicate parent·disconnected frame 설정이나 조회는 ValueError로 거절합니다.

완료 기준

  • 이동 (1,2)m와 90도 회전에 센서 점 (1,0)을 적용하면 (1,3)m이며 허용 오차는 1e-9입니다.
  • 변환 후 역변환한 점이 1e-9 이내로 복원됩니다.
  • 알 수 없는 frame_id와 순환 프레임 트리를 거절하는 테스트를 통과합니다.
  • bash check.sh: 기존 15개와 새 13개, 총 28개 테스트 통과입니다. starter는 이전 회귀 테스트는 통과하고 좌표 TODO 관련 테스트 일부가 실패합니다.
  • 센서 장착 전방 0.2m를 합성하면 sensor 점 (1,0)은 map (1,3.2)m입니다. map에서 sensor로 역조회하면 (1,0)m로 복원됩니다.
  • python3 replay_points.py가 valid=3 errors=2 points=3 요약과 map 점 JSON 세 줄을 출력합니다. 원본 메시지는 변경하지 않습니다.
bash check.sh
미션 시작 코드
모범 답안모범 답안 내려받기

검토 기준

  • 입력·단위·실패 조건과 변경 이유를 설명합니다.
  • 이전 모듈의 회귀 테스트와 이번 실험 근거를 함께 제출합니다.