Post

Pitwall Telemetry 사용 방법

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 pitwallpitwall.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 패널 사용법을 참고하세요.

This post is licensed under CC BY 4.0 by the author.