# 움직임(Motion)과 상호작용(Interaction) 체계

#### Isaac Sim의 좌표계와 변환 이해

Isaac Sim에서 움직임을 정의하거나 상호작용을 구현하려면 우선 좌표계에 대한 이해가 필요하다. Isaac Sim 내부 객체의 위치와 자세는 일반적으로 월드(World) 좌표계를 기준으로 표현된다. 원하는 객체의 위치를 정의하기 위해서는 객체가 가진 고유한 로컬(Local) 좌표계와 상위(parent) 좌표계, 그리고 월드 좌표계 사이의 변환 관계를 활용해야 한다.

좌표계 변환은 주로 4×4 동차변환 행렬을 통해 표현된다. 어떤 객체 A의 로컬 좌표계에서의 위치가 벡터 $\mathbf{x}*{A}$라고 할 때, 이를 월드 좌표계로 변환한 벡터 $\mathbf{x}*{W}$는 다음과 같이 표현할 수 있다.

$$
\begin{align} \mathbf{x}*{W} = {^{W}\mathbf{T}*{A}} \mathbf{x}\_{A} \end{align}
$$

여기서 ${^{W}\mathbf{T}\_{A}}$는 월드 좌표계에서 객체 A의 좌표계로 가는 동차변환 행렬이다. 마찬가지로 객체 A의 자식 객체 B가 있을 때, 다음과 같은 형태로도 확장할 수 있다.

$$
\begin{align} {^{W}\mathbf{T}*{B}} = {^{W}\mathbf{T}*{A}} {^{A}\mathbf{T}\_{B}} \end{align}
$$

이는 계층적(트리) 구조로 좌표 변환을 쉽게 계산할 수 있게 해준다. Isaac Sim에서는 이러한 변환이 빠르게 계산되도록 설계되어 있으며, UI 상에서 Transform 위젯을 통해 직관적으로 확인할 수 있다.

#### 조인트와 아티큘레이션(Articulation)

Isaac Sim에서 로봇 모델이나 멀티 조인트 물체를 효율적으로 다루기 위해서는 아티큘레이션(Articulation) 기능을 사용한다. 아티큘레이션은 다수의 링크(link)와 조인트(joint)로 구성되며, 동역학 시뮬레이션을 수행할 때 일체로 취급된다. 예를 들어 로봇팔은 여러 회전 또는 직선 조인트가 링크와 연결되어 만든 구조이므로 하나의 아티큘레이션이 될 수 있다.

각 조인트는 고유한 자유도(DOF)를 가지며, 이러한 자유도를 통해 실제 움직임을 제어할 수 있다. Isaac Sim의 아티큘레이션 시스템은 시뮬레이션 단계에서 물리 기반(Physics-based) 엔진을 통해 아래와 같은 동역학 방정식을 해결한다.

$$
\begin{align} \mathbf{M}(\mathbf{q}) \ddot{\mathbf{q}} + \mathbf{C}(\mathbf{q}, \dot{\mathbf{q}}) + \mathbf{G}(\mathbf{q}) = \mathbf{\tau} \end{align}
$$

여기서 $\mathbf{q}$는 조인트 위치(일반적으로 각도 또는 변위), $\dot{\mathbf{q}}$는 조인트 속도, $\ddot{\mathbf{q}}$는 조인트 가속도, $\mathbf{M}(\mathbf{q})$는 관성 행렬, $\mathbf{C}(\mathbf{q}, \dot{\mathbf{q}})$는 코리올리 및 원심 항, $\mathbf{G}(\mathbf{q})$는 중력 항, $\mathbf{\tau}$는 조인트에 인가되는 토크(또는 힘)를 의미한다.

Isaac Sim에서 아티큘레이션을 정의하면 이러한 동역학 방정식을 내부적으로 해석적으로 풀어냄과 동시에, 실제 물리 시뮬레이션에 근거하여 링크가 어떻게 움직일지를 결정한다. 따라서 조인트 파라미터만 적절히 설정하면 Isaac Sim 내에서 실제 로봇 혹은 멀티 조인트 물체의 움직임을 사실적으로 구현할 수 있다.

#### 기본 키네마틱스: 순방향 및 역방향

Isaac Sim에서 움직임을 다루는 또 다른 중요한 주제는 키네마틱스(Kinematics)다. 로봇팔과 같은 멀티 조인트 구조물을 다룰 때 일반적으로 순방향(Forward) 키네마틱스와 역방향(Inverse) 키네마틱스가 쓰인다.

순방향 키네마틱스는 각 조인트의 설정값(각도 또는 변위)이 주어졌을 때 말단부(End Effector)의 위치나 자세를 계산한다. 조인트 가중치 벡터를 $\mathbf{q} = \[ q\_1, q\_2, \dots, q\_n ]$라 할 때, 말단부의 위치 $\mathbf{x}$는 다음 형태의 변환으로 나타낼 수 있다.

$$
\begin{align} \mathbf{x} = f(\mathbf{q}) \end{align}
$$

일반적으로 $f(\mathbf{q})$는 트랜스포메이션 행렬 곱의 결과로 나타나며, 로봇에 따라 특정 해석적 수식이 알려져 있는 경우도 있지만 Isaac Sim에서는 내부적으로 아티큘레이션 노드가 이를 계산해주는 기능이 있다.

역방향 키네마틱스는 목표 위치나 자세 $\mathbf{x}\_{d}$가 주어졌을 때, 이를 만족하는 조인트 변수를 구하는 문제다.

$$
\begin{align} \mathbf{q}^\* = f^{-1}(\mathbf{x}\_{d}) \end{align}
$$

이때 $f^{-1}$가 유일하게 존재하지 않거나 해가 여러 개인 경우가 많다. Isaac Sim에서는 IK 솔버(예: Jacobian 기반 알고리즘) 등을 활용해 이를 수치적으로 풀 수도 있다. 키프레임 애니메이션이나 상호작용 시뮬레이션 시, 역키네마틱스를 이용해 원하는 위치에 로봇 손끝을 위치시키는 명령을 간단히 구현할 수 있다.

