AEGLOSLAB ROS 2 Jazzy 대전

부록 부록

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 정책 요약

정책값의미장
ReliabilityRELIABLE / BEST_EFFORT / BEST_AVAILABLE재전송 여부1.5.3.2
DurabilityTRANSIENT_LOCAL / VOLATILE / BEST_AVAILABLE늦은 구독자에게 과거 전달1.5.3.3
HistoryKEEP_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
LivelinessAUTOMATIC / 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:

발행자 ↓ / 구독자 →RELIABLEBEST_EFFORT
RELIABLE✅✅
BEST_EFFORT❌✅

Durability:

발행자 ↓ / 구독자 →TRANSIENT_LOCALVOLATILE
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)일반
SensorDataQoSBEST_EFFORT·VOLATILE·KEEP_LAST(5)센서
ServicesQoSRELIABLE·VOLATILE·KEEP_LAST(10)서비스
ParametersQoSRELIABLE·VOLATILE·KEEP_LAST(1000)파라미터
RosoutQoSRELIABLE·TRANSIENT_LOCAL·KEEP_LAST(1000)·lifespan 10초/rosout
ClockQoSBEST_EFFORT·VOLATILE·KEEP_LAST(1)/clock — 유실 허용·이력 없음(1.6.11)
SystemDefaultsQoSRMW 기본값위임
BestAvailableQoSBEST_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 용도별 권장 구성

데이터권장근거
라이다·카메라·IMUBEST_EFFORT·depth=1~5최신이 중요(1.6.3.1)
/cmd_velRELIABLE·depth=1손실 방지 + 최신
/tfRELIABLE·depth=100 정도이력 필요(5.1.5)
/tf_staticTRANSIENT_LOCAL·RELIABLE늦은 구독자
/mapTRANSIENT_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_IMPLEMENTATIONRMW 선택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_PEERSlocalhost 외에 추가로 통신할 호스트 — IP나 호스트명을 ;로 구분해 나열. 값 검증은 RMW에 맡긴다(실행 확인: rcl/discovery_options.h)3.9.4
ROS_DISCOVERY_SERVERDiscovery 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
SRDFMoveIt 설정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 --clock10.2.6·11.3.5
전체 일관성일부만 켜면 외삽 오류5.2.4
시계 동기NTP·PTP7.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_IMPLEMENTATION1.5.8
토픽은 있는데 데이터 없음ros2 topic info -v(QoS)1.6.3.1
/map이 안 보임Durability TRANSIENT_LOCAL1.6.3.3
파라미터 미적용YAML 노드 이름1.9.7
tf 없음view_frames5.2.5
시간이 0--clock·use_sim_time1.10.9
고쳤는데 안 바뀜ros2 pkg prefix4.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 Hz5.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/05.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_CPULIST12.2.12.2
Python 노드가 조용히 종료콜백 예외는 spin() 밖으로 전파된다 — 다중 스레드도 동일2.8.11.2
거버너 설정이 안 먹음intel_pstate엔 performance·powersave 둘뿐12.2.12.3
Nav2를 실행했는데 로봇이 안 움직임Twist↔TwistStamped 불일치 — Nav2 기본은 Twist, Jazzy 컨트롤러는 TwistStamped8.1.14.1
평소엔 가는데 회복 거동에서만 멈춤enable_stamped_cmd_vel을 일부 노드에만 줬다(대상 9개)8.1.14.1
전역 계획 주기를 못 바꾸겠음파라미터가 아니라 BT XML의 RateController8.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: true9.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
측정한 것을 회귀로 굳히고 싶다단언 넷 — 기준선·동시성 계약·꼬리·TSAN14.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 µs1.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>을 빠뜨렸다 — 기본값이 catkin4.4
Waitable을 구현했더니 폐기 경고가 대량 출력된다포인터→참조, 비-const→const 서명으로2.10.11.1
ExecutorOptions().context(...)가 컴파일 안 된다체이닝이 아니라 멤버다 — opts.context = ctx2.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 → .hpp6.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