Pitwall Telemetry 사용 방법
주행 중 속도나 PID 오차 같은 코드 속 값을 실시간으로 확인하고 싶을 때 사용합니다. 보통 ROS에서는 이런 값을 확인하려면 토픽을 새로 만들어야 하고(publisher 선언·메시지 타입 지정·발행 코드), 토픽이 아닌 내부 변수는 그마저도 어렵습니다.
Pitwall telemetry는 코드 어디서든 pitwall.log("이름", 값)만 넣으면 그 값이 자동으로 채널이 되어 실시간으로 확인 및 녹화가 가능합니다.
왜 좋은가
- 토픽 생성 필요 없음 — publisher·메시지 타입 선언 없이
pitwall.log(...)한 줄 - 토픽이 아닌 내부 변수도 관찰 — PID 오차, 중간 계산값 등 평소엔 못 보던 값도 그대로 확인 가능
- 튜닝 루프가 빨라짐 — 게인을 바꿔가며 값 변화를 실시간 그래프로 즉시 확인 가능
현재 기본 Sim에서는 events(사건 알림)만 바로 확인됩니다. 값 계측(log)은 아래 “값 계측 및 확인”처럼 원하는 값에 한 줄을 넣어 직접 켜서 씁니다.
Pitwall Telemetry의 기본 기능
| 기능 | 설명 | 메커니즘 / 예시 |
|---|---|---|
사건 알림 (event) | 특정 사건이 일어나면 목록에 한 줄씩 기록 | 차가 벽에 부딪힘 → ego: WALL collision 표시 |
값 계측 → 확인 (log) | 코드 속 값을 한 줄로 채널화해 실시간 확인 | 속도 값을 실시간 그래프로 |
주의사항 —
pitwall.event(...)와 달리pitwall.log(...)는 값을 그래프로 보기 위해서는 rqt(ROS의 GUI 도구 모음)을 사용해야 합니다. 단순히 숫자만 보고 싶은 경우ros2 topic echo /pitwall/…을 입력하면 됩니다.
사건 알림 (event)
코드 안에서 특정 사건이 일어나면 Pitwall Telemetry 박스에 한 줄 띄워주는 기능입니다. 현재 스택에서는 Ego가 벽 또는 상대 차와 충돌하면 알림이 발생하고, RViz Pitwall 패널의 Telemetry 박스에 실시간으로 찍힙니다.
Sim에서 바로 확인됩니다.
1
2
3
4
5
6
7
import pitwall # 파일 상단에 한 번
pitwall.init(self) # 노드 __init__에서 한 번
# 충돌이 감지되는 지점에서
pitwall.event('ego: WALL collision')
pitwall.event('ego: OPPONENT collision')
직접 해보기 — 회피 시 이벤트 띄우기
① 이벤트를 띄우고 싶은 상황이 처리되는 파일을 엽니다. 여기서는 Ego가 장애물을 피해 추월(OVERTAKE)하는 순간에 띄우고 싶으므로 state_machine_node.py를 엽니다.
(경로: /home/hmcl/unicorn_ws/src/unicorn-racing-stack/state_machine/state_machine/state_machine_node.py)
이 파일에는 아직 pitwall이 없으므로, 파일 상단에 import pitwall, 노드 __init__에 pitwall.init(self)와 직전 상태 기억용 변수를 먼저 추가합니다. (있을 경우 생략)
1
import pitwall # 파일 상단 (19번 줄)
1
2
3
# 들여쓰기 반드시 맞출 것
pitwall.init(self) # ← 추가 (한 번만) 348번 줄
self._prev_state = None # ← 추가 (직전 상태 기억용) 349번 줄
그다음, 상태를 발행하는 곳(1408번째 줄)에 OVERTAKE로 막 바뀌는 순간만 잡아 이벤트를 띄우는 코드를 추가합니다.
1
2
3
4
# ↓ 추가: OVERTAKE(회피 추월)에 진입하는 순간 한 번만 (1408번 줄)
if self.cur_state == StateType.OVERTAKE and self._prev_state != StateType.OVERTAKE:
pitwall.event('obstacle avoid')
self._prev_state = self.cur_state
_prev_state로 비교하는 이유: 이 줄은 매 루프(수십 Hz)마다 실행되므로, 그냥 조건 없이 띄우면 추월하는 내내obstacle avoid가 도배됩니다. 직전 상태와 비교해 진입하는 첫 순간에만 한 번 띄웁니다. 문구는pitwall.event('...')안의 문자열만 바꾸면 됩니다.
② 저장 후 빌드합니다.
1
colcon build --packages-select state_machine # 수정한 파일만 빌드
③ Sim을 실행합니다.
1
ros2 launch stack_master race.launch.xml sim:=true map:=f
실제 실행 영상
값 계측 및 확인 (log)
코드 안의 숫자 값을 실시간으로 보고 싶을 때 사용합니다. ros2 topic echo와 비슷해 보이지만, 토픽으로 만들어 두지 않은 내부 변수까지 볼 수 있다는 점이 다릅니다 (예: PID error).
직접 해보기 — 속도 값 그래프로 보기
① 보고 싶은 값이 계산되는 파일을 엽니다. 여기서는 Ego의 속도를 보고 싶으므로 gym_bridge.py를 엽니다. (이 파일에는 import pitwall과 pitwall.init(self)이 이미 들어 있으므로, 값 한 줄만 추가하면 됩니다.)
(경로: /home/hmcl/unicorn_ws/src/unicorn-racing-stack/race_utils/unicorn_gym/f1tenth_gym_ros/f1tenth_gym_ros/gym_bridge.py)
1
pitwall.log("speed", self.ego_speed[0]) # ← 이 한 줄만 추가 (차 실제 속도 계측)
import와 init이 작성되어 있지 않은 경우 채우시면 됩니다.
1
2
3
4
import pitwall # one-line telemetry: pitwall.event(...) -> /pitwall/events (50번 줄)
# Bind pitwall telemetry to this node (reuses its DDS participant). 77번 줄
pitwall.init(self)
② 저장 후 빌드합니다.
1
colcon build --packages-select f1tenth_gym_ros # 수정한 파일만 빌드
③ Sim을 실행합니다.
1
ros2 launch stack_master race.launch.xml sim:=true map:=f
④ 값을 봅니다.
터미널에서 숫자로 빠르게 확인:
1
ros2 topic echo /pitwall/speed
그래프로 확인 (rqt):
1
ros2 run rqt_plot rqt_plot /pitwall/speed/data
값이 안 보일 때 —
pitwall.log는 특정 창을 켰을 때만 값을 내보냅니다.rqt_plot이나ros2 topic echo중 하나를 켜야 됩니다. (아무것도 안 켜면 안 보이는 게 정상.) 또 숫자 값은 RViz Pitwall 패널에는 안 뜨고rqt_plot또는echo에서 볼 수 있습니다. (패널은 event만 표시합니다.)
주행 녹화 → 재생
녹화 (ros2 bag과 동일한 역할, MCAP로 저장):
1
2
3
4
ros2 bag record -a # 모든 토픽 → /pitwall/* 포함
ros2 launch pitwall record.launch.py # 기본 regex '/pitwall/.*' → pitwall만 저장
ros2 launch pitwall record.launch.py topic_regex:='/pitwall/.*|/scan|/imu'
# pitwall + 지정한 센서 토픽
재생:
1
2
3
4
5
6
# 터미널 1 — 재생
ros2 bag play ~/runs/lap03 # 예시
# 터미널 2 — 보기 (녹화 때랑 똑같이)
ros2 run rqt_plot rqt_plot /pitwall/speed/data
# 또는 ros2 topic echo /pitwall/speed
마무리
이 글에서는 Pitwall telemetry로 코드 속 값을 확인하는 두 가지 방법 — 사건 알림(pitwall.event)과 값 계측(pitwall.log) — 을 직접 해보기 예시와 함께 다뤘습니다. publisher 선언 없이 한 줄로 내부 변수까지 관찰할 수 있어 튜닝·디버깅 루프가 크게 빨라집니다. Pitwall 패널 자체의 기능은 Pitwall 패널 사용법을 참고하세요.