Skip to content

Gazebo ​

소개 ​

RBQ 4족 보행 로봇을 위한 오픈소스 Ignition Gazebo (Fortress) 시뮬레이터.

Gazebo는 물리 시뮬레이션 위에서 RBQ 소프트웨어 스택 전체(Motion / Vision / GUI)를 실행하여 하드웨어 없이 로봇 소프트웨어를 개발·검증할 수 있게 합니다. 또한 센서 데이터를 ROS 2로 브리지하므로, 외부 노드(예: SLAM)가 시뮬레이션된 IMU, LiDAR, TF, 관절 상태를 구독할 수 있습니다. Isaac Gym · Isaac Lab 환경과 달리, 여기서의 목적은 강화학습 정책 학습이 아니라 스택 전체의 시뮬레이션입니다.

구성 ​

경로설명
src/시뮬레이터 소스 → bin/rbq_gazebo
resources/월드, 로봇/센서 URDF, 메시
ros2/src/sensor_bridge/colcon 패키지: 브리지 launch, RViz 설정, DDS xml
scripts/빌드 / 실행 / Docker 스크립트

로봇 변형 ​

플래그로봇모델
(없음)RBQ (사족) — 12관절resources/models/rbq10/
--wheel휠타입 RBQ — 12관절 + 구동륜 4개resources/models/rbq10_wheel/

gazebo.bash 가 같은 값을 센서 브리지에 variant:= 로 넘기므로 RViz 도 같은 URDF 를 불러옵니다.

참고 — RBQ 스택에도 같은 변형을 주세요

휠 상태와 지령은 SimInfo_.whl_joint / MotionRef_.whl_joint 로 오가므로 로봇쪽 Motion 도 같은 변형으로 떠야 합니다 — 저장소 루트에서 bash scripts/sim.bash -r wheel 로 스택을 띄우세요.

LiDAR ​

라이다는 옵트인입니다. 플래그를 주지 않으면 스폰되지 않습니다.

플래그장비장착 위치
(없음)없음—
--livoxLivox Mid-360 x2앞 (+35° 상향) / 뒤 (−35° 상향)
--ousterOuster OS1 x1뒤 데크
bash
bash scripts/gazebo.bash --livox           # Livox Mid-360 2대
bash scripts/gazebo.bash --ouster          # Ouster OS1 1대

gazebo.bash 는 같은 값을 센서 브리지에 lidar:= 로 넘깁니다. 그 결과 한 플래그로 셋이 함께 맞춰집니다:

  • Gazebo — 스폰 URDF 에 해당 라이다의 <visual>(하우징) + <sensor>(gpu_lidar) 가 스플라이스됨
  • TF — base_link → lidar_front | lidar_rear | lidar_ouster 정적 TF 발행
  • RViz — 같은 조합으로 생성된 URDF(rbq10_livox.urdf 등)를 불러 하우징까지 같이 표시

발행되는 포인트클라우드 토픽은 아래 외부 노드 연결 절의 QoS 표를 참고하세요.

WARNING — RViz 가 비어 보이면 RBQ 스택이 떠 있는지 확인

번들 RViz 설정의 Fixed Frame 은 local_world 이고, 이 프레임은 Gazebo 가 아니라 RBQ 스택(Network 데몬) 이 발행합니다. 스택 없이 Gazebo 만 띄우면 로봇 모델이 안 그려지고 포인트클라우드도 Message Filter dropping message ... queue is full 로 전부 버려집니다. bash scripts/sim.bash --vision --no-sim 을 같이 띄우거나, RViz 의 Fixed Frame 을 world 로 바꾸세요.

RBQ 스택 전체와 함께 실행 (Local) ​

RBQ 스택 전체(Motion / Vision / GUI)를 Gazebo 시뮬레이터와 함께 실행합니다:

bash
# Clone
git clone https://github.com/RainbowRobotics/RBQ.git
cd RBQ

