본문으로 건너뛰기

M08.05 · JointState·robot_state_publisher·tf 연결

단위별 목표·권장 선수와 자료 준비 상태를 확인하고, 공개된 본문과 활동을 읽고 준비 상태를 확인할 수 있습니다.

전체 커리큘럼

학습 안내

본문을 읽고 장비 없는 기본 실습·세 확인 문제와 해설로 이해를 확인하세요.

예상 학습 시간: 미정. 이 페이지 방문이나 자료 열람으로 완료·숙달을 자동 부여하지 않습니다.

현재 경로·이전·다음 단위 확인 ↓

학습 목표

  • JointState의 이름·배열 길이·단위·기록 시각을 검사하여 가상 상태 메시지를 올바르게 해석한다.
  • URDF와 관절 상태로 계산하는 고정/가동 상대변환을 구분하고 연결된 프레임의 점 좌표를 계산한다.
  • namespace·프레임 접두사·발행자·시간 범위의 증거를 이용하여 tf 연결 실패의 원인과 추가 확인을 제안한다.

아래 설명·실습·문제로 각 학습 목표를 확인하세요.

권장 선수

M05.05~06의 tf/시간과 M06.01의 열벡터 좌표 합성, M08.01~03의 URDF 트리가 선수다. 기본 활동은 합성 메시지와 종이 좌표 계산이며 ROS 설치나 실제 관절 동작이 필요하지 않다. 이미 알고 있다면 직접 열어볼 수 있습니다.

설명 필수

세 목표에 대응하는 검수된 설명·예제를 읽습니다.

이름이 값의 의미를 정한다

JointState는 여러 관절의 상태를 함께 나타내는 메시지다. 이름 배열 name과 위치 position, 속도 velocity, 노력 effort 배열이 있다. 같은 인덱스의 이름과 값이 한 관절을 가리킨다. 회전 관절의 위치/속도/노력 단위는 rad, rad/s, N·m이고 직선 관절은 m, m/s, N이다. effort를 전류 A로 곧바로 해석하지 않는다. 드라이버가 전류를 제공한다면 토크 추정과 보정의 별도 계약이 필요하다.

가상 메시지 name=[elbow, shoulder], position=[0.2, 0.5]는 팔꿈치가 0.2 rad, 어깨가 0.5 rad라는 뜻이다. URDF에서 shoulder가 먼저 쓰였다고 첫 숫자를 어깨에 배정하면 틀린다. 소비자가 원하는 순서가 [shoulder, elbow]라면 이름으로 찾아 [0.5, 0.2]로 재정렬한다. 두 관절이 회전 관절이라고 가정했다. 직선 관절을 섞으면 숫자가 같아도 단위가 달라진다.

공식 메시지 계약상 배열들은 같은 길이이거나 비어 있어야 한다. velocity=[]는 속도가 제공되지 않았다는 뜻이며 속도가 0이라고 관측했다는 뜻이 아니다. position이 비어 있어도 메시지 형식상 가능한 경우가 있지만, 관절 위치로 링크 변환을 계산할 이번 경로에는 필요한 위치가 있어야 한다. name 두 개에 position 한 개만 담은 메시지는 어느 관절 값이 빠졌는지 모호하다. 중복 이름, 모르는 이름, 비유한 값도 응용 계층의 입력 검사 대상으로 둔다. 특정 노드가 모든 오류를 자동 검출한다고 가정하지 않는다.

header.stamp는 상태의 기록 시각이다. 한 메시지의 상태들은 같은 시각을 나타내야 한다. 비동기 센서들을 묶는다면 시간 정렬이나 추정 정책 및 남는 오차를 기록한다. 수신 시각을 기록 시각인 것처럼 덮어쓰면 오래된 측정이 새것처럼 보인다. 시뮬레이션 시각과 시스템 시각을 섞어 숫자만 빼는 것도 피한다. Jazzy 메시지 원문을 단위와 배열 계약의 기준으로 삼는다.

상태에서 링크 변환으로 가는 경로

robot_state_publisher를 줄여 RSP라고 부르겠다. RSP는 URDF 기구학 트리와 joint_states를 받아 링크 사이의 변환을 계산한다. URDF만으로 움직이는 관절의 현재 위치를 알아내지는 못한다. GUI가 만든 가상 관절값도 입력할 수 있지만 이것이 실제 센서 측정의 증거는 아니다. RSP는 모터 명령이나 물리 시뮬레이터를 대신하지 않는다. 위치 목표를 보냈다는 기록과 그 위치가 측정됐다는 기록도 구별한다.

관절 상태가 TF가 되는 경로: JointState → robot_state_publisher → TF 변환 → 소비자/RViz.그림 원본 크기로 보기

그림 M08.05-1. 각 칸은 서로 다른 역할/근거다. 아래 방향은 자료/처리의 연결이며 실제 성공을 자동으로 보장하지 않는다. 직접 제작한 개념도이며 본문의 조건과 함께 읽는다.

