LabHub

블로그

로보틱스 개발 ROS 2 2026 — Nav2 / MoveIt / Gazebo / Isaac Sim / MuJoCo / LeRobot / GR00T 심층 가이드

한국어English日本語

프롤로그 — 로보틱스의 "ChatGPT 모먼트"는 진짜였다

2022년 11월 ChatGPT가 나왔을 때, 많은 로보틱스 연구자들이 같은 질문을 했다. "우리의 ChatGPT 모먼트는 언제 올까?" LLM이 텍스트로 한 일을 로봇이 물리 세계에서 하려면, 데이터·시뮬레이션·하드웨어·모델 네 축이 모두 정렬되어야 했다.

2026년 5월 현재, 그 정렬이 거의 끝났다.

그리고 그 위에 ROS 2가 있다. ROS 1은 2025년 5월 Noetic이 EOL을 맞으면서 사실상 죽었고, ROS 2 Jazzy Jalisco(2024.05)·Kilted Kaiju(2025.05)·Lyrical Luth(2026.05 예정)가 1년 주기 LTS 케이던스로 자리잡았다.

이 글은 2026년 5월 기준 로보틱스 개발 스택을 — ROS 2부터 Nav2·MoveIt 2·Gazebo·Isaac Sim·MuJoCo·LeRobot·GR00T·VLA·Foxglove까지 — 한 호흡으로 정리한다.


1장 · 2026년 로보틱스 지도 — 휴머노이드 붐과 LLM+robot

먼저 큰 그림. 2026년 로보틱스는 네 개의 큰 흐름이 동시에 진행 중이다.

1.1 휴머노이드 붐

2024~2025년이 휴머노이드 "데모의 해"였다면, 2026년은 "양산의 해"다.

1.2 시뮬레이션-우선 학습(Sim-to-Real)

휴머노이드의 가장 큰 문제는 데이터 부족이다. 사람이 일생 동안 보고 듣는 데이터는 페타바이트 단위지만, 휴머노이드가 모은 데이터는 테라바이트 정도다. 그래서 등장한 것이 시뮬레이션-우선 학습이다.

NVIDIA의 표어는 "3 Computers" — 학습 컴퓨터(DGX), 시뮬레이션 컴퓨터(Omniverse/Isaac Sim), 실행 컴퓨터(Jetson Thor). Isaac Sim에서 1초에 수천 개 평행 환경을 돌려서, 강화학습으로 정책을 학습하고, 그 정책을 실제 로봇에 옮긴다(sim-to-real).

1.3 VLA — 로봇의 GPT 모먼트

2023년 7월 Google DeepMind가 발표한 RT-2(Robotic Transformer 2) 가 첫 신호였다. VLM(PaLI-X)을 가져와서 액션 토큰을 출력하도록 파인튜닝했더니, "사라진 동물을 집어라" 같은 자연어 명령에 처음 보는 객체로 일반화했다.

2024년 6월 스탠퍼드의 OpenVLA(7B) 가 오픈소스로 나왔고, 2024년 10월 Physical Intelligence가 π0(파이제로) — Flow Matching 기반 7B VLA — 를 발표하며 옷 개기·식기 세척 같은 손재주(dexterity) 데모를 보여줬다. NVIDIA의 GR00T N1(2025) 은 휴머노이드 전용으로 학습된 17B 모델이다.

1.4 데이터 민주화 — Hugging Face LeRobot

2024년 10월 Hugging Face가 LeRobot을 발표하면서, 로보틱스 ML이 ChatGPT 이전의 NLP 같은 "비밀의 정원"에서 GitHub 수준으로 열렸다. 사전학습 모델·데이터셋·튜토리얼·SO-100/SO-101 같은 $200대 학습용 로봇 팔 키트까지 한 묶음으로 제공한다.

2026년 로보틱스 4-stack

[ 모델층 ]   RT-2 / OpenVLA / π0 / GR00T N1 / Helix
                       |
[ 학습층 ]   LeRobot / Open X-Embodiment / RoboHive
                       |
[ 시뮬층 ]   Isaac Sim 5.0 / MuJoCo / Gazebo Harmonic / Webots
                       |
[ 미들웨어 ] ROS 2 Jazzy/Kilted/Lyrical + Nav2 + MoveIt 2
                       |
[ 하드웨어 ] Optimus / Figure / 1X / Atlas / G1 / Apollo / Phoenix
                       |
[ 시각화 ]   Foxglove Studio / RViz2 / PlotJuggler

이 스택의 각 층을 하나씩 본다.


2장 · ROS 2 Jazzy → Kilted → Lyrical — 1년에 한 번씩 LTS

2.1 ROS 1에서 ROS 2로 — 왜 옮겼나

ROS 1은 2007년 Willow Garage에서 시작해서 학계·연구의 사실상 표준이 됐다. 하지만 한계가 있었다.

ROS 2는 이걸 처음부터 다시 설계했다.

2025년 5월 ROS 1 Noetic이 EOL을 맞으면서, ROS 1 시대는 공식적으로 끝났다.

2.2 ROS 2 LTS 케이던스 — May Day 릴리스

ROS 2는 매년 5월(우분투 LTS 출시 직후)에 새 배포판을 낸다. 짝수 해는 5년 LTS, 홀수 해는 2년 비-LTS다.

