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를 사용한다.
ROS 2 Jazzy와 빌드 의존성이 설치되어 있다는 전제의 실행 절차다. 아래 빌드는 기존 overlay가 섞이지 않은 새 터미널에서 장 루트를 기준으로 수행한다. 작업공간·패키지 구분과 환경 적용은 M05.01에서 설명한다. 이 명령을 읽는 활동과 실제 ROS 실행 검증을 구분한다.
source /opt/ros/jazzy/setup.bash
cd code/ros2_jazzy
colcon build --symlink-install --packages-select physical_ai_demo
패키지별 빌드 성공을 확인한 경우에만 다음으로 진행한다. 실패하면 여기서 멈추고 로그를 확인한다. 남아 있는 install 디렉터리를 새 빌드 성공으로 간주하지 않는다. 성공한 경우 새 실행 터미널에서 장 루트를 기준으로 다음을 실행한다.
source /opt/ros/jazzy/setup.bash
source code/ros2_jazzy/install/setup.bash
ros2 run physical_ai_demo joint_state_source
다른 터미널에서도 장 루트를 기준으로 같은 환경을 적용한다. 조회와 주기 관찰 명령은 필요하면 각각의 터미널에서 실행한다.
source /opt/ros/jazzy/setup.bash
source code/ros2_jazzy/install/setup.bash
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
두 패키지가 모두 성공했는지 확인한 경우에만 다음 실행 단계로 진행한다. 실패하면 기존 설치물을 실행하지 말고 빌드 로그부터 확인한다. 터미널 A에서 게이트, 터미널 B에서 현재 timestamp가 있는 교육용 명령 발생기, 터미널 C에서 안전 명령을 관찰한다. 각 새 터미널은 장 루트에서 /opt/ros/jazzy/setup.bash와 code/ros2_jazzy/install/setup.bash를 차례로 source한 뒤 해당 명령을 실행한다.
# 터미널 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로 거부해야 한다.