부록 부록
A.2 QoS·환경변수·설정 레퍼런스
A.2.1 이 부록의 사용법
QoS 정책과 환경 변수는 "알고 있으면 5분, 모르면 하루"인 종류의 지식이다. 이 부록은 그것을 한자리에 모은다.
정직: 환경 변수의 지원 여부·기본값·정확한 이름은 배포판과 RMW 구현에 따라 다르다
(확인 필요). 특히 벤더별 설정은 해당 DDS 문서가 정본이다.다만 이 부록은 이 책에서 실행 검증이 가장 많이 적용된 곳이다 — 내장 QoS 프로파일 전 필드,
BEST_AVAILABLE,ROS_LOCALHOST_ONLY폐기, 디스커버리 범위 값,ROS_LOG_DIR·ROS_STATIC_PEERS, 그리고 존재하지 않는 환경변수 3종이 실측으로 확인·정정됐다. 본문의 (실행 확인) 표기가 붙은 항목은 Jazzy 실물과 대조한 것이고, 표기가 없는 항목은 여전히 문서 기준이다(목차 3의 검증 범위 표).
A.2.2 QoS 정책 요약
| 정책 | 값 | 의미 | 장 |
|---|---|---|---|
| Reliability | RELIABLE / BEST_EFFORT / BEST_AVAILABLE | 재전송 여부 | 1.5.3.2 |
| Durability | TRANSIENT_LOCAL / VOLATILE / BEST_AVAILABLE | 늦은 구독자에게 과거 전달 | 1.5.3.3 |
| History | KEEP_LAST(depth) / KEEP_ALL | 보관 방식 | 1.5.3.1 |
| Depth | 정수 | KEEP_LAST의 큐 크기 | 1.5.3.1·1.6.4(계산법) |
| Deadline | 기간 / BEST_AVAILABLE | 최대 발행 간격 기대 | 1.5.3.4 |
| Liveliness | AUTOMATIC / MANUAL_BY_TOPIC / BEST_AVAILABLE + lease | 생존 판정 | 1.5.3.6 |
| Lifespan | 기간 | 메시지 유효 기간 | 1.5.3.5 |
모든 정책에 SYSTEM_DEFAULT(RMW/XML에 위임)와 UNKNOWN(조회 결과에만 등장)이 추가로 존재한다. BEST_AVAILABLE은 History에는 없다 — KEEP_LAST/KEEP_ALL뿐이다(실행 확인: rclpy HistoryPolicy 열거형). History는 호환성 판정 대상이 아니라 협상할 것이 없기 때문이다. 의미와 함정은 1.5.3.8.
A.2.3 호환성 매트릭스
발행자(offered)와 구독자(requested)가 호환되어야 연결된다(1.5.4).
Reliability:
| 발행자 ↓ / 구독자 → | RELIABLE | BEST_EFFORT |
|---|---|---|
RELIABLE | ✅ | ✅ |
BEST_EFFORT | ❌ | ✅ |
Durability:
| 발행자 ↓ / 구독자 → | TRANSIENT_LOCAL | VOLATILE |
|---|---|---|
TRANSIENT_LOCAL | ✅ | ✅ |
VOLATILE | ❌ | ✅ |
규칙: 발행자가 구독자의 요구 이상을 제공해야 한다.
| Deadline | 발행자 기간 ≤ 구독자 기간이어야 |
|---|---|
| Liveliness | 발행자 lease ≤ 구독자 lease |
| Lifespan | 호환성 판정 대상 아님(실행 확인) — 발행 1초 / 구독 30초로 어긋나게 두어도 정상 연결·수신된다 |
| History·Depth | 호환성 판정 대상 아님 — 각자 자기 설정대로 동작(1.5.4) |
연결이 안 될 때 첫 명령:
ros2 topic info <topic> -v(A.1.3). 양쪽 QoS가 그대로 나온다.
A.2.4 표준 프로파일
| 프로파일 | 구성 | 용도 |
|---|---|---|
기본(rclcpp::QoS(10)) | RELIABLE·VOLATILE·KEEP_LAST(10) | 일반 |
SensorDataQoS | BEST_EFFORT·VOLATILE·KEEP_LAST(5) | 센서 |
ServicesQoS | RELIABLE·VOLATILE·KEEP_LAST(10) | 서비스 |
ParametersQoS | RELIABLE·VOLATILE·KEEP_LAST(1000) | 파라미터 |
RosoutQoS | RELIABLE·TRANSIENT_LOCAL·KEEP_LAST(1000)·lifespan 10초 | /rosout |
ClockQoS | BEST_EFFORT·VOLATILE·KEEP_LAST(1) | /clock — 유실 허용·이력 없음(1.6.11) |
SystemDefaultsQoS | RMW 기본값 | 위임 |
BestAvailableQoS | BEST_AVAILABLE×4·KEEP_LAST(10) | 진단 도구(1.5.3.8) |
표 전체를 Jazzy 헤더(rmw/qos_profiles.h·rcl/logging_rosout.h)와 대조해 확인했다(실행 확인).
// C++
auto qos = rclcpp::SensorDataQoS();
auto qos2 = rclcpp::QoS(rclcpp::KeepLast(1)).best_effort().durability_volatile();
auto latched = rclcpp::QoS(1).transient_local().reliable(); // 지도·정적 데이터
# Python
from rclpy.qos import qos_profile_sensor_data, QoSProfile, ReliabilityPolicy, DurabilityPolicy
qos = QoSProfile(depth=1, reliability=ReliabilityPolicy.BEST_EFFORT)
latched = QoSProfile(depth=1, durability=DurabilityPolicy.TRANSIENT_LOCAL)
A.2.5 용도별 권장 구성
| 데이터 | 권장 | 근거 |
|---|---|---|
| 라이다·카메라·IMU | BEST_EFFORT·depth=1~5 | 최신이 중요(1.6.3.1) |
/cmd_vel | RELIABLE·depth=1 | 손실 방지 + 최신 |
/tf | RELIABLE·depth=100 정도 | 이력 필요(5.1.5) |
/tf_static | TRANSIENT_LOCAL·RELIABLE | 늦은 구독자 |
/map | TRANSIENT_LOCAL·RELIABLE·depth=1 | 한 번 발행(1.6.3.3) |
| 진단 | RELIABLE·depth=10 | 유실 방지(6.9) |
| 상태·모드 | TRANSIENT_LOCAL 검토 | 늦은 구독자 |
| 기록용 | 발행자에 맞춤 | 11.2.9 |
함정: 가장 흔한 사고는 센서에
RELIABLE을 쓰는 것(1.6.3.1)과/map을VOLATILE로 구독하는 것(11.4.4)이다.
A.2.6 핵심 환경 변수
| 변수 | 의미 | 장 |
|---|---|---|
ROS_DOMAIN_ID | 도메인 구분(0~101 등) — 보안 아님 | 1.5.8 |
RMW_IMPLEMENTATION | RMW 선택 | 3.5.6 |
ROS_LOCALHOST_ONLY | 로컬 한정 — Jazzy에서 폐기(deprecated). 켜면 경고와 함께 여전히 동작하며, 이때 아래 둘은 무시된다(실행 확인) | 3.9.4 |
ROS_AUTOMATIC_DISCOVERY_RANGE | 디스커버리 범위 — OFF·LOCALHOST·SUBNET·SYSTEM_DEFAULT(실행 확인) | 3.10.4 |
ROS_STATIC_PEERS | localhost 외에 추가로 통신할 호스트 — IP나 호스트명을 ;로 구분해 나열. 값 검증은 RMW에 맡긴다(실행 확인: rcl/discovery_options.h) | 3.9.4 |
ROS_DISCOVERY_SERVER | Discovery Server 주소 | 3.10 |
ROS_NAMESPACE | 기본 네임스페이스 | 1.1.6 |
RCUTILS_CONSOLE_OUTPUT_FORMAT | 로그 형식 | 1.11.6 |
RCUTILS_COLORIZED_OUTPUT | 색 출력 | 1.11 |
RCUTILS_LOGGING_USE_STDOUT · RCUTILS_LOGGING_BUFFERED_STREAM | 출력 스트림·버퍼링 | 1.11.4 |
ROS_LOG_DIR | 로그 파일 디렉터리 — 지정하면 그 아래에 <노드>_<pid>_<ms>.log가 생긴다(실행 확인) | 1.11.3 |
기본 로그 레벨을 바꾸는 환경변수는 Jazzy에 없다(실행 확인).
RCUTILS_LOGGING_SEVERITY는 존재하지 않으며 설정해도 무시된다. 레벨은--ros-args --log-level이나/<노드>/set_logger_levels서비스로 바꾼다(1.11.4).
| ROS_SECURITY_ENABLE | 보안 활성 | 13.2.6 | | ROS_SECURITY_STRATEGY | Enforce/Permissive | 13.2.6 | | ROS_SECURITY_KEYSTORE | 키스토어 경로 | 13.2.3 | | ROS_SECURITY_ENCLAVE_OVERRIDE | enclave 경로 자동 계산을 덮어쓴다 — 기본은 컨텍스트 이름으로 <키스토어>/enclaves/<경로>를 찾는다(실행 확인) | 13.2.12.4 | | FASTRTPS_DEFAULT_PROFILES_FILE | Fast DDS XML(확인 필요) | 3.7 | | CYCLONEDDS_URI | Cyclone DDS 설정(확인 필요) | 3.8 | | FASTDDS_LOG_LEVEL | Fast DDS 자체 로그 수준 — RMW 아래를 볼 때 | 3.7 | | AMENT_PREFIX_PATH | ament 검색 경로 | 4.1 | | CMAKE_PREFIX_PATH | CMake 패키지 검색 경로 — 오버레이가 쌓이는 실체(0.5.3) | 0.5·4.2 | | LD_LIBRARY_PATH | 공유 라이브러리 검색 경로 — 소싱이 빠지면 여기가 비어 노드가 기동되지 않는다 | 0.5·14.8.4 | | ROS_DISTRO | 현재 소싱된 배포판 이름(jazzy) — 스크립트에서 분기할 때 | 0.4·4.6 | | COLCON_* | colcon 동작 | 4.5 |
함정:
ROS_DOMAIN_ID가 노드마다 다르면 서로를 못 본다(1.5.8) — "아무것도 안 보인다"의 최다 원인 중 하나.printenv | grep ROS로 모든 터미널에서 확인하라.
함정:
RMW_IMPLEMENTATION이 노드마다 다르면 통신되지 않는다(3.5.6). systemd 서비스와 SSH 셸의 환경이 다를 수 있으므로(14.8.4) 양쪽을 확인한다.
A.2.7 설정 파일 체계
| 파일 | 역할 | 장 |
|---|---|---|
package.xml | 메타데이터·의존성 | 4.2·4.3 |
CMakeLists.txt / setup.py | 빌드 | 4.2 |
| 파라미터 YAML | 노드 설정 | 1.9.7 |
| launch 파일 | 기동 구성 | 14.3 |
| URDF·xacro | 로봇 모델 | 5.3 |
| SRDF | MoveIt 설정 | 9.1 |
ros2_control YAML·URDF 태그 | 하드웨어·컨트롤러 | 6.2·6.3 |
.rviz | 시각화 구성 | 11.4.6 |
| DDS 벤더 XML | 미들웨어 튜닝 | 3.7·3.8 |
| 거버넌스·권한 XML | 보안 | 13.3.4 |
colcon 설정 | 빌드 옵션 | 4.5 |
| systemd 유닛 | 서비스 | 14.8.3 |
A.2.8 파라미터 YAML 형식
# 노드 이름·네임스페이스가 정확히 일치해야 적용된다 (1.7.9)
/my_node:
ros__parameters:
rate: 20.0
frame_id: "base_link"
thresholds: [0.1, 0.5, 1.0]
nested:
value: 3
# 네임스페이스가 있으면
/robot1/my_node:
ros__parameters:
rate: 20.0
# 와일드카드 (확인 필요: 정확한 동작 범위)
/**:
ros__parameters:
use_sim_time: true
| 함정 | 증상 | 확인 |
|---|---|---|
| 노드 이름 불일치 | 조용히 기본값 | ros2 param get |
| 네임스페이스 누락 | 미적용 | 실제 노드 이름 확인 |
| 타입 불일치 | 오류·무시 | param describe |
| 목록 순서 | 뒤가 앞을 덮지만, 구체성이 순서에 우선한다(실행 확인, 14.4.11.2 — /**:가 나중이어도 /노드이름:을 못 덮음) | 의도 주석 |
적용 확인의 표준 절차:
ros2 param dump /my_node로 실제 값을 본다(A.1.5).
A.2.9 자주 쓰는 로그 설정
# 실행 시 레벨
ros2 run my_pkg my_node --ros-args --log-level debug
ros2 run my_pkg my_node --ros-args --log-level my_node:=debug # 노드별
# 형식 (확인 필요: 지시자)
export RCUTILS_CONSOLE_OUTPUT_FORMAT="[{severity}] [{time}] [{name}]: {message}"
# 파일 위치
ls ~/.ros/log/latest/ # ★ 정기 정리 필요 (14.8.9)
| 레벨 | 용도 | 장 |
|---|---|---|
DEBUG | 개발 — 운영 금지 | 1.11.4 |
INFO | 상태 변화 | 1.11.4 |
WARN | 비정상이지만 계속 | 1.11.4 |
ERROR | 기능 실패 | 1.11.4 |
FATAL | 종료 | 1.11.4 |
고빈도 콜백에서는
RCLCPP_*_THROTTLE을 쓰라(1.11.5·12.6.8).
A.2.10 시간 관련 설정
| 항목 | 설명 | 장 |
|---|---|---|
use_sim_time | /clock을 시계로 사용 | 1.10 |
/clock 발행자 | 시뮬 또는 bag play --clock | 10.2.6·11.3.5 |
| 전체 일관성 | 일부만 켜면 외삽 오류 | 5.2.4 |
| 시계 동기 | NTP·PTP | 7.7.6 |
# launch에서 전체 적용 (14.3.5)
SetParameter(name='use_sim_time', value=True)
| 조합 | 결과 |
|---|---|
--clock + use_sim_time: true | ✅ 정상 |
--clock 없음 + use_sim_time: true | 시간 0에 멈춤 |
--clock + use_sim_time: false | 스탬프 불일치 |
A.2.11 성능 관련 설정 요약
| 설정 | 효과 | 장 |
|---|---|---|
CMAKE_BUILD_TYPE=Release | 큰 성능 차이 | 12.6.8 |
use_intra_process_comms | 복사 제거 | 2.7.5 |
QoS depth=1 | 지연 감소 | 12.4.4 |
| 컴포넌트 컨테이너 | 경계 비용 제거 | 2.7 |
| 콜백 그룹 분리 | 병렬·격리 | 2.3.3 |
| DDS 벤더 XML | 버퍼·전송 튜닝 | 3.7·3.8 |
CPU 거버너 performance | 지터 감소 | 12.2.7 |
mlockall | 페이지 폴트 제거 | 12.3.3 |
성능 문제의 첫 확인은 빌드 타입이다(12.6.8). 디버그 빌드로 운영하는 경우가 의외로 흔하다.
A.2.12 빠른 진단 대응표
| 증상 | 첫 확인 | 장 |
|---|---|---|
| 아무것도 안 보임 | ROS_DOMAIN_ID·RMW_IMPLEMENTATION | 1.5.8 |
| 토픽은 있는데 데이터 없음 | ros2 topic info -v(QoS) | 1.6.3.1 |
/map이 안 보임 | Durability TRANSIENT_LOCAL | 1.6.3.3 |
| 파라미터 미적용 | YAML 노드 이름 | 1.9.7 |
| tf 없음 | view_frames | 5.2.5 |
| 시간이 0 | --clock·use_sim_time | 1.10.9 |
| 고쳤는데 안 바뀜 | ros2 pkg prefix | 4.5.8 |
| 느림 | 빌드 타입·RViz2·기록 | 12.6.8 |
| 주기가 튐 | 콜백·실행기 | 2.5.8 |
| 컨테이너에서 미발견 | 네트워크 모드 | 14.8.5 |
| 보안 켠 뒤 미연결 | 정책·인증서·시계 | 13.2.9 |
| 보안 켰는데 평문 | ROS_SECURITY_ENABLE이 정확히 소문자 true인지 — 1·True는 조용히 꺼진다 | 13.2.12.5 |
| 로봇이 안 움직임(에러 없음) | /cmd_vel 타입 — Jazzy diff_drive_controller는 TwistStamped만 받는다 | 6.5.12.1 |
/compressed가 없음 | 플러그인 미설치 — ros-base에는 없다 | 7.2.12 |
| bag이 비었는데 명령은 성공 | QoS 오버라이드 비호환 — ros2 bag info로 개수 확인 | 11.2.13.4 |
| RSP 켰는데 tf가 느림 | publish_frequency 기본 20 Hz | 5.5.13.1 |
| 여러 대가 서로 안 보임 | ros2 doctor hello — 표 두 개를 본다. 멀티캐스트 표만 차면 ROS 설정 문제 | 11.1.15.2 |
| 지도가 전혀 안 생김 | base_frame 기본값이 base_footprint — URDF에 그 링크가 있나 | 8.2.5 |
| YAML 줬는데 기본값 그대로 | 최상위 키와 노드 이름을 글자 그대로 대조 — /**:로 바꿔 보면 확정 | 11.1.14.3 |
| 컨테이너에서 디스커버리 실패 | 경계를 좁힌다 — 같은 Docker 네트워크 안은 정상 동작. 다른 네트워크·다른 호스트인지 먼저 확인 | 3.9.12.1 |
| 왜곡 보정이 안 먹음 | distortion_model 문자열 — fisheye는 ROS 상수가 아니다 | 7.3.11 |
| 대역 계산이 절반만 맞음 | point_step을 쓰라 — 필드 합의 1.8배가 실제 | 7.4.13.2 |
xacro 인자가 오류로 중단 | yes·on은 조건 값이 아니다 — true/false·1/0 | 5.4.12.2 |
| 시뮬에서 그리퍼 한쪽만 움직임 | SDF 변환에서 <mimic> 유실 의심 | 5.6.11 |
| Groot이 안 깔림 | apt에 없다 — 별도 배포본 | 8.6.12.1 |
micro_ros_agent 없음 | apt에 없다 — 소스 빌드 필요 | 6.8.13.1 |
| 호스트에서만 컨테이너 노드가 안 보임 | 차단이 아니라 가입 인터페이스 — 호스트가 물리 NIC에서 듣고 있다 | 3.9.12.3 |
| 외삽 오류가 나는데 원인 모름 | 메시지의 두 시각을 빼라 — 그 차가 시계 오차 크기 | 5.2.11.1 |
| 타임아웃을 늘려도 tf 조회 실패 | 타임아웃을 다 쓰고 실패 = 시계 오차 — 늘려도 소용없다 | 5.2.11.2 |
| tf 오류는 없는데 위치가 미묘하게 틀림 | Time() 조회는 오차가 있어도 항상 성공한다 — 묵은 변환을 쓰는 중 | 5.2.11.1 |
| 컴포지션했는데 더 느려짐 | const& 발행인지 본다 — unique_ptr가 아니면 순손해 | 2.7.13.2 |
| 복사 0 확인했는데 여전히 느림 | TRANSIENT_LOCAL인지 본다 — 무복사여도 지연 60배 | 2.7.13.4 |
| 구독자를 늘렸더니 CPU가 뜀 | UniquePtr 구독자 N개는 N−1회 복사 | 2.7.13.3 |
| 무선에서 큰 토픽이 전혀 안 옴 | QoS 문제가 아니다 — 조각 수를 보라. 256 KB·유실 5%면 0% | 3.9.13.3 |
RELIABLE인데 가끔 크게 늦음 | 재전송의 꼬리 지연 — p50이 아니라 p99를 보라 | 3.9.13.1 |
BEST_EFFORT로 바꿔도 그대로 | 큰 메시지에는 무효 — 크기를 줄여야 한다 | 3.9.13.4 |
| RT로 실행되는 줄 알았는데 아님 | controller_manager 로그의 Successful set up FIFO 확인 — 권한 없으면 경고만 | 12.2.12.4 |
| 격리 코어인데 지터가 남음 | IRQ는 isolcpus와 별개 — IRQBALANCE_BANNED_CPULIST | 12.2.12.2 |
| Python 노드가 조용히 종료 | 콜백 예외는 spin() 밖으로 전파된다 — 다중 스레드도 동일 | 2.8.11.2 |
| 거버너 설정이 안 먹음 | intel_pstate엔 performance·powersave 둘뿐 | 12.2.12.3 |
| Nav2를 실행했는데 로봇이 안 움직임 | Twist↔TwistStamped 불일치 — Nav2 기본은 Twist, Jazzy 컨트롤러는 TwistStamped | 8.1.14.1 |
| 평소엔 가는데 회복 거동에서만 멈춤 | enable_stamped_cmd_vel을 일부 노드에만 줬다(대상 9개) | 8.1.14.1 |
| 전역 계획 주기를 못 바꾸겠음 | 파라미터가 아니라 BT XML의 RateController | 8.1.14.2 |
| MoveIt 빌드에 폐기 경고가 쌓임 | 2.12부터 .h는 shim — .hpp를 포함하라 | 9.1.12.1 |
| 어댑터 플러그인 로드 실패 | 2.12는 Fix*가 아니라 Check*·Validate* | 9.2.12.1 |
| 로봇 동작이 여전히 거칠다 | 저크 제한은 기본 꺼짐 — has_jerk_limits: true | 9.2.12.4 |
| 계획 실패를 검출했는데 가끔 새어 나감 | FAILURE=99999는 양수 — val != SUCCESS로 판정 | 9.2.12.5 |
| 시작 상태 오류의 원인을 모름 | 로그가 관절 이름과 초과량을 출력한다 | 9.2.12.1 |
| 변환 후 시간·프레임이 사라짐 | header를 복사했는가 — cv_bridge·PCL·필터 역변환의 대표 사례 | 7.2.5 |
| 종단 지연을 못 재겠음 | 같은 원인 — header.stamp가 파이프라인 중간에서 끊긴다 | 7.7·7.8 |
| 크기·질량이 1000배 어긋남 | 단위 혼동 — ROS는 m·kg·rad다(mm·g 아님) | 5.3·7.1 |
| 여러 대에서만 tf가 계속 어긋남 | 시계 미동기 — 오류 메시지의 두 시각을 빼 보라 | 5.2.11.1 |
| 동기 콜백이 거의 안 불림 | slop이 아니라 큐 부족 — 하나 모자라면 성공률 1~3% | 7.7.12.2 |
| 동기는 되는데 정합 오차가 큼 | slop 과대 — 기준은 빠른 쪽 주기의 절반 | 7.7.12.1 |
RMW_IMPLEMENTATION이 안 먹음 | 이름 기반 런타임 로드라 오타를 컴파일러가 검출하지 않는다 | 2.1.12.3 |
| 노드끼리 조용히 통신 안 됨 | 벤더 결합 지점이 둘(rmw 구현·typesupport) — 둘 다 같아야 | 2.1.12.4 |
| 제어 루프에 지터가 있다 | rclcpp::spin_some(node) 자유 함수인지 확인 — 회당 143회 할당 | 12.3.12.1 |
| 무할당인데 여전히 복사가 있음 | 무복사와 무할당은 동시에 안 된다 — 무엇이 병목인지 정하라 | 12.3.12.3 |
| 주기가 목표보다 길다 | 콜백이 주기를 넘었는지 — 넘으면 주기가 곧 콜백 시간이 된다 | 2.5.13.4 |
| 가끔 크게 늦는 주기가 있다 | executor 종류를 보라 — Multi는 꼬리가 2배 | 2.5.13.3 |
| 컴포지션 후 서비스 호출이 멈춤 | executor 공유로 같은 노드가 됨 — 그룹 재설계 | 2.4.12.4 |
Reentrant로 바꾼 뒤 값이 깨짐 | 같은 콜백 여러 개가 상태 동시 접근 — 락이 필요 | 2.4.12.2 |
| 서비스가 응답을 안 함(발견은 됨) | 콜백 그룹을 보관했는지 — 안 하면 콜백이 영영 실행되지 않는다 | 2.4.13.4 |
| 스레드를 늘려도 연쇄 호출이 안 풀림 | 깊이 문제가 아니다 — 3개면 깊이 6까지 됐다 | 2.4.13.1 |
| 카운터·통계 값이 작게 나온다 | Reentrant 그룹인지 확인 — 락 없으면 절반이 유실된다 | 2.9.10.1 |
| 경쟁 조건을 찾고 싶다 | TSAN 빌드 — ME 구성에서는 경고 0건(오탐 없음) | 2.9.10.2 |
| "이것을 어떻게 재나" | 계측 도구 다섯(할당·겹침·주기·링크·유실 주입) | 11.7.13 |
| 측정한 것을 회귀로 굳히고 싶다 | 단언 넷 — 기준선·동시성 계약·꼬리·TSAN | 14.5.11 |
| 재시작을 반복하니 느려졌다 | df -h /dev/shm — 100%면 SHM이 UDP로 격하된 것 | 3.3.12.3 |
SHM Transport is not supported 로그 | 플랫폼 문제가 아니라 /dev/shm 고갈일 수 있다 | 3.3.12.2 |
| XML 프로파일이 적용되지 않는다 | 오류가 안 난다 — get_actual_qos()를 출력하라. is_default_profile 확인 | 3.7.12.3 |
| 코드에 depth 10인데 큐가 크다 | XML이 더 크면 XML이 우선한다(max) | 3.7.12.1 |
| 벤더 바꾼 뒤 늦은 구독자가 값을 못 받음 | SystemDefaultsQoS() 내구성 차이 — 내구성을 코드에 명시 | 3.8.12.2 |
| Cyclone에서 노드가 전혀 안 뜸(종료 134) | 설정 파일 오류 — stderr에 줄 번호가 출력된다 | 3.8.12.1 |
| 도메인을 그룹으로 격리하려는데 안 됨 | 멀티캐스트 그룹은 하나 — 포트 규칙만 도메인을 가른다 | 3.2.12.2 |
| 조각 수 계산이 실측과 안 맞음 | 조각 크기는 경로 MTU 의존(1416 B ↔ 13.5 KB) | 3.2.12.3 |
| 회귀 시험이 늘 통과한다 | 일부러 어겨서 실패하는지 확인하라 | 14.5.12.2 |
| 시험이 실패했는데 이유가 불명확하다 | 무관한 예외일 수 있다 — 메시지 출처를 보라 | 14.5.12.3 |
-p로 준 값이 적용되지 않는다 | 어느 파일이 그 노드를 이름으로 지정했는지 찾아라 — 구체성이 우선한다 | 14.4.11.3 |
| 나중 오버라이드 파일이 적용되지 않는다 | /**:이면 앞선 /노드이름:을 못 덮는다 | 14.4.11.2 |
| 노드는 실행 중인데 아무 반응이 없다 | 라이프사이클 상태 확인 — finalized면 재시작만이 답 | 1.12.10.3 |
| 활성화 실패 후 재시도가 안 된다 | unconfigured까지 떨어졌다 — configure부터 | 1.12.10.2 |
| 부팅 실패인데 일부 노드가 실행되고 있다 | 관리자는 되돌리지 않는다 — RESET·SHUTDOWN 명시 호출 | 1.12.11.2 |
may be misconfigured by bond | 노드가 bond를 안 만든다 — bond_timeout: 0.0 또는 Nav2 기반 클래스 | 1.12.11.3 |
| 노드가 사라졌는데 재시작이 안 된다 | SIGTERM 종료는 코드 0 — on-failure가 검출하지 않는다 | 14.8.13.1 |
| systemd는 정상인데 로봇이 안 움직인다 | 프로세스는 정상이고 상태가 종료된 것 — 상태 감시 필요 | 14.8.13.2 |
| 집계기를 켰더니 전체가 Stale | 분석기 매칭 실패 — 이름은 <노드>: <태스크> | 6.9.14.3 |
| 진단은 OK인데 노드가 종료돼 있다 | 개별 항목은 마지막 값이 남는다 — 그룹으로 판정 | 6.9.14.2 |
| 제어 루프에 지터가 크다 | 출력되는 로그가 있는지 — 최대 188 µs | 1.11.12.1 |
| 시뮬 로그 시각이 데이터와 안 맞음 | {time}은 벽시계 — 본문에 now()를 출력하라 | 1.11.12.4 |
| Python 노드 주기가 가끔 크게 지연된다 | 출력 로그 — 최대 8 ms. throttle은 대책이 아니다 | 2.8.12.2 |
| 억제한 로그인데 여전히 느리다 | Python은 인자를 평가한다 — is_enabled_for로 감싸라 | 2.8.12.3 |
| Python에서 스레드를 늘렸는데 더 느리다 | 콜백이 계산만 하면 GIL로 손해 — 대기가 있어야 이득 | 2.8.12.7 |
| Python 타이머 꼬리가 C++보다 넓다 | 정상 — p99가 약 5배. 드리프트는 같다 | 2.8.12.8 |
| Python 노드가 느린데 발행을 줄여도 그대로 | 실제 비용은 메시지 객체 생성(237배) — 재사용하라 | 2.8.12.9 |
| Python으로 고주기 제어가 안 됨 | spin_once가 328 µs — 100 Hz까지가 현실적 | 2.8.12.9 |
늦게 기동된 노드가 과거 데이터를 못 받는다 — QoS는 TRANSIENT_LOCAL로 표시되는데 | system_default면 보고값을 믿지 마라 — 동작은 VOLATILE이다 | 1.6.12 |
Python에서 ClockQoS를 못 찾겠다 | rclpy에 없다 — QoSProfile(depth=1, reliability=BEST_EFFORT)로 직접 | 2.8.12.10 |
| C++ 액션 클라이언트가 첫 피드백을 놓친다 — Python으로 옮기면 사라진다 | rclpy는 이 손실 계열에 완전히 면역(구현 선택 차이, 프로토콜 결함 아님) | 2.8.12.11·1.8.13 |
param set은 성공인데 동작이 안 바뀐다 | 콜백 없는 노드는 무시한다 — 저장값만 바뀐 것 | 0.7.11.1 |
강제 종료한 노드가 node list에 계속 보인다 | 강제 종료면 22초 남는다 — 정상 종료였다면 즉시 사라진다 | 0.7.11.2 |
hz가 실제보다 높게 나온다 | 창이 옛 데이터를 기억한다 — --window 20으로 다시 | 0.7.12.2 |
hz 화면에 값이 표시돼 있는데 데이터가 안 온다 | 멈추면 출력만 끊긴다 — 값은 마지막 것 | 0.7.12.3 |
ROS_DOMAIN_ID를 줬더니 노드가 전혀 기동되지 않는다 | 233 이상이면 포트 계산이 넘친다 — 0~232만 유효 | 3.1.13 |
__로 시작하는 토픽을 리매핑할 수 없다 | 예약어 자리라 규칙 왼쪽에 못 쓴다 — 이름 자체는 만들어진다 | 1.1.12 |
| 무선에서 큰 토픽이 QoS를 바꿔도 안 온다 | 조각 수십 개부터는 둘 다 무력하다 — 크기를 줄여라 | 3.9.14.4 |
| 도달률 예측이 실제보다 후하게 나온다 | $(1-p)^N$은 상한이다 — 5%·64 KB에서 10% 예측에 실측 0% | 3.9.14.3 |
| 책의 실측 수치를 내 환경에 옮겨도 되나 | 절 첫머리의 측정 환경을 보라 — 배포판·rmw·버전이 적혀 있다 | 목차 5 |
| 사내 rosdep 규칙이 적용되지 않는다 | 파일 번호를 20보다 작게 — 먼저 선언한 쪽이 우선한다 | 4.6.11 |
CMakeLists.txt가 없다는데 파이썬 패키지다 | <build_type>을 빠뜨렸다 — 기본값이 catkin | 4.4 |
Waitable을 구현했더니 폐기 경고가 대량 출력된다 | 포인터→참조, 비-const→const 서명으로 | 2.10.11.1 |
ExecutorOptions().context(...)가 컴파일 안 된다 | 체이닝이 아니라 멤버다 — opts.context = ctx | 2.10.11.2 |
ros2 control 전체가 없다 | 명령이 없는 것이 아니라 ros2controlcli 패키지가 없다 | 6.3.11 |
fake_components를 못 찾는다 | Jazzy엔 mock_components/GenericSystem만 있다 | 6.2 |
create_jump_callback이 컴파일 안 된다 | 인자가 셋이다 — threshold를 넘겨라 | 1.10.11 |
| 서비스 생성에 폐기 경고가 출력된다 | rmw_qos_profile_t 오버로드다 — rclcpp::ServicesQoS()로 | 2.4 |
realtime_tools 헤더에 #warning | .h → .hpp | 6.4.5 |
LivelinessPolicy.RMW_QOS_POLICY_LIVELINESS_UNKNOWN이 없다 | rclpy 별칭 오타 — LivelinessPolicy.UNKNOWN을 쓰라 | 2.8.13.4 |
declare_parameter에 폐기 경고 | 이름만 주면 안 된다 — 기본값이나 타입을 함께 | 2.8.13.2 |
ros2 run --help에 --ros-args가 없다 | 노드로 넘기는 인자라 정상 — 정본은 노드 자신 | A.1.15.3 |