Jazzy RSP는 fixed 관절의 상대변환을 tf_static에, 갱신된 가동 관절의 변환을 tf에 발행한다. fixed는 부모와 자식 사이가 변하지 않는다는 뜻이다. 부모가 움직이면 자식의 세계 위치도 움직인다. 팔에 고정한 카메라는 팔에 대해서는 정적이지만 바닥에 대해서는 움직인다. 따라서 ‘tf_static에 있으므로 세계에서 정지’라고 판단하지 않는다.

종이 예제로 base→arm은 원점이 같은 z축 회전 관절, arm→camera는 회전 없이 +x로 0.2 m인 fixed 관절이라고 하자. 회전값 q의 단위는 rad, q의 허용 범위는 [−π,π]다. camera에서 표시한 점 p_C=(0.1,0,0) m를 base에서 표현한다. 열벡터를 쓰고 Rz(q)는 camera/arm과 정렬된 벡터를 base의 축으로 회전시키는 행렬이다. 먼저 고정 이동을 더한 뒤 회전한다.

pB=Rz(q)[pC+(0.200)].p_B=R_z(q)\left[p_C+\begin{pmatrix}0.2\\0\\0\end{pmatrix}\right].

q=π/2이면 괄호 안은 (0.3,0,0), 회전 후는 (0,0.3,0) m다. 카메라 원점만 보면 (0,0.2,0) m다. q=0으로 바꾸면 점은 (0.3,0,0)이지만 arm→camera의 0.2 m는 그대로다. 이 변형이 정적 상대변환과 동적 합성 결과의 차이를 보여 준다. 계산하는 것은 점 좌표의 source=camera, target=base 방향이다. 역방향 조회에서는 역변환을 써야 하며 이동 부호만 임의로 바꾸지 않는다.

같은 문자열과 같은 시각을 연결한다

노드 namespace는 ROS 그래프 이름의 범위를 만든다. frame_id는 메시지 안에서 프레임을 지칭하는 문자열이므로 namespace를 /r1로 정했다고 base가 자동으로 r1/base가 되지는 않는다. RSP의 frame_prefix="r1/" 같은 명시적 설정으로 출력 프레임을 구분할 수 있지만 센서 header.frame_id와 다른 발행자도 그 계약에 맞아야 한다. 단순히 토픽 이름을 바꾸어 프레임 불일치를 고쳤다고 보지 않는다.

두 로봇이 같은 tf 버퍼에 같은 child 프레임을 서로 다른 부모/값으로 발행하면 어느 관계를 쓸지 충돌한다. 각 변환의 담당 발행자를 정하고 실물/가상 모델의 프레임을 일관되게 구분한다. RSP가 계산하는 로봇 내부 트리와 world→base 같은 외부 위치 추정도 구분한다. URDF의 루트가 base라면 RSP가 모르는 world의 위치를 저절로 제공하지 않는다. 그 관계는 고정 배치나 위치 추정 등 과제에 맞는 별도 근거가 필요하다.

시간도 경로의 일부다. 합성 로그에서 필요한 동적 변환이 ROS 시각 1.0~1.1 s에만 있고 1.2 s의 점을 변환하려 한다면 요청 시각의 자료가 없다. 최신 1.1 s를 쓰는 것은 다른 시각의 근사라는 새 판단이며 원래 요청에 대한 정확한 답이 아니다. 시계 종류/초기화, 메시지 stamp, 지연, 버퍼 범위와 연결 경로를 조사한다. tf2가 모든 과거/미래 시각의 변환을 항상 가진다는 뜻으로 ‘시간에 따른 변환’을 읽지 않는다.

이름·배열→URDF 관절→상대변환→프레임 경로→시각의 순서로 좁혀 가면 화면이 이상한 원인을 분리할 수 있다. 기존 3.6 브리지에서는 교육용 명령 계약과 측정 상태를 구분한 뒤 이 흐름을 연결한다. 아래는 실제 ROS 출력이 아닌 합성 자료다.

관련 기존 자료 · 보충해서 읽기

  • 기존 상세 본문 · 관련 기존 자료 · 보충 참고

    3.6 ROS 2 JointState 브리지

    목표 일부 관련

    기존 자료의 관련 범위이며 신규 목표 전체의 품질 검수는 아직 진행하지 않았습니다.

  • 기존 상세 본문 · 관련 기존 자료 · 보충 참고

    4.3 TF2 트리 설계

    목표 일부 관련

    기존 자료의 관련 범위이며 신규 목표 전체의 품질 검수는 아직 진행하지 않았습니다.

학습 범위와 한계

기본 설명·예제가 준비되었습니다. 기존 보충 자료의 범위와 구별하세요.

실습 필수

장비 없는 실습을 수행하고 관찰·계산 근거를 해설과 비교합니다.