코드네임출시EOL우분투비고
Foxy Fitzroy2020.062023.0622.04첫 LTS
Galactic Geochelone2021.052022.1220.04비-LTS
Humble Hawksbill2022.052027.0522.04LTS, 가장 널리 쓰임
Iron Irwini2023.052024.1222.04비-LTS
Jazzy Jalisco2024.052029.0524.04LTS
Kilted Kaiju2025.052026.1224.04비-LTS
Lyrical Luth2026.052031.0526.04 (예상)LTS, 예정

2026년 5월 현재는 Jazzy(프로덕션)Kilted(최신) 가 주력이고, Lyrical Luth가 곧 나올 예정이다. 새 프로젝트는 Jazzy로 시작하는 것이 무난하다.

2.3 ROS 2 핵심 개념 — 5분 복습

# Python rclpy 노드 예시
import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class HelloPublisher(Node):
    def __init__(self):
        super().__init__('hello_publisher')
        self.publisher = self.create_publisher(String, 'greetings', 10)
        self.timer = self.create_timer(1.0, self.tick)

    def tick(self):
        msg = String()
        msg.data = 'Hello, ROS 2 Jazzy'
        self.publisher.publish(msg)
        self.get_logger().info(f'Published: {msg.data}')

def main():
    rclpy.init()
    node = HelloPublisher()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

핵심 4가지 통신 방식:

  1. Topic — pub/sub, 비동기 스트림 (센서 데이터·이미지).
  2. Service — 동기 RPC, 짧은 요청/응답 (파라미터 조회).
  3. Action — 장기 작업, 피드백·취소 가능 (내비게이션·픽업).
  4. Parameter — 노드 설정값, 런타임 변경 가능.

2.4 빌드 시스템 — colcon

ROS 2의 빌드는 colcon이다. 워크스페이스 패턴은 다음과 같다.

# 워크스페이스 만들기
mkdir -p ros2_ws/src
cd ros2_ws

# src 안에 패키지 클론
cd src
git clone https://github.com/ros-planning/navigation2.git -b jazzy
cd ..

# 의존성 설치
rosdep install --from-paths src --ignore-src -r -y

# 빌드 (병렬, symlink로 빠른 개발 반복)
colcon build --symlink-install --parallel-workers $(nproc)

# 환경 소싱
source install/setup.bash

2.5 변경된 것들 — Jazzy → Kilted → Lyrical 이행 노트

Jazzy 이후 주요 변화:


3장 · Nav2 (Steve Macenski) — 내비게이션 스택

3.1 Nav2가 뭔가

Nav2(Navigation 2) 는 ROS 1의 move_base를 ROS 2로 재설계한 내비게이션 스택이다. Samsung Research America 출신의 Steve Macenski가 메인테이너이고, 현재 Open Navigation LLC를 통해 컨설팅한다.

Nav2는 다음을 한 묶음으로 제공한다.

3.2 Behavior Tree로 내비게이션 흐름 정의

Nav2의 가장 큰 특징은 Behavior Tree(BT) 다. 내비게이션 전체 흐름을 XML로 정의한다.

<!-- navigate_to_pose_w_replanning_and_recovery.xml -->
<root main_tree_to_execute="MainTree">
  <BehaviorTree ID="MainTree">
    <RecoveryNode number_of_retries="6" name="NavigateRecovery">
      <PipelineSequence name="NavigateWithReplanning">
        <RateController hz="1.0">
          <RecoveryNode number_of_retries="1" name="ComputePathToPose">
            <ComputePathToPose goal="{goal}" path="{path}" planner_id="GridBased"/>
            <ReactiveFallback name="ComputePathToPoseRecoveryFallback">
              <GoalUpdated/>
              <ClearEntireCostmap name="ClearGlobalCostmap-Context" service_name="global_costmap/clear_entirely_global_costmap"/>
            </ReactiveFallback>
          </RecoveryNode>
        </RateController>
        <RecoveryNode number_of_retries="1" name="FollowPath">
          <FollowPath path="{path}" controller_id="FollowPath"/>
          <ReactiveFallback name="FollowPathRecoveryFallback">
            <GoalUpdated/>
            <ClearEntireCostmap name="ClearLocalCostmap-Context" service_name="local_costmap/clear_entirely_local_costmap"/>
          </ReactiveFallback>
        </RecoveryNode>
      </PipelineSequence>
      <ReactiveFallback name="RecoveryFallback">
        <GoalUpdated/>
        <RoundRobin name="RecoveryActions">
          <Sequence name="RecoveryActionsSequence">
            <ClearEntireCostmap name="ClearingActions" service_name="global_costmap/clear_entirely_global_costmap"/>
            <Spin spin_dist="1.57"/>
            <Wait wait_duration="5"/>
            <BackUp backup_dist="0.30" backup_speed="0.05"/>
          </Sequence>
        </RoundRobin>
      </ReactiveFallback>
    </RecoveryNode>
  </BehaviorTree>
</root>

BT의 장점: 코드 수정 없이 XML만 바꾸면 행동을 재구성할 수 있다. 디버깅도 시각화하기 쉽다(Groot 같은 도구).

