[자율주행] RVIZ 기반 Odometry 활용

zzwon1212·2023년 10월 10일

자율주행

목록 보기
4/6
post-thumbnail

1. Odometry 소개

  • Odometer: 차량이나 로봇이 주행하며 이동한 거리를 측정하는 기기
  • Odometry: Odometer의 측정값으로 움직이는 사물의 위치를 측정하는 방법
  • 자동차는 바퀴의 회전수로 이동 거리를 계산한다.
  • 자동차의 회전
    • 자동차가 회전할 때 앞바퀴가 꺾이는 각도는 다르다. 자동차가 제자리를 맴돌 때 두 바퀴가 그리는 원을 상상해보자. 회전 방향의 안쪽 바퀴가 바깥쪽 바퀴보다 작은 원을 그려야 하기 때문에 안쪽 바퀴가 바깥쪽 바퀴보다 많이 꺾여야 한다. 아래 그림의 왼쪽처럼 두 뒷바퀴를 연결한 평행선에 각 앞바퀴의 수직선이 한 점에서 만나야 한다.
    • Ackermann Steering
      계산식 없이 아래 그림의 오른쪽처럼 설계하면 앞바퀴가 왼쪽처럼 동심원을 그리는 서로 다른 각도로 꺾이게 된다.
  • 자동차의 위치 정보
    • 현재 위치: 두 뒷바퀴의 중점(x,yx, y) + 각도(θ\theta)
    • 이동 속도: 선속도(vv) + 각속도(ww)
    • 조향각(δ\delta)

2. Odometry 정보 Publish

  • Odometry 토픽: '/odom'
  • 메시지 타입: 'nav_msgs/Odometry'
    $ rosmsg show nav_msgs/Odometry
    • Pose: 포지션 관련
      • Point position: 뒷바퀴 중점의 x,y,zx, y, z 좌표
      • Quaternion orientation: 자세 정보로, 'roll, yaw, pitch'와 비슷한 개념
    • Twist: 속도 관련
      • linear: 선속도 vv
      • angular: 각속도 ww
  • '/odom' 토픽 발행
    • 예제 코드
    • X축, Y축, 이동 속도 벡터 계산
      δx=VxcosθVysinθδy=VxsinθVycosθ\delta_x = V_x \cdot cos\theta - V_y \cdot sin\theta \\ \delta_y = V_x \cdot sin\theta - V_y \cdot cos\theta
    • Pitch, Yaw, Roll 오일러 값에서 쿼터니언 값을 계산
    • 실행, 확인
      $ roscore
      $ rosrun ex_urdf odom_publisher_ex.py
      $ rostopic list
      $ rostopic info odom
      $ rqt_graph
      # rosmsg show nav_msgs/Odometry
      $ rostopic echo odom



3. RVIZ 가상 공간에서 3D 자동차 주행시키기

강의에서 설명한 3.3.의 odom 노드 코드에 오류가 있어 보여 다른 구조로 수정하였다.

  • 전체 흐름
    ① driver 노드가 xycar_motor 토픽을 발행
    ② converter 코드가 xycar_motor 토픽을 받아 JointState 포맷으로 변환하여 joint_states 토픽을 발행
    ③ odom 코드가 joint_states 토픽을 받아 몇 가지 수학 계산 후 odom 토픽을 발행
    ④ RVIZ 가상 공간에서 3D 자동차가 8자로 주행한다.


📙강의 - (주)자이트론 대표이사 허성민

profile
JUST DO IT.

0개의 댓글