DiffDrive와 gpu_lidar
가상 로봇의 바퀴는 누가 굴리고, 라이다 값은 누가 만들까?
모델 파일
로봇은 SDF로 적혀 있습니다
SDF(Simulation Description Format)는 Gazebo의 모델 형식입니다. 13강의 URDF처럼 link와 joint로 몸을 적고, 여기에 센서와 플러그인까지 한 파일에 담습니다. 3편에서 create가 넣은 파일이 이것입니다.
뼈대만 보였습니다. TurtleBot3는 Gazebo용 SDF와 robot_state_publisher용 URDF를 따로 둡니다.
차동 구동
두 바퀴의 속도 차로 돕니다
burger는 양쪽 바퀴 두 개로 움직이는 차동 구동(differential drive) 로봇입니다. 두 바퀴가 같은 속도면 곧게 가고, 오른쪽이 빠르면 왼쪽으로 돕니다. /cmd_vel의 직진 속도 v와 회전 속도 ω를 두 바퀴 속도로 바꾸는 것이 이 식입니다.
DiffDrive
바퀴는 DiffDrive 시스템이 굴립니다
Gazebo에 끼우는 기능 조각을 시스템(system) 플러그인이라고 합니다. gz-sim-diff-drive-system은 cmd_vel을 받아 두 바퀴 관절을 돌리고, 바퀴로 센 위치를 odom과 TF(odom → base_footprint)로 냅니다(12강 5편).
모두 Gazebo 토픽이라, ROS와는 6편의 브리지가 잇습니다.
라이다
라이다는 gpu_lidar 센서입니다
<sensor type="gpu_lidar">가 라이다를 흉내 냅니다. 1초에 5번, 한 바퀴를 360개 거리로 재고, 0.12~3.5 m 안의 물체만 봅니다. 이름처럼 광선 계산을 GPU로 하므로 1편의 GPU 경고와 이어집니다.
줄 일부를 줄이고 나눴습니다. 계산은 월드 파일에 든 Sensors 시스템이 맡습니다.
Classic과 차이
ROS 플러그인 대신 브리지
Classic 시절 자료에는 센서마다 libgazebo_ros_…so 플러그인을 붙여 ROS 토픽을 바로 내는 줄이 있습니다. Harmonic에는 이런 센서별 ROS 플러그인이 없습니다. 센서는 Gazebo 토픽만 내고, ROS로 올리는 일은 브리지가 맡습니다.
인터넷 예제를 볼 때 SDF에 이런 줄이 있으면 Classic용입니다.
따라 하기
RViz로 /scan을 봅니다
Gazebo를 띄운 채 ros2 run rviz2 rviz2 --ros-args -p use_sim_time:=true로 RViz를 엽니다. Fixed Frame을 odom으로 두고, Add → By topic에서 /scan의 LaserScan을 고르면 벽과 기둥이 점으로 나타납니다.
13강 8편에서 미뤄 둔 LaserScan입니다. 3.5 m보다 먼 벽은 찍히지 않습니다.
다음 편