3.3 MPPI Controller — 2024년의 표준

Nav2의 로컬 컨트롤러는 여러 가지지만, 2024년 이후 사실상 표준이 된 것이 MPPI(Model Predictive Path Integral) Controller 다. 샘플링 기반 MPC로, 수천 개의 trajectory를 평행하게 시뮬레이션해서 비용이 가장 낮은 것을 고른다.

# nav2_params.yaml (MPPI 일부)
controller_server:
  ros__parameters:
    controller_plugins: ["FollowPath"]
    FollowPath:
      plugin: "nav2_mppi_controller::MPPIController"
      time_steps: 56
      model_dt: 0.05
      batch_size: 2000
      vx_std: 0.2
      vy_std: 0.2
      wz_std: 0.4
      vx_max: 0.5
      vx_min: -0.35
      vy_max: 0.5
      wz_max: 1.9
      iteration_count: 1
      prune_distance: 1.7
      transform_tolerance: 0.1
      temperature: 0.3
      gamma: 0.015
      motion_model: "DiffDrive"
      visualize: false
      critics:
        - "ConstraintCritic"
        - "ObstaclesCritic"
        - "GoalCritic"
        - "GoalAngleCritic"
        - "PathAlignCritic"
        - "PathFollowCritic"
        - "PathAngleCritic"
        - "PreferForwardCritic"

DWB나 Regulated Pure Pursuit보다 회피·코너링이 자연스럽고, GPU 가속을 받으면 더 빨라진다. 단점은 튜닝할 파라미터가 많다.

3.4 SLAM — Nav2와 함께 쓰는 두 가지

지도가 없는 환경에서는 SLAM을 같이 돌린다.

# SLAM Toolbox 비동기 모드 실행 (지도 만들기)
ros2 launch slam_toolbox online_async_launch.py \
  params_file:=./config/mapper_params_online_async.yaml \
  use_sim_time:=true

# 지도 저장
ros2 service call /slam_toolbox/save_map slam_toolbox/srv/SaveMap "{name: {data: 'my_map'}}"

4장 · MoveIt 2 — 모션 플래닝

4.1 MoveIt이 뭘 하나

MoveIt은 로봇 팔(매니퓰레이터)을 위한 모션 플래닝 프레임워크다. 입력은 "엔드 이펙터를 (x, y, z, roll, pitch, yaw) 위치로 보내라" 같은 목표이고, 출력은 충돌 없이 그 위치에 도달하는 관절 궤적이다.

내부적으로는 다음을 한다.

  1. IK(Inverse Kinematics) — 목표 자세에서 관절 각도 풀이.
  2. 충돌 검사 — 자기 충돌 + 환경 충돌.
  3. 궤적 계획 — OMPL/STOMP/CHOMP/Pilz 같은 알고리즘.
  4. 궤적 실행ros2_control 위에서 컨트롤러에 보냄.

4.2 MoveIt Setup Assistant

새 로봇을 MoveIt에 붙이는 시작점은 Setup Assistant GUI다.

ros2 launch moveit_setup_assistant setup_assistant.launch.py

URDF/Xacro를 로드하면 GUI에서:

결과로 moveit_config 패키지가 만들어진다.

4.3 MoveIt 2 코드 예시 — pick & place

# Python MoveIt 2 (moveit_py)
import rclpy
from moveit.planning import MoveItPy
from geometry_msgs.msg import PoseStamped

def main():
    rclpy.init()
    moveit = MoveItPy(node_name="moveit_py_demo")
    arm = moveit.get_planning_component("manipulator")

    target_pose = PoseStamped()
    target_pose.header.frame_id = "base_link"
    target_pose.pose.position.x = 0.4
    target_pose.pose.position.y = 0.1
    target_pose.pose.position.z = 0.5
    target_pose.pose.orientation.w = 1.0

    arm.set_start_state_to_current_state()
    arm.set_goal_state(pose_stamped_msg=target_pose, pose_link="tool0")
    plan_result = arm.plan()

    if plan_result:
        robot_trajectory = plan_result.trajectory
        moveit.execute(robot_trajectory, controllers=[])
    else:
        print("Planning failed")

    moveit.shutdown()
    rclpy.shutdown()

if __name__ == "__main__":
    main()

C++ API는 MoveGroupInterface가 가장 흔하다. 둘 다 동일한 백엔드(OMPL)를 호출한다.

4.4 OMPL vs STOMP vs Pilz

플래너종류강점약점
OMPL (RRTConnect, PRM)샘플링고차원 잘함경로가 들쭉날쭉, 후처리 필요
STOMP최적화부드러운 경로초기 솔루션 필요, 느림
CHOMP최적화부드러움지역 최적해
Pilz Industrial Motion Planner결정적LIN/CIRC/PTP, 산업용일반 모션 어려움

기본은 RRTConnect로 시작하고, 산업용 반복 동작은 Pilz를 쓴다.

4.5 ros2_control과의 연결

MoveIt 2는 계획만 하고 실행은 ros2_control이 한다. 둘 사이에 JointTrajectoryController가 표준이다.

# controller_manager 설정
controller_manager:
  ros__parameters:
    update_rate: 100
    joint_trajectory_controller:
      type: joint_trajectory_controller/JointTrajectoryController