입력 A는 name=[elbow,shoulder], position=[0.2,0.5], velocity=[], effort=[]이고 두 관절은 회전형이다. 같은 시계의 stamp=1.0 s에 함께 기록했다고 가정한다. 입력 B는 같은 name에 position=[0.2]다. 좌표 계산은 본문의 별도 1관절 base/arm/camera 모형을 쓴다.

  1. A를 [shoulder,elbow] 순서로 해석하고 속도를 알 수 있는지 판정한다. B의 계약 위반을 설명한다.
  2. 모형에서 q=π/2일 때 카메라 원점과 p_C=(0.1,0,0)의 base 좌표를 계산한다. 어떤 상대변환이 tf_static/tf에 해당하며 q=0에서 무엇이 바뀌는지 적는다.
  3. 로그에는 namespace=/r1, frame_prefix는 빈 문자열, 발행 프레임은 base/arm/camera, 센서는 r1/camera를 요구한다고 되어 있다. 동적 자료 범위는 1.0~1.1 s인데 요청은 1.2 s다. 이름과 시간의 서로 다른 결함을 찾고 추가 기록 두 가지를 제안한다.

관찰은 숫자 정렬, 좌표, 진단 근거의 세 칸에 적는다. 실패하면 이름 문제와 시각 문제를 한꺼번에 ‘QoS 문제’로 단정하지 말고 각 층의 입력을 다시 확인한다. 실제 장치나 ROS 실행은 필요하지 않다.

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

관련 기존 자료 · 보충해서 읽기

  • 기존 실습 원고 · 관련 기존 자료 · 보충 참고

    [SIM→HW] [SAFETY] 실습 3-3: ROS 2 JointState 안전 브리지

    목표 일부 관련

    실습 원고 참조. 로컬/ROS/Isaac/GPU/실물 실행과 장비 없는 기본 경로의 목표 검수는 미실시. 연결된 원고의 환경·절차를 확인하세요. 원고 열람은 실습 수행을 뜻하지 않습니다.

  • 코드·원본 파일 · 관련 기존 자료 · 보충 참고

    03_so101_kinematics_teleop/code/ros2_ws/src/so101_training_bridge/CMakeLists.txt

    목표 충족 범위 없음

    파일 열람은 코드 실행·실습 완료를 뜻하지 않습니다.

  • 코드·원본 파일 · 관련 기존 자료 · 보충 참고

    03_so101_kinematics_teleop/code/ros2_ws/src/so101_training_bridge/package.xml

    목표 충족 범위 없음

    파일 열람은 코드 실행·실습 완료를 뜻하지 않습니다.

  • 코드·원본 파일 · 관련 기존 자료 · 보충 참고

    03_so101_kinematics_teleop/code/ros2_ws/src/so101_training_bridge/scripts/safe_joint_bridge.py

    목표 충족 범위 없음

    파일 열람은 코드 실행·실습 완료를 뜻하지 않습니다.

  • 코드·원본 파일 · 관련 기존 자료 · 보충 참고

    03_so101_kinematics_teleop/code/ros2_ws/src/so101_training_bridge/src/joint_state_monitor.cpp

    목표 충족 범위 없음

    파일 열람은 코드 실행·실습 완료를 뜻하지 않습니다.

학습 범위와 한계

기본 실습은 장비 없이 수행합니다. 실제 장비·GPU 실증을 완료했다는 뜻은 아닙니다.

평가·해설 필수

목표별 세 서술문항에 답하고 해설·판정 기준으로 자기검토합니다.

확인 문제 Q1

name=[slide,hinge], position=[0.03,0.4], velocity=[], effort=[]이다. slide는 직선, hinge는 회전 관절이다. [hinge,slide]로 읽을 때 값/단위는 무엇이고 빈 속도는 무엇을 뜻하는가? stamp에 필요한 조건도 설명하라.

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

확인 문제 Q2

본문 모형에서 q=0과 q=π/2의 카메라 원점 위치를 구하라. arm→camera가 tf_static에 있어도 base에서 카메라가 움직이는 이유와 RSP의 역할 한계를 설명하라.

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

확인 문제 Q3

namespace만 /r2로 바꾼 RSP가 camera를 발행하는데 소비자는 r2/camera를 요청한다. 이를 고친 뒤에도 요청 시각 5.2 s에 필요한 동적 자료가 5.0~5.1 s에만 있다. 각각의 실패와 추가 확인을 설명하라.

0 / 8,000자 · 확인하면 이 브라우저에 저장

답안을 작성하고 확인하기를 한 번 선택하면 해설·판정 기준을 열어볼 수 있습니다.

관련 기존 자료 · 보충해서 읽기

학습 범위와 한계

서술답안과 해설이 준비되었습니다. 자기검토와 학습 완료는 숙달 인증과 별개입니다.

참고 자료

학습 확인

실습과 세 문항의 답안을 해설과 비교한 뒤, 이 단위의 학습 완료를 직접 기록할 수 있습니다. 자기검토·학습 완료는 자동 채점이나 숙달 인증과 별개입니다.

실습1개·확인 문제3개의 답안을 저장하고 각각 자기검토를 기록하세요.

학습 이동

학습 단계 순서 · 공통 과정 이후 전문화 선택

전체 목차로 돌아가기 →

신규 활동의 답안은 이 브라우저의 통합 학습 기록에 저장합니다. 기존 화면의 답안·진도는 원래 키를 유지합니다. AI 강사는 현재 단위의 준비 상태·부족한 범위와 연결된 실제 자료를 참고합니다.