1. ROS 2 워크스페이스 및 패키지 생성
가장 먼저 터미널에서 프로젝트 구조를 만듭니다.
# 1. 워크스페이스 생성
mkdir -p ~/isaac_jazzy_amr_ws/src
cd ~/isaac_jazzy_amr_ws/src
# 2. 패키지 생성 (의존성 포함)
ros2 pkg create --build-type ament_python amr_controller --dependencies rclpy geometry_msgs sensor_msgs
# 3. 소스 폴더로 이동
cd amr_controller/amr_controller
2. 패키지 파일 구성 (File Structure)
패키지의 핵심 파일 설정 내용입니다.
① package.xml
의존성 라이브러리가 명시되어야 합니다.
<?xml version="1.0"?>
http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format3>
<name>amr_controller</name>
<version>0.0.0</version>
<description>Isaac Sim 5.1.0 AMR Teleop with Pro-Con</description>
<maintainer email="user@todo.todo">user</maintainer>
<license>Apache License 2.0</license>
<depend>rclpy</depend>
<depend>geometry_msgs</depend>
<depend>sensor_msgs</depend>
<test_depend>ament_copyright</test_depend>
<test_depend>ament_flake8</test_depend>
<test_depend>ament_pep257</test_depend>
<test_depend>python3-pytest</test_depend>
<export>
<build_type>ament_python</build_type>
</export>
</package>
② setup.py
노드를 실행할 수 있도록 진입점(entry_point)을 설정합니다.
from setuptools import find_packages, setup
package_name = 'amr_controller'
setup(
name=package_name,
version='0.0.0',
packages=find_packages(exclude=['test']),
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='user',
maintainer_email='user@todo.todo',
description='Isaac Sim 5.1.0 AMR Teleop',
license='Apache License 2.0',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'amr_control_510 = amr_controller.amr_control_510:main'
],
},
)
③ amr_control_510.py (핵심 로직)
~/isaac_jazzy_amr_ws/src/amr_controller/amr_controller/amr_control_510.py 경로에 생성합니다.
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Joy
from geometry_msgs.msg import Twist
class IsaacAMRTeleop(Node):
def __init__(self):
super().__init__('isaac_amr_teleop')
self.joy_sub = self.create_subscription(Joy, 'joy', self.joy_callback, 10)
self.cmd_pub = self.create_publisher(Twist, '/cmd_vel', 10)
self.get_logger().info("AMR 제어 노드 가동: L-Stick(전후), R-Stick(좌우)")
def joy_callback(self, joy_msg):
twist = Twist()
# 프로콘 매핑: L-스틱 상하(axes[1]), R-스틱 좌우(axes[3])
twist.linear.x = joy_msg.axes[1] * 1.0 # 선속도
twist.angular.z = joy_msg.axes[3] * 1.5 # 각속도
self.cmd_pub.publish(twist)
def main(args=None):
rclpy.init(args=args)
node = IsaacAMRTeleop()
try:
rclpy.spin(node)
except KeyboardInterrupt:
pass
finally:
node.destroy_node()
rclpy.shutdown()
3. Isaac Sim 5.1.0 액션 그래프 설정 (Action Graph)
이 단계는 Isaac Sim GUI 내에서 수행합니다.
** 첨부파일은 Isaac sim 실행 후 Open하여 바로 실행하면 된다.
- 로봇 추가: Content Browser -> Isaac/Robots/Carter/nova_carter.usd 배치.
- 그래프 생성: Window > Graph Editors > Action Graph 클릭 후 New Action Graph.
- 노드 연결:
- On Playback Tick: 실행 시작점.
- ROS2 Subscribe Twist: /cmd_vel 구독.
- Break 3-Vector (2개):
- Linear Velocity → X 값 추출 (Double 타입으로 변환).
- Angular Velocity → Z 값 추출 (Double 타입으로 변환).
- Differential Controller: Desired Linear Velocity(X), Desired Angular Velocity(Z) 연결.
- Articulation Controller: robotPath를 /World/Carter로 지정.

4. 빌드 및 실행 절차
단계 1: ROS 2 워크스페이스 빌드
cd ~/isaac_jazzy_amr_ws
colcon build --symlink-install
source install/setup.bash
단계 2: 시스템 구동 (3개 터미널)
- 터미널 1 (Joy Driver): ros2 run joy joy_node
- 터미널 2 (Controller): ros2 run amr_controller amr_control_510
- Isaac Sim 실행 후: Play 버튼 클릭.
참고. Isaac sim 실행 및 ROS2 Jazzy 실행 환경 변수 설정 (.bashrc)
Isaac sim의 내부 Python 라이브러리와 ROS 2 Jazzy가 충돌하지 않도록 경로를 지정해야 합니다.
nano ~/.bashrc
파일 끝에 아래 내용을 추가하세요:
# ROS 2 Jazzy 환경 로드
source /opt/ros/jazzy/setup.bash
# 아이작 심 경로 설정
export ISAAC_SIM_PATH=$HOME/.local/share/ov/pkg/isaac-sim-5.1.0 # Isaacsim 설치 경로
alias isaac_sim='$ISAAC_SIM_PATH/isaac-sim.sh'
# 아이작 심 내부 파이썬 사용을 위한 별칭 (선택 사항)
alias isaac_python='$ISAAC_SIM_PATH/python.sh'
저장 후 적용:
source ~/.bashrc
5. 핵심 주의사항 (최종 체크리스트)
- 타입 불일치: Twist 메시지의 Vector3를 Double로 변환하지 않으면 5.1.0에서는 선이 연결되지 않습니다.
반드시 Break 3-Vector 노드를 사용하세요. - 물리 활성화: 로봇(/World/Carter)의 Articulation Root 속성이 켜져 있어야 물리 명령을 듣습니다.
- 바퀴 파라미터: Differential Controller 노드에서 Wheel Radius와 Wheel Distance가 실제 로봇 크기(예: 0.1, 0.5)로 설정되어야 합니다. 0이면 움직이지 않습니다.
GITHUB : https://github.com/goooodday/isaac_jazzy_amr_ws.git