# 의존성 설치 (최초 1회)
cd rbq_simulator/rbq_gazebo && bash scripts/debian-dep.bash

# rbq_gazebo 빌드
bash scripts/build.bash
cd ../../

사족

bash
bash scripts/sim.bash --vision --no-sim
cd rbq_simulator/rbq_gazebo
bash scripts/gazebo.bash

휠타입 RBQ

bash
bash scripts/sim.bash --vision --no-sim -r wheel
cd rbq_simulator/rbq_gazebo
bash scripts/gazebo.bash --wheel

RBQ 스택 전체와 함께 실행 (Docker) ​

같은 스택을 Docker 안에서 Gazebo 시뮬레이터와 함께 실행합니다:

bash
# Clone
git clone https://github.com/RainbowRobotics/RBQ.git
cd RBQ

사족

bash
bash scripts/sim.bash --vision --no-sim
cd rbq_simulator/rbq_gazebo
bash scripts/docker/run.bash

휠타입 RBQ

bash
bash scripts/sim.bash --vision --no-sim -r wheel
cd rbq_simulator/rbq_gazebo
bash scripts/docker/run.bash --wheel

run.bash 는 모르는 인자를 그대로 시뮬레이터로 넘깁니다 — --wheel, --livox / --ouster, --world <이름> 모두 그대로 전달됩니다.

NOTE — DDS 네트워킹

시뮬레이터는 호스트 RBQ 스택과 루프백 인터페이스(lo)에서 DDS 도메인 0을 공유합니다. Docker에서는 --network host로 제공됩니다.

외부 노드 연결 (SLAM / 커스텀 ROS 2 노드) ​

sensor_bridge는 루프백(lo)에서 ROS 2 도메인 0으로 발행합니다. 노드를 rbq_simulator/rbq_gazebo에서 다음 환경 변수와 함께 실행하세요 (브리지와 맞추려면 CycloneDDS를 사용해야 합니다):

bash
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
export ROS_DOMAIN_ID=0
export CYCLONEDDS_URI=file://$(pwd)/ros2/src/sensor_bridge/config/cyclonedds_gazebo.xml

QoS는 ros_gz_bridge 기본값입니다 (토픽별 재정의는 ros2/src/sensor_bridge/config/bridge.yaml):

ROS 2 토픽타입QoS비고
/rbq/imu/IMU_statesensor_msgs/msg/ImuReliable · KeepLast 10500 Hz
/rbq/lidar/lidar_front/pointssensor_msgs/msg/PointCloud2Reliable · KeepLast 10--livox
/rbq/lidar/lidar_rear/pointssensor_msgs/msg/PointCloud2Reliable · KeepLast 10--livox
/rbq/lidar/lidar_ouster/pointssensor_msgs/msg/PointCloud2Reliable · KeepLast 10--ouster
/tftf2_msgs/msg/TFMessageReliable · KeepLast 10world → robot (ground truth)
/joint_statessensor_msgs/msg/JointStateReliable · KeepLast 1012관절

/tf 에는 서로 독립적인 두 체인이 흐릅니다. world → robot 은 rbq_gazebo 브릿지가 발행하는 Gazebo Ground Truth 포즈이고, local_world → base_link 는 RBQ SW 가 발행하는 상태추정 값(IMU + 레그 오도메트리, 부팅/리셋 시점이 원점)입니다. Ground Truth 를 base_link 가 아니라 robot 에 매단 것은 둘이 같은 부모 프레임을 두고 경합하지 않게 하기 위함입니다.

/rbq/odometry, /rbq/imu, /rbq/joint_states 는 브리지가 아니라 RBQ 스택이 DDS 로 직접 발행합니다. --sim 일 때는 시뮬레이션 시각을 쓰므로 use_sim_time 노드가 하나의 시간축으로 봅니다.

관련 문서 ​

This user manual is intended for RBQ users.