joint_trajectory_controller:
  ros__parameters:
    joints:
      - shoulder_pan_joint
      - shoulder_lift_joint
      - elbow_joint
      - wrist_1_joint
      - wrist_2_joint
      - wrist_3_joint
    command_interfaces:
      - position
    state_interfaces:
      - position
      - velocity

5장 · Gazebo Harmonic — 시뮬레이터의 표준

5.1 Gazebo Classic의 죽음과 New Gazebo의 탄생

ROS 사용자에게 익숙한 "Gazebo"는 두 가지 다른 소프트웨어다.

2026년 현재 새 프로젝트는 무조건 New Gazebo Harmonic(2023.09 LTS, 2028까지 지원) 이다.

5.2 Gazebo Harmonic의 특징

5.3 SDF 월드 예시

<?xml version="1.0"?>
<sdf version="1.10">
  <world name="warehouse">
    <physics name="1ms" type="ignored">
      <max_step_size>0.001</max_step_size>
      <real_time_factor>1.0</real_time_factor>
    </physics>

    <plugin filename="gz-sim-physics-system" name="gz::sim::systems::Physics"/>
    <plugin filename="gz-sim-sensors-system" name="gz::sim::systems::Sensors">
      <render_engine>ogre2</render_engine>
    </plugin>
    <plugin filename="gz-sim-scene-broadcaster-system" name="gz::sim::systems::SceneBroadcaster"/>

    <include>
      <uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Sun</uri>
    </include>
    <include>
      <uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Ground Plane</uri>
    </include>

    <include>
      <name>turtlebot</name>
      <pose>0 0 0.1 0 0 0</pose>
      <uri>https://fuel.gazebosim.org/1.0/OpenRobotics/models/Turtlebot4</uri>
    </include>
  </world>
</sdf>

5.4 ros_gz_bridge로 ROS 2 토픽 연결

Gazebo 토픽은 Gazebo Transport(별도 미들웨어)를 쓰고, ROS 2는 DDS를 쓴다. 둘을 잇는 게 ros_gz_bridge다.