#### 물리 시뮬레이션과 움직임

Isaac Sim은 물리 기반 엔진을 통해 객체 간 충돌(Collision), 마찰(Friction), 관성(Inertia) 등을 고려해 실시간 혹은 준실시간으로 움직임을 시뮬레이션한다. 물리 기반 시뮬레이션에서 핵심은 물체의 강체(Rigid Body) 특성과 조인트 메커니즘을 정확히 설정하는 것이다.

강체(또는 링크)에 대해서는 질량, 관성 텐서, 모멘트 등이 물리 엔진에 명시된다. Isaac Sim에서는 대부분의 경우 자동 계산 기능을 제공하지만, 복잡한 형상의 관성 텐서를 실제 CAD 데이터에 근거해 직접 지정하거나 URDF, SDF 파일을 통해 설정할 수도 있다.

충돌과 마찰 특성은 각 객체의 충돌 셰이프(Collision Shape)와 재질(Material)로 결정된다. 상호작용 시, 예를 들어 로봇 그리퍼가 물체를 쥘 때에는 마찰력이 충분해야 미끄러지지 않는다. Isaac Sim의 머티리얼(Material) 시스템에서 마찰계수(coefficient of friction) 및 탄성계수(restitution)를 지정해 이러한 상호작용의 물리적 사실성을 높인다.

#### 상호작용 기초: 마우스/키보드/스페이스 내비게이션

Isaac Sim에서 상호작용을 구현하는 가장 간단한 방법은 뷰포트(Viewport)에서 객체를 직접 선택하고 마우스/키보드 입력에 따라 객체의 위치나 회전을 직관적으로 변경하는 것이다. 또한 스페이스 내비게이션(SpaceMouse)과 같은 3D 마우스 장치를 연동해 직관적인 카메라 이동이나 객체 이동을 할 수도 있다.

이 상호작용은 실시간 시뮬레이션 중에도 가능하며, 물리가 활성화되어 있는 상황에서 물체를 직접 드래그하면 물리 엔진이 그에 따른 힘을 계산해 움직임을 갱신한다. 이때 무거운 물체를 실시간으로 움직이면 실제로 관성이 크게 작용하여 급격한 가속이나 회전을 하기 어려운 모습을 볼 수 있는데, 이것이 물리 기반 상호작용의 특징이다.

#### 상호작용 중 충돌과 제약(Constraint)

실시간 상호작용 중에는 물체 간 충돌과 함께 다양한 제약(Constraint)이 작동하기도 한다. Isaac Sim에서는 조인트 외에도 강체를 서로 연결하는 다채로운 제약 조건을 지원한다. 예를 들어 힌지(hinge) 제약, 커플링(coupling) 제약, 6자유도(6-DOF) 제약 등을 통해 두 물체를 특정 방식으로만 움직이게 제한할 수 있다.

외부 힘이나 상호작용이 가해지는 동안에도 이러한 제약이 유지되므로, 예를 들어 문과 경첩(힌지) 연결을 시뮬레이션하거나, 로봇팔에 도구를 고정하여 작업하는 상황을 구성할 수 있다.

#### 상호작용을 위한 도구: Action Graph와 스크립팅

Isaac Sim은 움직임과 상호작용을 프로그래밍 방식으로 제어하기 위해 Action Graph와 Python 스크립팅 기능을 제공한다. Action Graph는 노드 기반(블록 다이어그램 형태)으로 Isaac Sim에서 제공되는 다양한 액션(행동)을 연결해 시뮬레이션 시나리오를 직관적으로 구성하는 도구다. 물리 엔진 제어, 트리거(trigger) 조건, 애니메이션, 월드 속성 변경 등을 노드끼리 연결해 제어할 수 있다.

Python 스크립팅은 그보다 유연성이 높은 API 접근 방법이다. Isaac Sim에서는 Omniverse Kit 확장 모듈 형태로 다양한 파이썬 함수를 제공한다. 움직임을 제어하거나 상호작용 이벤트를 감지하여 후속 동작을 실행할 때, 또는 로봇 제어 알고리즘(IK, Path Planning 등)을 직접 구현해야 할 때 주로 사용한다.

아래 예시는 Python 스크립트를 활용하여 특정 프라이밍된(프리셋) 로봇 팔의 조인트 각도를 변경하는 방법을 단순화해 보여준다.

```python
from omni.isaac.motion import ArticulationController

robot_path = "/World/Robot"
controller = ArticulationController(robot_path)

desired_joint_positions = [0.0, 1.57, 0.0, -1.57, 0.0, 1.0]
controller.set_joint_positions(desired_joint_positions)
```

이러한 방법으로 Isaac Sim 내의 로봇 아티큘레이션을 직접 제어할 수 있으며, 역키네마틱스나 경로 계획 알고리즘을 적용하려면 추가로 Isaac SDK나 자체 IK 솔버를 연결하여 구현하면 된다.

#### 상호작용 시각화 및 UI 확장

상호작용 체계를 시각적으로 표현하기 위해 Isaac Sim에서는 다양한 위젯과 UI 확장 플러그인을 지원한다. 예를 들어 다음 다이어그램을 통해, 사용자가 키보드/마우스/컨트롤러 등으로 입력을 주고, Isaac Sim 내부의 물리 엔진과 아티큘레이션 시스템에서 이를 처리하여 결과를 뷰포트에 시각화하는 과정을 표현할 수 있다.

