로봇 개발의 첫걸음에서 가장 큰 장벽 중 하나는 실제 하드웨어를 다루기 전에 알고리즘을 검증할 환경이 필요하다는 점이에요. Gazebo 시뮬레이터는 이런 고민을 해결해 주는 대표적인 오픈소스 로봇 시뮬레이션 도구로, ROS와 함께 사용되면서 학계와 산업계 모두에서 표준처럼 자리 잡았어요. 이 글에서는 Gazebo의 기본 개념부터 설치, 월드 구성, 센서 시뮬레이션, ROS2 연동까지 실무에 바로 도움이 되는 흐름으로 정리해 볼게요.
Gazebo 시뮬레이터란 무엇인가요
Gazebo는 3D 환경에서 로봇과 객체의 물리 거동을 정밀하게 재현해 주는 오픈소스 시뮬레이션 플랫폼이에요. 단순한 비주얼 도구가 아니라, ODE·Bullet·DART 같은 물리 엔진을 백엔드로 사용해 중력·마찰·관성·접촉력을 사실적으로 계산해 줘요. 덕분에 카메라·라이다·IMU 센서 노이즈, 매니퓰레이터의 조인트 토크, 모바일 로봇의 슬립까지 실험할 수 있어요.

Classic Gazebo와 Gazebo Sim의 차이
흔히 말하는 ‘Gazebo’는 두 가지 계열로 나뉘어요. 2002년부터 발전해 온 Gazebo Classic(gazebo11이 마지막 LTS)과, Open Robotics가 새로 설계한 Gazebo Sim(과거 명칭 Ignition Gazebo)이에요. Classic 계열은 ROS1 Noetic과 깊게 결합되어 있고, Gazebo Sim은 ROS2 Humble·Iron·Jazzy와 짝을 이루며 모듈식 아키텍처를 채택했어요. 신규 프로젝트라면 Gazebo Sim(Harmonic 또는 Garden 버전)을 우선 검토하는 편이 좋아요.
왜 시뮬레이션이 중요할까요
실제 로봇 개발은 부품이 비싸고, 디버깅 한 번에 모터가 손상될 수도 있어요. Sim2Real 학습 흐름에서도 강화학습 정책을 수십만 에피소드 학습시키려면 시뮬레이터 없이는 불가능해요. Gazebo는 GUI에서 시각적으로 디버깅하면서, 동시에 헤드리스 모드로 클러스터에서 대규모 학습을 돌릴 수 있다는 점에서 균형이 좋은 선택지예요.
설치와 첫 실행
Gazebo Sim Harmonic 기준으로 우분투 22.04에서 설치 흐름을 살펴볼게요. 핵심은 apt로 메타패키지를 설치한 뒤, ROS2 브릿지 패키지를 함께 깔아 두는 것이에요. 의존성 충돌을 피하려면 ROS2 배포판과 Gazebo 버전 매트릭스를 먼저 확인해야 해요. 예를 들어 ROS2 Jazzy는 Gazebo Harmonic과 짝을 이루고, Humble은 Fortress가 공식 매핑이에요.
패키지 설치 순서
- 저장소 등록:
packages.osrfoundation.org키를 추가하고 sources 리스트에 등록해요. - 메타패키지 설치:
sudo apt install gz-harmonic한 줄로 핵심 구성요소가 모두 들어와요. - ROS 브릿지:
ros-jazzy-ros-gz를 설치해야 토픽·서비스가 양방향으로 연결돼요. - 샘플 월드 실행:
gz sim shapes.sdf로 정상 동작을 확인해요.
실행 시 자주 만나는 문제
가상머신·WSL2 환경에서는 OpenGL 가속이 제대로 잡히지 않아 GUI가 검게 뜨는 경우가 흔해요. 이때는 LIBGL_ALWAYS_SOFTWARE=1로 소프트웨어 렌더링을 강제하거나, --render-engine ogre 옵션으로 렌더 엔진을 바꿔 볼 수 있어요. 헤드리스 환경(Docker, 클라우드)이면 -s 플래그로 서버 모드만 실행하고 RViz로 시각화하는 방법을 권장해요.
월드와 모델 만들기
Gazebo의 환경은 SDFormat(SDF)이라는 XML 기반 포맷으로 기술돼요. URDF와 호환되지만 라이트·물리 파라미터·플러그인 같은 시뮬레이션 전용 요소가 더 풍부해요. 새 월드를 만들 땐 <world> 태그 안에 <physics>, <light>, <include>로 모델을 조립하는 식이에요.
모델 재사용을 위한 model.config
모델 디렉터리마다 model.config와 model.sdf를 두면 재사용성이 크게 올라가요. GZ_SIM_RESOURCE_PATH 환경 변수에 모델 폴더 경로를 추가하면 어느 월드에서든 <include><uri>model://my_robot</uri></include> 한 줄로 불러올 수 있어요. 팀 단위 협업에서는 모델 카탈로그를 Git LFS로 관리하는 패턴이 자주 쓰여요.
Fuel에서 검증된 자산 가져오기
Open Robotics가 운영하는 Gazebo Fuel은 검증된 모델·월드를 무료로 배포하는 공식 카탈로그예요. TurtleBot4, Husky, 도시 시뮬레이션 자산까지 포함돼 있어 처음부터 모델을 만들 필요 없이 빠르게 프로토타입을 시작할 수 있어요. gz fuel download 명령이나 GUI 메뉴에서 한 번에 받아올 수 있어요.
센서 시뮬레이션과 노이즈 모델
로봇 알고리즘에서 가장 까다로운 부분은 센서 입력의 불확실성을 다루는 일이에요. Gazebo는 카메라·깊이 카메라·라이다·IMU·GPS·접촉 센서 등 거의 모든 표준 센서를 플러그인 형태로 제공해요. 여기에 가우시안 노이즈, 드리프트, 양자화 오차를 옵션으로 켤 수 있어, 실제 하드웨어와 비슷한 데이터 품질을 얻기 쉬워요.
라이다와 카메라 토픽 연결
SDF에 <sensor type="gpu_lidar"> 블록을 추가하면 GPU 가속 라이다가 활성화돼요. ROS 브릿지 설정 파일(ros_gz_bridge YAML)에 sensor_msgs/msg/LaserScan 매핑을 추가하면 ROS2 측에서 일반 토픽처럼 구독할 수 있어요. 카메라도 동일한 패턴이며, 깊이 카메라는 PointCloud2로 받아오면 SLAM 알고리즘에 그대로 입력할 수 있어요.
실측과 시뮬레이션 격차 줄이기
Sim2Real 격차는 도메인 랜덤화로 어느 정도 완화할 수 있어요. 빛의 강도, 텍스처, 마찰계수, 카메라 노이즈를 매 에피소드마다 무작위로 바꾸면 정책이 다양한 환경에 강건해져요. Gazebo는 SDF 파라미터를 런타임에 수정하는 API를 제공하므로, 학습 루프 안에서 환경을 자동 변경하는 워크플로를 구성하기 좋아요.
ROS2와의 연동 패턴
대부분의 실무 프로젝트는 Gazebo 단독이 아니라 ROS2 스택과 함께 동작해요. ros_gz 패키지군이 토픽·서비스·TF·시간 동기화를 처리해 주는데, 핵심은 ros_gz_bridge(메시지 변환)와 ros_gz_sim(시뮬레이터 라이프사이클)이에요. gz_ros2_control을 함께 쓰면 매니퓰레이터의 조인트 컨트롤러까지 통합할 수 있어요.
런치 파일로 통합 실행
ROS2 Python 런치 시스템에서는 IncludeLaunchDescription으로 Gazebo 런치를 호출하고, 동시에 RViz·컨트롤러 매니저·내비게이션 노드를 한 그래프에 묶어요. 이렇게 하면 단일 명령으로 시뮬레이터·드라이버·알고리즘이 모두 시작되어 데모 재현성이 높아져요. 실 하드웨어로 옮길 때도 런치 파일의 use_sim_time 인자만 바꾸면 되도록 설계하는 패턴이 권장돼요.
Nav2·MoveIt2와의 결합
Nav2(자율 내비게이션)나 MoveIt2(매니퓰레이션)는 모두 시뮬레이터 친화적으로 만들어졌어요. Nav2 튜토리얼에는 TurtleBot3·TurtleBot4 Gazebo 월드가 기본 제공되며, MoveIt2도 Panda·UR 로봇팔의 시뮬레이션 설정을 공식 예제로 갖고 있어요. 처음 배우는 단계에서는 이 공식 예제를 수정해 가며 익히는 편이 가장 빠른 길이에요.
성능 튜닝과 디버깅 팁
시뮬레이션이 무겁다면 RTF(Real Time Factor)를 먼저 확인해야 해요. RTF가 1.0 이하라면 시뮬레이션 시간이 실제 시간보다 느리게 흐른다는 뜻이고, 이는 학습 속도에 직접 영향을 줘요. 물리 스텝 크기와 반복 횟수를 조절하거나, 충돌 메시를 단순한 프리미티브로 교체하는 것이 1차 처방이에요.
병렬 시뮬레이션 전략
강화학습처럼 대량 샘플이 필요한 작업에서는 한 머신에서 여러 인스턴스를 띄우는 병렬화가 거의 필수예요. Docker Compose로 인스턴스마다 ROS_DOMAIN_ID와 GUI 포트를 분리하고, 헤드리스 모드로 GPU 메모리를 절약하면 단일 워크스테이션에서 8~16개 인스턴스를 돌리는 사례도 보고돼요. NVIDIA Isaac Sim과 비교하면 GPU 활용도는 낮지만, 라이선스 부담이 없다는 점이 큰 장점이에요.
로그와 가시화 도구
gz log 명령으로 시뮬레이션 상태를 기록하고 재생할 수 있어요. 실패한 에피소드만 따로 추출해 RViz에서 다시 재생하면 알고리즘 결함을 빠르게 잡을 수 있어요. 또한 gz topic -e로 토픽 메시지를 실시간 모니터링하면 노드 간 통신 오류를 쉽게 확인할 수 있어요.
마무리하며
Gazebo 시뮬레이터는 단순한 학습용 장난감이 아니라, Physical AI 시대의 로봇 개발 워크플로 전체를 떠받치는 핵심 인프라예요. 설치와 월드 구성에서 시작해 센서 노이즈, ROS2 연동, 병렬 학습까지 단계를 밟아 가면, 실제 로봇으로 옮길 때도 큰 어려움 없이 알고리즘을 이전할 수 있어요. 무엇보다 오픈소스라는 점이 커뮤니티의 모델·튜토리얼 자산을 빠르게 흡수할 수 있는 가장 큰 자산이에요. 더 깊이 있는 정보는 공식 문서와 Wikipedia의 Gazebo simulator 문서, 그리고 Gazebo 공식 문서를 함께 참고하면 좋아요.