# /cmd_vel을 양방향으로 매핑
ros2 run ros_gz_bridge parameter_bridge \
  /cmd_vel@geometry_msgs/msg/Twist@gz.msgs.Twist \
  /odom@nav_msgs/msg/Odometry[gz.msgs.Odometry \
  /scan@sensor_msgs/msg/LaserScan[gz.msgs.LaserScan

5.5 한계 — 왜 Isaac Sim이 같이 등장했나

Gazebo Harmonic은 훌륭하지만, 한계가 있다.

이 빈자리를 NVIDIA Isaac Sim이 채운다.


6장 · Isaac Sim 5.0 (NVIDIA Omniverse) + Isaac ROS

6.1 Isaac Sim이 다른 점

NVIDIA Isaac Sim은 Omniverse 위에 만들어진 로봇 시뮬레이터다. 2026년 1월에 Isaac Sim 5.0이 나왔고, 핵심 특징은 다음과 같다.

6.2 Isaac Lab 강화학습 코드 (간단 예시)

# Isaac Lab으로 Cartpole RL 환경 만들기 (개념 코드)
from omni.isaac.lab.envs import ManagerBasedRLEnv
from omni.isaac.lab.scene import InteractiveSceneCfg
from omni.isaac.lab.assets import ArticulationCfg
from omni.isaac.lab.terrains import TerrainImporterCfg

class CartpoleSceneCfg(InteractiveSceneCfg):
    cartpole = ArticulationCfg(
        prim_path="/World/envs/env_.*/Cartpole",
        usd_path="omniverse://localhost/NVIDIA/Assets/Robots/Cartpole/cartpole.usd",
    )

env_cfg = ManagerBasedRLEnvCfg(
    scene=CartpoleSceneCfg(num_envs=4096, env_spacing=4.0),
    sim={"dt": 1/120, "device": "cuda:0"},
)

env = ManagerBasedRLEnv(cfg=env_cfg)

# PPO로 학습
from skrl.agents.torch.ppo import PPO
agent = PPO(models=..., memory=..., cfg={"learning_epochs": 8})
agent.train(env, timesteps=1_000_000)

4096개 평행 환경을 RTX 4090 한 장에서 돌리면, 며칠 만에 정책이 학습된다. Gazebo에서는 같은 일을 하려면 수십 대의 CPU 서버가 필요하다.

6.3 Isaac ROS — NVIDIA의 ROS 2 가속기

Isaac ROS는 Isaac Sim과 별개로, NVIDIA가 ROS 2 패키지를 CUDA로 가속한 모음이다.

패키지기능가속
isaac_ros_visual_slamRGB-D 비주얼 SLAMGPU
isaac_ros_nvblox3D 재구성·점유 그리드GPU
isaac_ros_apriltagAprilTag 검출GPU
isaac_ros_centerpose6DOF 자세 추정TensorRT
isaac_ros_dnn_image_encoder카메라→ML 전처리GPU

Jetson Orin·Thor 보드에 최적화돼 있어서, 같은 인식 파이프라인이 CPU 대비 10~30배 빠르다.

6.4 OpenUSD가 로보틱스에 들어오다

OpenUSD(Universal Scene Description) 는 픽사가 만들고 2023년 AOUSD(Alliance for OpenUSD)로 표준화된 씬 기술 포맷이다. 영화·게임에서 출발했지만, NVIDIA가 로보틱스의 표준으로 밀고 있다.

URDF/SDF는 로봇 한 대를 정의하는 데에는 충분하지만, 공장·도시 같은 큰 환경을 표현하기에는 약하다. USD가 그걸 대체할 가능성이 높다.


7장 · MuJoCo (DeepMind) — 물리 시뮬레이션

7.1 MuJoCo의 역사 — Roboti LLC → DeepMind 인수 → 오픈소스

MuJoCo(Multi-Joint dynamics with Contact) 는 Emo Todorov가 2010년대 초에 만든 물리 엔진이다. 처음에는 유료 상용 소프트웨어였고(Roboti LLC), OpenAI Gym의 일부 환경(Humanoid, HalfCheetah)이 MuJoCo 위에서 돌았다. 학생 라이선스는 있지만 산업용은 비쌌다.

2021년 10월, Google DeepMind가 MuJoCo를 인수해서 완전 무료/오픈소스(Apache 2.0) 로 풀었다. 이게 강화학습·로보틱스 연구의 진입장벽을 크게 낮췄다.

7.2 MuJoCo의 강점

7.3 MJCF 예시 (humanoid)

<mujoco model="humanoid">
  <option timestep="0.005" gravity="0 0 -9.81"/>

  <default>
    <joint armature="1" damping="1" limited="true"/>
    <geom contype="0" conaffinity="0" friction="1 0.1 0.1" rgba="0.7 0.5 0.3 1"/>
  </default>

  <worldbody>
    <light pos="0 0 3" dir="0 0 -1" diffuse="0.7 0.7 0.7"/>
    <geom name="floor" pos="0 0 0" size="10 10 0.1" type="plane" rgba="0.9 0.9 0.9 1"/>

    <body name="torso" pos="0 0 1.4">
      <joint name="root" type="free"/>
      <geom name="torso_geom" type="capsule" fromto="0 -.07 0 0 .07 0" size=".07"/>

      <body name="head" pos="0 0 .19">
        <geom name="head_geom" type="sphere" size=".09"/>
      </body>

      <body name="right_thigh" pos="0 -.1 -.04">
        <joint name="right_hip" type="ball"/>
        <geom name="right_thigh_geom" type="capsule" fromto="0 0 0 0 .01 -.34" size=".06"/>

        <body name="right_shin" pos="0 .01 -.403">
          <joint name="right_knee" type="hinge" axis="0 -1 0" range="-160 -2"/>
          <geom name="right_shin_geom" type="capsule" fromto="0 0 0 0 0 -.3" size=".049"/>
        </body>
      </body>
      <!-- 좌측도 동일 -->
    </body>
  </worldbody>

  <actuator>
    <motor name="right_knee" joint="right_knee" gear="200"/>
  </actuator>
</mujoco>

7.4 MJX — JAX 백엔드로 GPU 가속

2024년에 나온 MJX는 JAX 기반 MuJoCo로, GPU/TPU에서 수만 개 환경을 동시에 시뮬레이션한다. Brax(Google)나 IsaacGym과 같은 카테고리.

import jax
import mujoco
from mujoco import mjx

mj_model = mujoco.MjModel.from_xml_path("humanoid.xml")
mjx_model = mjx.put_model(mj_model)

# 4096개 환경 평행 시뮬레이션
batch_size = 4096
keys = jax.random.split(jax.random.PRNGKey(0), batch_size)

@jax.jit
@jax.vmap
def reset(key):
    data = mjx.make_data(mjx_model)
    return data

@jax.jit
@jax.vmap
def step(data, action):
    data = data.replace(ctrl=action)
    data = mjx.step(mjx_model, data)
    return data

batch_data = reset(keys)
actions = jax.numpy.zeros((batch_size, mj_model.nu))

for _ in range(1000):
    batch_data = step(batch_data, actions)

7.5 MuJoCo Menagerie — 공식 로봇 컬렉션

DeepMind가 유지하는 MuJoCo Menagerie 리포에 산업용 로봇들의 검증된 MJCF가 있다.

이걸 그대로 가져다 강화학습이나 모방학습 시뮬레이션에 쓸 수 있다.


8장 · Webots (Cyberbotics) — 가벼운 대안

8.1 Webots의 자리

Webots는 스위스 Cyberbotics가 1996년부터 개발해온 로봇 시뮬레이터다. 2018년에 Apache 2.0 라이선스로 오픈소스화됐다.

Gazebo·Isaac Sim·MuJoCo가 있는데 왜 Webots를 쓰나?

8.2 Webots 컨트롤러 예시

# Webots Python 컨트롤러
from controller import Robot

TIME_STEP = 32
MAX_SPEED = 6.28

robot = Robot()
left_motor = robot.getDevice("left wheel motor")
right_motor = robot.getDevice("right wheel motor")
left_motor.setPosition(float('inf'))
right_motor.setPosition(float('inf'))

ds_left = robot.getDevice("ds_left")
ds_right = robot.getDevice("ds_right")
ds_left.enable(TIME_STEP)
ds_right.enable(TIME_STEP)

while robot.step(TIME_STEP) != -1:
    left = ds_left.getValue()
    right = ds_right.getValue()
    if left < 100:
        left_motor.setVelocity(-MAX_SPEED * 0.5)
        right_motor.setVelocity(MAX_SPEED * 0.5)
    elif right < 100:
        left_motor.setVelocity(MAX_SPEED * 0.5)
        right_motor.setVelocity(-MAX_SPEED * 0.5)
    else:
        left_motor.setVelocity(MAX_SPEED)
        right_motor.setVelocity(MAX_SPEED)

8.3 어디서 어떤 시뮬레이터를 쓸까

용도추천
학습·튜토리얼·교육Webots
산업용 모바일 로봇 (ROS 2 통합)Gazebo Harmonic
강화학습·휴머노이드·합성 데이터Isaac Sim 5.0
조작·손재주·접촉이 많은 작업MuJoCo
빠른 평행 RLMJX 또는 Isaac Lab
멀티 로봇·드론 군집Gazebo + Zenoh

9장 · Hugging Face LeRobot (2024.10) — 로보틱스 ML 민주화

9.1 LeRobot이 등장한 배경

2024년 10월, Hugging Face가 LeRobot을 발표했다. 캐치프레이즈는 "Robotics for everyone". 핵심은 다음을 한 묶음으로 제공하는 것이다.

핵심은 PyTorch + Hugging Face 생태계와의 완전 통합이다. NLP에서 Transformers가 한 일을 로보틱스에서 하려고 한다.

9.2 LeRobot 데이터 파이프라인

# LeRobot 데이터셋 로드
from lerobot.common.datasets.lerobot_dataset import LeRobotDataset

dataset = LeRobotDataset("lerobot/aloha_static_coffee")
print(dataset.meta.info)

# 한 에피소드 가져오기
episode = dataset[0]
print(episode["observation.image.cam_high"].shape)
print(episode["action"].shape)

9.3 ACT 모방학습 학습

ACT(Action Chunking Transformer)는 Stanford Mobile Aloha 팀이 만든 모방학습 베이스라인. LeRobot 안에서 바로 학습 가능.

# SO-100 팔로 데이터 수집
python lerobot/scripts/control_robot.py record \
  --robot.type=so100 \
  --control.type=record \
  --control.fps=30 \
  --control.repo_id=youngju/so100_pick_and_place \
  --control.num_episodes=50 \
  --control.warmup_time_s=5 \
  --control.episode_time_s=30 \
  --control.push_to_hub=true

# ACT 정책 학습
python lerobot/scripts/train.py \
  policy=act \
  dataset_repo_id=youngju/so100_pick_and_place \
  env=so100 \
  training.offline_steps=80_000 \
  training.batch_size=32 \
  training.lr=1e-4

# 실제 로봇에서 평가
python lerobot/scripts/eval.py \
  -p youngju/so100_pick_and_place_act \
  eval.n_episodes=10

9.4 SO-100 — $200대로 시작하는 로봇 학습

SO-100(원래 The Robot Studio 설계)은 5DOF 데스크탑 팔로, 부품 비용이 $200~300대다. 3D 프린트 가능한 부품 + Dynamixel(Robotis) 또는 Feetech 서보로 구성된다. LeRobot에 SO-100/101 드라이버가 기본 포함돼 있어서, 데이터 수집·학습·실행 사이클을 집에서 돌릴 수 있다.

이게 LeRobot의 진짜 영향이다. NLP가 ChatGPT API 전에 비싸고 어려웠던 것처럼, 로보틱스도 산업용 팔 한 대 $50K짜리 위에서만 연구할 수 있었다. 이제 그게 $300으로 내려왔다.


10장 · NVIDIA GR00T — 휴머노이드 foundation model

10.1 Project GR00T의 시작

2024년 3월 GTC에서 젠슨 황이 발표한 Project GR00T(Generalist Robot 00 Technology) 는 NVIDIA의 휴머노이드 파운데이션 모델 프로젝트다. 한 단어로: "휴머노이드용 GPT".

이 프로젝트는 세 가지를 묶는다.

  1. GR00T N1 (2025.03) — 17B 파라미터 VLA, 처음 공개된 가중치 모델.
  2. Isaac Lab + Cosmos — 시뮬레이션·합성 데이터 생성.
  3. Jetson Thor — 휴머노이드 탑재용 추론 SoC, 2025년 출시.

10.2 GR00T N1 아키텍처

GR00T N1의 핵심은 System 1 / System 2 듀얼 모드다(카네만의 개념을 직접 차용).

둘 사이는 token cross-attention으로 연결된다. 사람이 공을 잡을 때 "공이 떨어진다 → 손을 뻗는다"는 느린 계획(System 2)과 손가락 미세 조정(System 1)이 동시에 일어나는 것과 같다.

10.3 GR00T 데이터 피라미드

NVIDIA의 데이터 전략:

        실제 로봇 시연 (수십~수백 시간)
            ↑   (가장 적음, 가장 비쌈)
            |
        Tele-op (Apple Vision Pro 같은 VR)
            |
        시뮬레이션 (Isaac Sim 평행 환경)
            |
        Cosmos 합성 비디오 (수백만 시간)
            |   (가장 많음, 가장 쌈)
        인터넷 비디오·문서

위에서 아래로 갈수록 양이 적고 품질이 높다. GR00T는 인터넷 비디오로 사전학습하고, Cosmos로 합성 데이터를 증강하고, Isaac Sim에서 RL로 미세조정하고, 마지막으로 실제 시연으로 finetune한다.

10.4 GR00T 추론 코드 (개념)

# GR00T 추론 (개념적 인터페이스)
from gr00t import GR00TPolicy

policy = GR00TPolicy.from_pretrained("nvidia/gr00t-n1")

observation = {
    "video.image_left": ...,    # 좌측 카메라
    "video.image_right": ...,   # 우측 카메라
    "state.joint_pos": ...,     # 28 DOF 휴머노이드
    "language.instruction": "Pick up the red block and place it on the shelf"
}

# System 2가 5Hz로 계획, System 1이 50Hz로 액션
for t in range(simulation_steps):
    action = policy.predict(observation)  # 28D 액션 벡터
    new_observation = robot.step(action)
    observation = new_observation

10.5 다른 휴머노이드 파운데이션 모델들


11장 · VLA 모델 — RT-2, OpenVLA, π0

11.1 VLA란

VLA(Vision-Language-Action) 모델은 입력으로 이미지(V) + 언어 명령(L)을 받아서, 출력으로 액션(A) 토큰을 내는 모델이다. LLM의 next-token prediction 패턴을 그대로 액션에 적용한 것.

[ Image frames ] → vision encoder ─┐
[ "Pick up apple" ] → tokenizer ───┼→ Transformer → [ action tokens ]
[ Robot state ] → projector ───────┘                       │
                                                  [ dx, dy, dz, gripper ]

11.2 RT-2 (2023.07) — 첫 시그널

Google DeepMind의 RT-2는 VLM(PaLI-X 55B, PaLM-E 12B)에 RT-1의 로봇 데이터를 추가 학습한 것. 핵심은 액션을 토큰으로 표현해서 LLM의 vocabulary에 추가한 것이다.

처음 보는 객체(사라진 동물 카드), 처음 보는 명령("강아지 그림을 옮겨라")에도 일반화된 게 충격이었다.

11.3 OpenVLA (2024.06) — 첫 오픈소스 VLA

Stanford·UC Berkeley·Toyota Research가 OpenVLA(7B) 를 발표. Prismatic VLM 기반.

from transformers import AutoModelForVision2Seq, AutoProcessor
from PIL import Image
import torch

processor = AutoProcessor.from_pretrained("openvla/openvla-7b", trust_remote_code=True)
vla = AutoModelForVision2Seq.from_pretrained(
    "openvla/openvla-7b",
    attn_implementation="flash_attention_2",
    torch_dtype=torch.bfloat16,
    trust_remote_code=True
).to("cuda:0")

image = Image.open("camera_view.png")
prompt = "In: What action should the robot take to pick up the cup?\nOut:"
inputs = processor(prompt, image).to("cuda:0", dtype=torch.bfloat16)

action = vla.predict_action(**inputs, unnorm_key="bridge_orig", do_sample=False)
print(action)  # [dx, dy, dz, droll, dpitch, dyaw, gripper]

11.4 π0 (Physical Intelligence, 2024.10)

Physical Intelligence(PI) 는 Sergey Levine·Chelsea Finn 등이 창업한 스타트업. π0(pi-zero) 는 7B 파라미터의 Flow Matching 기반 VLA.

핵심 혁신은 action chunking + flow matching:

# π0 추론 의사 코드
from openpi.models.pi0 import Pi0Policy

policy = Pi0Policy.from_checkpoint("pi0_base")
action_chunk = policy.sample_action(
    images={"primary": img1, "wrist": img2},
    instruction="Fold the blue shirt",
    state=robot_state,
)
# action_chunk: shape [50, action_dim]
for action in action_chunk:
    robot.execute(action)

2025년 4월 PI는 π0.5와 π1을 공개했고, 가중치 일부는 Hugging Face에 올라와 있다.

11.5 VLA 모델 비교

모델개발자파라미터데이터오픈
RT-2Google DeepMind55B (PaLI-X)RT-1 + 웹비공개
OpenVLAStanford/Berkeley7BOXE 970K완전 공개
π0Physical Intelligence7BOXE + 자체부분 공개
GR00T N1NVIDIA17B합성+실데이터가중치 공개
Figure HelixFigure AI비공개자체 데이터비공개
Tesla OptimusTesla비공개자체 데이터비공개

11.6 한계와 다음 단계

VLA가 다 푸는 건 아니다. 2026년 현재의 한계:

  1. 장기 horizon 작업 — 30초 이상 작업이 어려움. 계획(System 2)이 약함.
  2. 데이터 효율 — 새 작업에 수십~수백 시연이 필요. one-shot은 멀었다.
  3. 안전 보장 — 신경망 정책의 안전성을 형식적으로 보증하기 어려움.
  4. 하드웨어-소프트웨어 결합 — 같은 모델이 다른 로봇에서 잘 안 됨.

12장 · Foxglove Studio — 데이터 시각화

12.1 RViz2의 한계, Foxglove의 등장

ROS 2의 기본 시각화 도구는 RViz2다. 충분히 강력하지만 한계가 있다.

Foxglove Studio는 2021년 Cruise 출신들이 창업한 회사가 만든 멀티 프로토콜 시각화 도구다.

12.2 MCAP — 새 로그 표준

MCAP(Message Capture)는 Foxglove가 만든 로그 컨테이너 포맷. ROS 2 Jazzy부터 rosbag2의 기본 저장 포맷이 MCAP로 바뀌었다.

특징:

# rosbag2를 MCAP으로 녹화 (Jazzy 기본)
ros2 bag record -a -s mcap -o my_session

# MCAP 정보 조회
mcap info my_session/my_session_0.mcap

# 변환
mcap convert old.bag new.mcap

12.3 Foxglove에서 데이터 보기

# 데스크탑 앱에서 라이브 ROS 2 토픽 보기
# - Foxglove Studio 실행
# - + Add connection → ROS 2 → 자동 발견

# 또는 웹에서 MCAP 파일 드래그앤드롭
# https://app.foxglove.dev

협업에서 강한 점: 팀원이 같은 MCAP을 열고, 같은 시점에서 같은 패널 레이아웃을 본다. Pull Request에 "이 버그는 t=23.4s에 발생"이라고 링크를 붙일 수 있다.

12.4 PlotJuggler — 신호 분석

수치 데이터(센서·컨트롤러 출력) 시계열 분석은 PlotJuggler가 가장 편하다.

sudo apt install ros-jazzy-plotjuggler-ros
ros2 run plotjuggler plotjuggler

CSV·rosbag2·MCAP·라이브 토픽 모두 드래그앤드롭으로 플롯할 수 있고, 수식으로 새 채널 만들기·필터링이 쉽다.


13장 · 한국·일본 로보틱스 — 산업 강국에서 휴머노이드까지

13.1 한국 — 현대차의 Boston Dynamics 베팅

2021년 12월, 현대자동차그룹이 SoftBank Group으로부터 Boston Dynamics를 11억 달러에 인수했다. 당시는 비싸다는 평가가 많았지만, 휴머노이드 붐과 함께 그 베팅의 의미가 명확해졌다.

한국의 다른 플레이어:

13.2 일본 — 산업용 로봇의 오랜 강국

일본은 1980년대부터 산업용 로봇 세계 1위였다. 2026년에도 그 위치는 변하지 않았다.

산업용 로봇 4대 천왕 (2026):

서비스·휴머노이드 쪽:

13.3 두 나라 로보틱스의 다른 결

한국일본
강점휴머노이드(BD), cobot(두산), 모터(Robotis)산업용 팔(FANUC, Yaskawa), 정밀 모터, 자동차
약점산업용 표준 시장 진입 늦음휴머노이드·AI 통합 느림
R&D정부 주도, 대기업 중심기업 주도, 장인 문화
AI 통합빠름 (LLM·VLA 빠르게 채택)보수적

2026년의 흥미로운 동향: 현대-Boston Dynamics-Hyundai Mobis-Hyundai Wia 라인이 미국 빅테크(Tesla, Figure) 와 정면 경쟁할 수 있는 거의 유일한 비-미국 진영이 됐다는 것. 일본은 산업용에서는 여전히 강하지만, 휴머노이드·VLA 경쟁에서는 따라가는 입장.

13.4 학습 자원


14장 · 참고 / References

ROS 2 공식 / Nav2 / MoveIt

시뮬레이션

VLA / 파운데이션 모델

시각화 / 데이터

휴머노이드 플랫폼

한국 / 일본


마치며 — 로보틱스는 진짜로 변하는 중이다

2020년의 로보틱스 개발은 "ROS 1 + Gazebo Classic + 손으로 짠 컨트롤러 + 박사 학위"였다. 진입장벽이 박사 학위였다.

2026년의 로보틱스 개발은 "ROS 2 Jazzy + Isaac Sim/MuJoCo + LeRobot에서 가져온 VLA + $300 SO-100"이다. 진입장벽이 노트북과 호기심이다.

이 변화의 추진력 세 가지:

  1. 시뮬레이션의 성숙 — Isaac Sim·MuJoCo·Gazebo Harmonic이 무료로 산업급 품질을 제공.
  2. VLA의 등장 — 손으로 짜던 인식·계획·제어가 한 모델로 통합.
  3. 민주화 — LeRobot이 데이터·모델·하드웨어를 한 묶음으로 공개.

이게 정말로 휴머노이드를 우리 집에 데려올지, 아니면 또 한 번의 "5년 안에 자율주행" 같은 과대선전일지는 2027~2028년이 답을 줄 것이다. 하지만 한 가지는 분명하다 — 2026년은 1년 전과 비교할 수 없는 도구 더미를 가진 채로 그 답을 기다린다.

ROS 2를 깔고, MuJoCo로 한 번 시뮬레이션을 돌려보고, LeRobot의 ACT 튜토리얼을 한 번 따라가 보자. 그게 2026년 로보틱스에 발을 들이는 가장 가벼운 방법이다.

댓글

아직 댓글이 없습니다.

로그인하면 댓글을 쓸 수 있습니다