{% @mermaid/diagram content="flowchart TD
Input(User Input) --> PhysicsEngine(Physics Engine)
PhysicsEngine --> ArticulationSystem(Articulation System)
ArticulationSystem --> Viewport(Rendered View)
Viewport --> Interaction(Interactive Feedback)
Interaction --> Input" %}

이렇게 연결된 구조를 통해 사용자 입력이 물리 및 키네마틱스 엔진으로 전달되고, 실제 물리 법칙에 맞추어 객체의 움직임이 뷰포트에 반영된다. 사용자는 눈으로 그 결과를 확인하면서 추가적인 입력을 주어 상호작용을 반복한다.

#### Isaac Sim에서의 강화학습/AI와의 접목

움직임과 상호작용 체계를 조금 더 확장하면, 강화학습(강화학습 정책 네트워크)이나 AI 기반 에이전트 시스템과 Isaac Sim의 물리 엔진을 연동하여 다양한 로봇 행동 학습을 시도할 수 있다. Isaac Sim은 NVIDIA Isaac Gym, Omniverse Isaac Sim 등과 연동되어 대규모 병렬학습이나 시뮬레이션 기반 자율제어 연구를 지원한다.

심층 강화학습(Deep Reinforcement Learning)을 염두에 두고 Isaac Sim 상에서 에이전트의 상태(state)와 행동(action)을 정의할 수 있으며, 내부적으로 누적 보상 함수를 계산한다. 이러한 학습 루프를 구축하면 시뮬레이션에서 안전하게 로봇의 특정 작업(예: 물체 집기, 조립, 경로 따라가기 등)을 학습시키고, 그 결과를 실제 물리 환경으로 이식(시뮬레이션에서 실제로)할 가능성을 평가할 수 있다.

#### 이벤트 기반 상호작용

Isaac Sim에는 이벤트 기반 프로그래밍 모델도 도입될 수 있다. 이벤트나 트리거를 설정하여 특정 충돌이 감지되었을 때나 객체가 특정 위치에 도달했을 때 자동으로 후속 동작을 실행하게 만들 수 있다. 예를 들어 특정 영역에 오브젝트가 들어오면 이를 감지하고 알람을 울리는 시나리오 등을 구성할 수 있다.

실시간 충돌 이벤트는 PhysX나 다른 물리엔진 내부에서 계산된 충돌 데이터를 Isaac Sim에 제공하여, 이를 스크립트나 Action Graph 노드로 처리한다. 실제로 이벤트가 발생했을 때의 서로 다른 객체와 충돌 지점(Contact Point) 정보를 활용하여 로봇이 즉시 대응하는 상호작용 설계를 할 수 있다.

#### ROS2 연동을 통한 상호작용 확장

Isaac Sim은 Omniverse Isaac ROS 혹은 직접적으로 ROS2 Humble과 연결함으로써 물리 시뮬레이션과 실제 로봇 운영 체제를 결합할 수 있다. 이를 통해 Isaac Sim에서 발생하는 움직임과 상호작용 이벤트를 ROS2 토픽/서비스/액션으로 주고받고, 실환경에 배치된 센서나 컨트롤러와 연동할 수 있다.

ROS2와 Isaac Sim을 연결하면 다음과 같은 작업이 가능해진다.

* 시뮬레이터 내부의 카메라(RGB, Depth)나 LiDAR 센서 데이터를 ROS2 이미지/PointCloud2 메시지로 퍼블리시
* ROS2 액션 서버를 통해 로봇 조인트 제어 명령을 구독하고, 시뮬레이터 측 로봇 아티큘레이션의 조인트 위치 또는 토크를 반영
* MoveIt, Navigation2 등 ROS2 패키지에서 계산된 경로 계획 혹은 내비게이션 결과를 Isaac Sim으로 전달해 가상 로봇을 움직임
* Gazebo나 RViz 대신 Isaac Sim을 활용해 물리 충돌이나 렌더링 퀄리티가 높은 환경에서 로봇 테스트

물리적으로 구현된 로봇과 Isaac Sim 사이를 트윈(Twin) 관계로 설정하여, 실제 로봇에 명령을 내리기 전에 Isaac Sim에서 먼저 안전성 검증을 할 수도 있다. 이 경우 Isaac Sim의 물리 엔진을 통해 예상되는 힘, 토크, 충돌 유무 등을 확인하고, 그 결과를 ROS2에서 처리한 뒤 최종적으로 실제 로봇에 명령을 내리는 절차를 구성한다.

#### ROS2 상호작용 예시: Python 노드에서 시뮬레이션 제어

아래 예시는 Isaac Sim 내부 Python 익스텐션이 아닌, ROS2 노드 관점에서 Isaac Sim에 조인트 명령을 보내는 단순 예시를 보여준다(실제 구현 전송 방식은 Isaac Sim의 ROS Bridge 설정에 따라 달라질 수 있음).

```python
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from std_msgs.msg import Float64MultiArray

class RobotCommander(Node):
    def __init__(self):
        super().__init__('robot_commander')
        self.cmd_pub = self.create_publisher(Float64MultiArray, 'isaac_sim/robot_joint_cmd', 10)
        self.timer = self.create_timer(1.0, self.timer_callback)
        self.angle = 0.0
        self.increment = 0.1

    def timer_callback(self):
        msg = Float64MultiArray()
        # 예시: 1번 조인트만 움직이고 나머지는 0 고정
        self.angle += self.increment
        if self.angle > 1.57 or self.angle < -1.57:
            self.increment = -self.increment
        msg.data = [self.angle, 0.0, 0.0, 0.0, 0.0]
        self.cmd_pub.publish(msg)
        self.get_logger().info(f'Publishing joint command: {msg.data}')

def main(args=None):
    rclpy.init(args=args)
    node = RobotCommander()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()
```

위 코드는 시뮬레이션 측(Isaac Sim)에서 `'isaac_sim/robot_joint_cmd'`라는 토픽을 구독(Sub)하도록 설정해두면, 1초마다 특정 조인트에 대해 부채꼴 형태의 움직임을 반복 명령한다. Isaac Sim 쪽에서는 해당 명령을 받아 Articulation Controller에 대입함으로써 실제 로봇 조인트와 유사한 방식으로 시뮬레이션 객체를 구동할 수 있다.

#### Isaac ROS를 통한 센서 및 AI 활용

NVIDIA Isaac ROS 패키지는 주로 Jetson 플랫폼을 포함한 NVIDIA 하드웨어에서 최적화된 센서 처리와 AI 모델 추론 기능을 제공한다. Isaac Sim은 이와 연동하여, 가상 센서에서 나온 이미지나 LiDAR 데이터를 Isaac ROS 노드로 보내 AI 기반 객체 검출·세그멘테이션·포즈 추정 등을 수행하고, 그 결과를 다시 시뮬레이션 상호작용에 반영할 수 있다.

예컨대 Isaac ROS Gem 중 Stereo Image Processing 모듈이나 DNN Inference 모듈을 Isaac Sim의 시뮬레이션 카메라 영상에 적용해, 특정 객체(예: 픽 앤 플레이스 대상)를 탐지한 뒤 로봇의 그리퍼 위치를 다시 업데이트하는 시나리오를 구현할 수 있다. 이렇게 실제 센서·AI 파이프라인과 유사한 구조를 가상 환경에서 전부 시험한 후, 완성된 스택을 실제 로봇 시스템으로 이전할 수 있다.

#### Force/Torque 기반 접촉 이벤트의 ROS 출력

Isaac Sim에서 발생하는 접촉(Contact)이나 힘·토크 센서 데이터를 ROS2로 퍼블리시할 수도 있다. 예를 들어 로봇팔의 말단(EF)이나 그리퍼에 장착된 가상 Force/Torque 센서 값을 실시간으로 읽어, $\mathbf{f} \in \mathbb{R}^3$ (힘)와 $\mathbf{\tau} \in \mathbb{R}^3$ (토크)를 ROS2 메시지로 보내는 식이다.

동작 단계에서 그리퍼가 대상 물체를 어느 정도의 힘으로 잡고 있는지 모니터링하고 싶을 때, 이 센서 메시지를 토대로 실제 로봇에서 쓰는 그립(force) 조절 로직과 같은 코드를 시뮬레이션에서 재현할 수 있다.

#### Isaac Sim 내 경로 계획과 ROS2 MoveIt 연계

MoveIt은 ROS의 대표적인 로봇 모션 플래닝 라이브러리로, URDF/Robot Description과 함께 로봇 모델을 로딩하여 경로 탐색(OMPL, CHOMP 등)을 수행한다. Isaac Sim에서 로봇 모델을 USD로 다루고 있지만, MoveIt 측에는 URDF/SRDF가 필요하므로 변환 과정을 거친다. 시뮬레이터와 MoveIt 간 상호작용은 다음과 같이 이뤄진다.

1. Isaac Sim에서 로봇의 현재 조인트 상태를 ROS2 토픽 혹은 TF 변환으로 퍼블리시한다.
2. MoveIt 노드는 해당 상태를 로봇의 실제 상태로 인식하고, 목표 위치(말단부 Pose)나 궤적을 설정받는다.
3. MoveIt이 모션 플래닝을 수행하고, 각 조인트의 트래젝터리(trajectory)를 구한다.
4. 이 트래젝터리를 Isaac Sim으로 전송하여, 아티큘레이션 컨트롤러에 순차적으로 명령한다.
5. Isaac Sim은 물리 시뮬레이션으로 경로를 따라 로봇이 움직이는지를 확인하고, 충돌 등이 발생하면 이를 다시 MoveIt으로 알려 재계획(replanning)을 유도할 수 있다.

이 구조 덕분에 Isaac Sim에서 실제 로봇과 동일한 MoveIt 기반 모션 플래닝을 시험할 수 있고, 물리 충돌과 경로 검증을 통해 안전한 움직임을 미리 검증할 수 있다.

#### Isaac Sim과 ROS2 상호작용 성능 이슈

ROS2는 토픽 단위로 통신을 수행하기 때문에, 시뮬레이터 내부 이벤트가 매우 빈번할 경우(예: 60 Hz\~200 Hz 이상의 물리 갱신) 네트워크 트래픽이 커질 수 있다.

* 높은 빈도의 센서 데이터(예: 고해상도 카메라, 3D LiDAR)를 송수신할 때는 QOS 설정, DDS 튜닝, 내부 데이터 압축 등 최적화가 필요하다.
* 반면 저빈도 제어나 이벤트는 표준 QoS(예: Reliable, Best Effort)로도 충분히 처리 가능하다.

실시간 제어가 목적이라면, Isaac Sim 측에서 제한된 주기로만 센서 데이터를 발행하거나 로컬 네트워크 환경에서 DDS 설정을 조율해 지연(Latency)을 줄이는 식으로 설계를 해야 한다. 또한 Isaac Sim의 GUI나 렌더링 모드를 끄고 헤드리스로 구동해 물리 연산에 리소스를 집중함으로써 퍼포먼스를 향상시킬 수 있다.

#### Isaac Sim과 복합 외부 라이브러리 활용

ROS2뿐 아니라, Isaac Sim은 다양한 서드파티 라이브러리나 언어 프레임워크와 연동 가능하다. 예컨대 Python API로 TensorFlow, PyTorch 모델을 불러와 시뮬레이션 중 생성된 이미지에 대해 객체 인식을 수행하고, 결과를 다시 Isaac Sim에 반영할 수 있다. 또는 C++의 최적화 라이브러리를 연결해 경로 최적화, 조인트 궤적 스무딩(smoothing)을 Isaac Sim 환경에서 실시간 적용하는 방법도 가능하다.

#### 스크립트 기반 상호작용 자동화 (Action Graph + Python)

Action Graph를 통해 Isaac Sim 내부 이벤트(시뮬레이션 시작, 키보드 입력, 충돌 감지 등)를 트리거로 설정하고, Python 노드(스크립트 노드)를 연결해서 원하는 로직을 짜면 상호작용 과정을 거의 전자동으로 구성할 수 있다. 예를 들어 다음과 같은 흐름을 만들 수 있다.

{% @mermaid/diagram content="flowchart TD
SimulationStart --> PythonNode("Load Robot Model & Initialize States")
PythonNode --> CollisionTrigger("Collision Event Node")
CollisionTrigger --> CameraTrigger("Take Snapshot Node")
CameraTrigger --> PythonNode2("Analyze Image & Publish to ROS2")" %}

이와 같은 그래프를 구성하면, 시뮬레이션이 시작되면 로봇 모델을 로드하고 초기화한다. 이후 특정 물체와 로봇 손끝이 충돌하면 카메라 스냅샷을 찍고, PythonNode2에서 이미지를 AI 모델로 분석한 뒤 분석 결과를 ROS2에 퍼블리시하는 순으로 자동화된다.

#### 상호작용 시나리오 확장: 인력 훈련 시뮬레이터

Isaac Sim의 상호작용 시스템은 산업 현장에서의 훈련용 시뮬레이터 개발에도 활용될 수 있다. 예컨대 복잡한 로봇 셀(cell)에서 작업자가 로봇을 프로그래밍하거나, 위험 지역에서 AGV(자율주행 차량)를 조작하는 상황을 Isaac Sim 내에서 먼저 체험해 볼 수 있다. 실제 하드웨어를 다루기 전, 조작 실수나 충돌이 발생했을 때 어떻게 대응하는지를 시뮬레이션으로 연습할 수 있으므로 안전사고 위험을 현저히 줄일 수 있다.

이런 시나리오에는 물리 충돌, 로봇 제어, 센서 시뮬레이션, UI 상호작용이 모두 결합되고, 경우에 따라선 VR 장비(Omniverse XR 등)를 활용해 현실감을 높일 수 있다. Isaac Sim은 Omniverse 기반이므로, XR 확장(Extension)을 통해 VR/AR 기기를 연동하여 3D 공간에서 직접 물리 상호작용을 경험하는 시나리오도 지원한다.

#### 인체 및 모션 캡처(Avatars)와의 상호작용

Omniverse Avatar나 모션 캡처 시스템과 Isaac Sim을 연결하면, 인간 아바타(Human Avatar)가 실제 사람과 유사한 조인트와 상호작용을 수행하는 장면을 구현할 수도 있다. 아바타의 움직임(키보드/마우스/VR 컨트롤러 입력)이 Isaac Sim 물리 엔진으로 전달되어 충돌이나 힘을 계산하고, 다른 로봇이나 물체와 협업하는 광경을 시뮬레이션할 수 있다.

이런 식으로 인간-로봇 협업(HRC, Human-Robot Collaboration)을 Isaac Sim에서 먼저 테스트하고, 안전거리나 동작 알고리즘을 검증할 수 있다. Isaac Sim 내에서 아바타가 로봇 근처를 지나갈 때 충돌 가능성을 모니터링하고, 로봇이 자동으로 동작을 일시 정지하도록 설정하는 등, 실제 공장 현장에서 구현해야 할 안전 기능을 미리 시도해볼 수 있다.

#### Isaac Sim 스케일업: 클라우드 및 멀티 GPU 활용

Omniverse Isaac Sim은 클라우드 서버나 데이터센터 환경에서 구동되어, 여러 사용자가 동시에 접속하거나 대규모 물리 시뮬레이션을 병렬 실행하는 형태로도 확장 가능하다. 여러 GPU를 탑재한 서버에서 병렬로 다수의 시뮬레이션 인스턴스를 띄우고, 각 인스턴스가 서로 다른 상호작용 시나리오를 동시에 수행하게 하면, 로봇 제어 알고리즘을 빠르게 테스트할 수 있다.

특히 강화학습이나 대규모 파라미터 튜닝(sweeping) 같은 작업을 수행할 때, 물리 시뮬레이션을 병렬화하면 학습 속도가 획기적으로 빨라진다. 클라우드 기반 Omniverse Farm 기능 등을 활용해 Isaac Sim 프로젝트를 다수 노드에서 동시에 돌리고, 통합 대시보드를 통해 상태를 모니터링할 수 있다.

#### 시뮬레이션 결과 문서화와 배포

Isaac Sim 프로젝트로부터 최종 산출물(로봇 동작, 상호작용 시나리오 등)을 다른 팀이나 고객에게 보여주려면, 시뮬레이션 기록을 동영상으로 캡처하거나 USD Stage의 상태를 내보내어 공유할 수 있다. Omniverse의 Nucleus 서비스를 이용하면 팀원들 간에 USD 파일을 버전 관리하며 협업할 수 있으며, AR/VR 데모 형식으로 실제 크기의 작업 셀을 가상 공간에서 시연하는 것도 가능하다.

대규모 협업 환경에서는 Git이나 DVC(Data Version Control) 같은 툴을 이용해 USD 및 리소스(메시, 텍스처, 스크립트) 파일을 체계적으로 관리하는 것을 권장한다. 시뮬레이션 스냅샷(Checkpoint)마다 날짜·버전을 붙여두면, 특정 버전의 움직임/상호작용 결과를 재현하기가 쉬워진다.

\--- 대신 남은 이야기

Isaac Sim에서 움직임(Motion)과 상호작용(Interaction)을 다루는 내용은 매우 광범위하다. 본문에서 기초적인 좌표계와 물리 모델부터 고급 동적 제어, ROS2 연동, AI/학습 적용 사례까지 살펴보았다. Isaac Sim은 Omniverse 생태계의 일원으로서 끊임없이 확장될 수 있으며, 사용자 맞춤형 확장(Extension)과 통합(Integration)을 통해 거의 무한에 가까운 적용 시나리오가 가능하다.

#### Isaac Sim에서의 Hardware-in-the-Loop 및 Co-Simulation

Isaac Sim은 가상 환경에서만 움직임과 상호작용을 시뮬레이션할 수 있을 뿐 아니라, 실제 하드웨어와 동기화하는 Hardware-in-the-Loop(HIL) 기법도 지원한다. 이를 통해 일부 구성 요소(예: 실제 로봇 컨트롤러 또는 임베디드 보드)는 물리적으로 구동되며, Isaac Sim은 가상 물리 환경만 제공하는 형태로 동작할 수 있다. 마치 실제 로봇이 가상의 작업장을 움직이는 듯한 시나리오가 가능하다.

HIL 구성을 위해서는 다음과 같은 요소가 요구될 수 있다.

* 실제 하드웨어(모터, 센서, 컨트롤러)가 Isaac Sim과 동일한 주기 혹은 제한된 지연(latency)으로 통신하여, 가상 객체가 실제 하드웨어의 상태에 따라 움직이도록 구성
* 센서 피드백을 Isaac Sim 내부에서 생성하거나, 실제 센서 데이터를 가져와 Isaac Sim 장면에 적용
* EtherCAT, CAN, EtherNet/IP 등 산업용 프로토콜을 지원하기 위해 중간 브릿지 소프트웨어를 두거나, ROS2를 사용해 간접 통신

또한 Isaac Sim은 MATLAB/Simulink, LabVIEW 등과의 Co-Simulation 환경을 구축할 수도 있다. 예컨대 Simulink에서 제어 알고리즘 블록 다이어그램을 돌리고, Isaac Sim에서 물리 시뮬레이션을 병렬로 구동하며 매 스텝마다 상호 간 데이터를 교환하는 형태다. 이 방식은 로봇 제어 이론가나 제어 엔지니어가 모델 기반 설계를 Isaac Sim의 3D 환경에 접목하고자 할 때 유용하다.

#### Isaac Sim에서의 오프라인 시나리오 시뮬레이션

오프라인 시나리오 시뮬레이션은 실제 시간과 관계없이 Isaac Sim에서 원하는 속도로 시뮬레이션을 실행하여 대규모 테스트를 단기간에 처리하는 방식이다. 특정 이벤트(로봇 충돌, 목표물 도착 등)까지 시간을 건너뛰거나(speed up) 더디게 진행(slow down)함으로써 디버깅이나 분석에 집중할 수도 있다. 이를 위해 Isaac Sim 스크립팅에서 시뮬레이션 스텝을 수동으로 호출하거나 시간을 인위적으로 제어하는 API를 사용한다.

오프라인 시나리오에서 대규모 데이터셋을 만들 수도 있다. 예컨대 다양한 로봇 조인트 배치, 물체 배치, 조명 상태 등을 무작위(sampling)로 생성하며 시뮬레이션을 돌리고, 각각의 결과(충돌 여부, 성공 여부, 센서 이미지 등)를 파일로 저장한다. 이는 로봇 인공지능 훈련, 물체 인식 데이터셋 확보, 강화학습 초기 데이터 구축 등에 쓰일 수 있다.

#### Isaac Sim에서의 카메라·센서 세팅 최적화

물리 상호작용의 움직임을 시각적으로 관찰하거나, AI 비전 알고리즘을 적용하려면 카메라 설정이 중요하다. Isaac Sim은 여러 종류의 카메라를 지원한다.

* Pinhole 카메라: 일반적인 RGB 카메라 모델
* Fish-eye 카메라: 광시야각 이미지를 얻을 수 있음
* Depth 카메라: 심도 영상을 생성해 로봇 조작(Manipulation)에 활용
* LiDAR 센서: 포인트 클라우드를 생성해 SLAM, 3D 인식 등에 쓰임

카메라 구성 요소는 Isaac Sim의 Stage에서 Camera 프리미티브(USD 프리미티브)로 만들고, 해당 카메라가 바라볼 위치를 지정한다. 시뮬레이션 중 카메라 Pose를 로봇 조인트에 종속시켜 움직이게 할 수도 있고, 정적인 뷰포인트로 두어 전체 장면을 모니터링할 수도 있다.

만약 라이다 센서를 시뮬레이션한다면, 회전 메커니즘(360도 스캔)을 물리적으로 설정하거나, 소프트웨어적으로 스캔 주기를 구현하여 포인트 클라우드가 시간에 따라 축적되도록 설계해야 한다. Isaac ROS나 ROS2 패키지로 Publish되어 실제와 동일한 메시 포맷(sensor\_msgs/PointCloud2)으로 내보낼 수 있게 하면, 기존 ROS2 애플리케이션과 연결이 간편해진다.

#### Isaac Sim의 DOF(자유도) 제한과 고정 마운팅

시뮬레이션 중 특정 객체의 움직임을 부분적으로만 허용하고 싶다면, 객체에 조인트를 추가하여 DOF를 제한하거나 완전히 고정해야 한다. 예컨대 테이블 위에 고정된 센서 스탠드는 6자유도(6-DOF) 중 회전과 평행 이동이 모두 0이 되도록, 즉 강체로 묶어놓는다.

Isaac Sim에서 이를 위해 “Fixed Joint”를 사용하거나, 객체의 Kinematic 모드(즉 물리 연산을 받지 않는 모드)로 설정해줄 수 있다. Kinematic 객체는 스크립트로 이동시켜도 다른 객체와 충돌 반응은 일어나지만, 정작 자신은 영향을 받지 않는다. 이를 통해 세트(환경) 역할을 하는 지형, 벽, 바닥, 고정장치 등을 구현한다.

#### 더욱 정밀한 시뮬레이션: Substepping과 Solver Iteration

상호작용이 복잡해질수록, Isaac Sim의 물리 엔진 설정(PhysX Tuning)이 중요해진다. 대표적으로 Substepping 수와 Solver Iteration 수가 정확도와 안정성을 좌우한다.

* Substep: 물리 프레임마다 내부적으로 나누어 계산하는 횟수. 충돌 처리나 조인트 강성( stiffness )을 정밀히 반영하기 위해 Substep을 늘릴 수 있지만, 그만큼 계산 부담이 늘어난다.
* Solver Iteration: 각 물리 프레임(또는 Substep)에서 충돌이나 조인트 제약을 풀기 위해 반복(iteration)하는 횟수. 마찬가지로 많이 할수록 해의 정확도가 높아지지만, 성능이 떨어진다.

상호작용이 세밀해야 하고 충돌이 잦다면 Substep과 Iteration을 늘려 정확도를 확보하고, 단순 배치 시뮬레이션이거나 물리적 세밀함이 덜 중요하다면 성능을 위해 수치를 낮출 수 있다. Isaac Sim에서는 이러한 파라미터를 “Physics Scene”이나 “Physics Step” 설정 패널에서 변경할 수 있다.

#### 대규모 객체 상호작용: 팔렛 적재, 물류 시뮬레이션

Isaac Sim에서 대규모 물체(박스, 팔렛, 컨테이너 등)를 동시에 시뮬레이션하려면, 물리 엔진이 많은 충돌 쌍을 처리해야 하므로 성능 이슈가 커진다. 이를 최적화하기 위해 여러 전략을 쓸 수 있다.

* 단순화된 충돌 기하(primitive collision shape) 사용: 박스 모양이라면 복잡한 메쉬 대신 큐브 콜리전을 사용
* Level of Detail(LOD) 활용: 멀리 있는 객체는 더 단순한 모델, 가까이에 있는 물체만 정밀한 모델
* CCD(continuous collision detection) 비활성화 또는 제한: 충돌 누락이 빈번하지 않다면, 필요한 객체에만 CCD 적용
* GPU PhysX 활성화: 대규모 충돌 처리를 병렬로 가속화

물류 시뮬레이션(창고 로봇, 자동 적재/하역 등)에서는 로봇이 여러 박스를 순차적으로 파렛 위에 쌓거나 내리는 작업을 통해 상호작용이 구현된다. Isaac Sim은 이러한 다수 객체를 빠르게 배치하고, 각각의 충돌과 마찰을 물리적으로 처리할 수 있어, 물류 공정 자동화 연구나 디지털 트윈 구축에 유용하다.

#### 나사 체결, 조립 작업 등을 위한 조인트 기반 상호작용

Isaac Sim에서 물체를 조립하거나 나사를 체결하는 등 세밀한 동작을 시뮬레이션하려면, 마찰과 작은 충돌 간섭을 매우 주의 깊게 다뤄야 한다. 작은 오차나 타이밍 문제가 있으면 물체가 튀거나 관통(Penetration) 현상이 발생하기 쉽다.

이를 어느 정도 안정적으로 구현하기 위해 특수 조인트(예: prismatic joint)나 constraint를 동적으로 생성해, 나사 구멍에 볼트가 들어가는 순간, 실제 나사체결을 대신할 강성 제약을 추가하여 물체가 연결되도록 할 수 있다. 즉, 완벽한 스크루(나사) 시뮬레이션을 물리 엔진이 처리하기 어렵다면, 조인트 생성으로 대체해 “체결됨” 상태를 모사한다.

이와 유사하게, 로봇 팔이 핀을 구멍에 삽입하는 동작 또한 매우 작은 오차를 허용할지라도 쉽게 충돌이 튀어버릴 수 있으므로, 삽입 직전에는 constraint를 추가해보거나, 로봇이 초저속·초저강성 모드로 동작하도록 제어해 시뮬레이션을 안정화할 수 있다.

#### 음향(사운드) 효과와 진동

Isaac Sim은 기본적으로 시각적·물리적 상호작용에 중점을 두지만, 음향 합성 기능도 필요에 따라 확장할 수 있다. 예컨대 충돌이 발생할 때 소리를 재생하거나, 모터 동작음, 환경 배경음을 추가하면 몰입감을 높일 수 있다. 직접 오디오 엔진을 연결하거나, Omniverse 확장 형태로 사운드 트리거를 등록해 특정 이벤트 시 음향을 플레이할 수 있다.

진동(진동 자극) 부분은 햅틱과 유사하게 구현해야 하며, Isaac Sim에서 실제로 진동 특성을 계산해주지는 않는다. 다만 충돌·접촉 데이터 혹은 조인트 움직임의 가속도 정보를 읽어 별도 디바이스(컨트롤러)로 전달하면 사용자가 느낄 수 있는 진동을 생성할 수 있다. 이를 통해 사용자 훈련 시뮬레이터를 더욱 실감 나게 꾸밀 수 있다.

#### Isaac Sim 프로젝트 배포 및 상호작용 시연

Isaac Sim으로 구축한 움직임 및 상호작용 시나리오는 Omniverse App 형식으로 패키징하거나, 별도의 실행 파일(Standalone)을 생성해 배포할 수 있다. 이 때에는 다음 작업들이 수반될 수 있다.

* USD 파일(장면, 로봇, 오브젝트) + Python 스크립트(자동화, 제어) + Extension(커스텀 기능)을 하나로 묶기
* 사용자 UI(메뉴, 버튼, 슬라이더) 구성해 시뮬레이션 중 필요한 매개변수를 쉽게 변경할 수 있도록 제공
* 필요한 경우, ROS2 노드 연결이나 Networking 설정을 포함해, 타겟 시스템(Windows, Linux)에서 실행 가능하도록 준비

시나리오 시연 시에는 보통 시뮬레이션 실행→로봇 제어→충돌·상호작용 모니터링→로그 분석의 과정을 보여주며, 물리 엔진이 제대로 동작해 예상한 움직임과 반응이 일치하는지 확인한다.

#### 라이브 코딩 예시: Octave 기반 역키네마틱스 계산

ROS2와 Isaac Sim을 직접 연결하는 대신, 여기서는 가벼운 예시로 Octave(또는 MATLAB 유사) 스크립트에서 역키네마틱스를 계산하고, 그 결과를 Isaac Sim에 JSON 혹은 소켓 통신 등으로 전달하는 방식을 간단히 시연해볼 수 있다. 아래는 2링크 로봇팔의 역운동학을 단순 계산하는 Octave 코드 예시다.

```octave
function q = two_link_ik(x, y, l1, l2)
  % x, y : 목표 말단부 위치
  % l1, l2 : 각 링크 길이
  % 반환 : [q1, q2]
  D = (x^2 + y^2 - l1^2 - l2^2) / (2 * l1 * l2);
  q2 = acos(D);
  q1 = atan2(y, x) - atan2(l2 * sin(q2), l1 + l2 * cos(q2));
  q = [q1, q2];
end

% 예시 사용
l1 = 1.0; 
l2 = 1.0;
target = [1.5, 0.5]; 
solution = two_link_ik(target(1), target(2), l1, l2);
disp("IK result: "), disp(solution);
```

산출된 $q\_1, q\_2$ 값을 Isaac Sim Python API로 전송해주면, 2링크 로봇팔 아티큘레이션의 조인트 각도를 설정할 수 있다. 이렇게 외부 계산 도구(Octave, MATLAB, NumPy 등)에서 역운동학이나 경로계획 알고리즘을 구동하고, Isaac Sim은 물리 시뮬레이션만 맡는 구조를 만들 수 있다.

#### 사용자 정의 모션 패턴: Bezier 곡선, 스플라인

Isaac Sim은 단순한 직선, 3차 다항식 트래젝터리 외에도 Bezier 곡선, spline 곡선 등 다양한 곡선을 따라 움직이는 경로를 표현할 수 있다. 이는 UI 상의 Curve Editor나 Python 스크립트로 구현 가능한데, Action Graph를 사용하면 시나리오 재생 시 원하는 객체가 Bezier 곡선을 따라 움직이도록 만들 수 있다.

로봇 암(arm) 제어에서도 스플라인 보간(trajectory interpolation)을 이용하면, 조인트별 속도나 가속도 프로파일을 매끄럽게 만들 수 있다. Isaac Sim에서는 물리 충돌을 고려하여 조인트 토크를 계산해야 하므로, 스플라인으로 목표 궤적을 정의해두고 PD 또는 PID, 혹은 임피던스(Impedance) 제어 방식을 적용해 부드러운 움직임과 충돌 대응을 구현한다.

#### Isaac Sim 환경 최적화: 피직스와 렌더링의 분리

상호작용이 복잡하고 물리 계산량이 많으면, 렌더링까지 동시에 수행하기에 GPU 리소스가 부족해질 수 있다. 이때는 Isaac Sim에서 Headless 모드로 물리 시뮬레이션만 돌리거나, 렌더링이 필요한 부분은 최소화해 CPU 기반 상징적(placeholder) 렌더링만 수행할 수도 있다. 반대로, 데모 영상이나 홍보 자료를 제작할 때는 렌더 품질(Path Tracing, RTX 사용)을 높이고, 물리 계산은 CPU나 별도 GPU로 맡길 수도 있다.

Omniverse의 RTX Renderer와 PhysX가 동일 GPU를 공유할 경우, 그래픽 파이프라인과 물리 파이프라인이 경쟁할 수 있으므로, 물리 시뮬레이션 주기를 낮춰 진행하는 전략도 고려할 수 있다. 예를 들어 렌더링은 60 FPS로 진행하되, 물리 계산은 30 Hz만으로 충분할 수도 있다.

#### 추가 확장: Isaac Sim 내 데이터 증강(Augmentation)

로봇 비전이나 AI 알고리즘을 훈련할 때, Isaac Sim 내부에서 데이터 증강(Augmentation)을 적용할 수 있다. 색상·조명·텍스처 무작위화, 물체 위치 무작위화, 카메라 노이즈 삽입 등 다양한 변형이 가능하다. 이를 자동화하면 시뮬레이션마다 배경, 조명, 물체 배치를 다르게 하여 대량의 학습 이미지를 생성할 수 있어, 실제 환경에서 발생할 변화를 로봇이 견딜 수 있도록 AI 모델을 강화할 수 있다.

실제 소형 무인 이동체(드론, UGV)가 Isaac Sim 환경에서 무작위 장애물과 상호작용하며 비전 AI를 훈련하고, 그 결과를 실제 하드웨어로 이전할 수도 있다. 이때 Isaac Sim의 카메라 샤터 효과, 모션 블러, 심도 노이즈 등을 활용해 실제 카메라와 유사한 잡음을 시뮬레이션하면 더욱 현실적이다.

#### 협업 툴로서의 Isaac Sim

Isaac Sim의 가장 큰 장점 중 하나는 Omniverse 생태계를 통해 여러 인원이 동시에 프로젝트를 공유하고, 서로 다른 역할(디자이너, 로봇 엔지니어, AI 개발자)이 같은 장면에서 협업할 수 있다는 점이다. 예컨대:

* 로봇 엔지니어: URDF/물리 파라미터 세팅
* 그래픽 디자이너: 모델 텍스처, 라이트, UI 구성
* AI 엔지니어: 센서 데이터 처리, 학습 파이프라인

이 세 부문이 동시에 Isaac Sim에서 상호작용 요소를 테스트하고, 서로 필요한 수정 사항을 리얼타임으로 주고받는다. 이렇게 협업 구조를 갖추면, 물리 시뮬레이션 기반 프로젝트가 훨씬 유연하고 신속하게 진행될 수 있다.

\--- 안내

지금까지 Isaac Sim에서의 움직임과 상호작용 체계에 대해 기초부터 비교적 고급 주제까지 폭넓게 살펴보았다. Isaac Sim과 ROS2 Humble의 결합을 통해 복합적인 로봇 시뮬레이션 환경을 구축할 수 있고, 강화학습이나 AI 알고리즘을 적용하여 가상 환경에서 자동화된 로봇 훈련과 테스트를 대규모로 수행할 수도 있다.
