1.6 구현 예제 안내

1.6.1 순수 Python 폐루프

code/physical_ai_loop.py는 외부 로봇 프레임워크 없이 1차원 관절을 제어한다.

python3 code/physical_ai_loop.py

예상 출력 예시

step=00 q=+0.000 proposed=+0.700 safe=+0.700 age_ms=0.0
step=05 q=+0.331 proposed=+0.700 safe=+0.700 age_ms=0.0
step=10 q=+0.505 proposed=+0.700 safe=+0.700 age_ms=0.0
step=15 q=+0.597 proposed=+0.700 safe=+0.700 age_ms=0.0
watchdog: stale command rejected

핵심은 수치 결과가 아니라 정책과 안전 필터의 독립성이다.

1.6.2 ROS 2 Python 상태 발행기

code/ros2_jazzy/physical_ai_demo/physical_ai_demo/joint_state_source.py는 가상의 관절 상태를 발행한다. 센서형 QoS와 명시적 timestamp를 사용한다.

cd code/ros2_jazzy/physical_ai_demo
colcon build --symlink-install
source install/setup.bash
ros2 run physical_ai_demo joint_state_source

다른 터미널:

ros2 topic echo /demo/joint_states
ros2 topic hz /demo/joint_states

예상 출력 예시

average rate: 49.9
name: [joint_1]
position: [0.31]

1.6.3 ROS 2 C++ 안전 게이트

code/ros2_jazzy/safety_gate_cpp/는 목표 JointState를 구독해 관절 한계와 메시지 나이를 검사한 뒤 안전한 명령을 발행한다. 예제는 교육용이며, 실물의 인증된 안전 장치를 대체하지 않는다.

장 루트에서 두 패키지를 함께 빌드한다.

cd code/ros2_jazzy
source /opt/ros/jazzy/setup.bash
colcon build --symlink-install --packages-select physical_ai_demo safety_gate_cpp
source install/setup.bash

터미널 A에서 게이트, 터미널 B에서 현재 timestamp가 있는 교육용 명령 발생기, 터미널 C에서 안전 명령을 실행한다.

# 터미널 A
ros2 run safety_gate_cpp safety_gate

# 터미널 B
ros2 run physical_ai_demo proposed_command_source

# 터미널 C
ros2 topic echo /demo/safe_command

예상 출력 예시

name: [joint_1]
position: [0.8]

proposed_command_source의 목표를 1.5 rad로 바꾸면 기본 상한 1.0 rad로 clamp된다. timestamp를 0으로 바꾸면 게이트가 stale/future command로 거부해야 한다.

이 장의 예제 코드·설정 파일 (12)

이 장의 자가 점검·가상실습