본문으로 건너뛰기

M08.02 · Xacro 매크로·자산 경로·패키지 구성

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

전체 커리큘럼

학습 안내

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

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

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

학습 목표

  • Xacro 소스·확장된 URDF·설치된 패키지 자산을 구분하고 실행에 사용한 산출물의 출처를 설명한다.
  • 작은 Xacro 매크로의 인자와 수식을 따라 형상·origin·이름의 확장 결과를 계산한다.
  • 가상 메시 URI와 패키지/설치 기록에서 자산 탐색 실패를 진단하고 문법·의미·물리 검증의 차이를 설명한다.

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

권장 선수

M01의 경로와 빌드, M05.01의 패키지/overlay, M08.01의 URDF 요소가 선수다. ROS 2 Jazzy 문서를 기준으로 종이 확장과 가상 경로를 읽는다. 실제 패키지 설치·ROS 빌드·메시 로딩은 필요 없다. 이미 알고 있다면 직접 열어볼 수 있습니다.

설명 필수

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

반복을 줄이는 언어와 최종 모델

Xacro는 XML에서 상수·수식·매크로 등을 사용하여 반복을 줄이는 전처리 언어다. 작성한 .xacro 파일을 처리하면 일반 URDF XML을 얻는다. 소비자가 Xacro를 직접 처리하는지, Launch 단계에서 확장한 문자열을 넘기는지, 미리 만든 URDF를 읽는지 구분한다. Xacro 원본을 고쳤어도 실행기가 옛 확장 파일을 읽으면 변화가 나타나지 않는다. 원본과 생성물, 실제로 사용한 파일/문자열의 출처를 연결해야 한다.

property는 재사용할 값을 정의하고, macro는 인자를 받아 XML 요소 묶음을 만든다. 프로그래밍 언어의 함수처럼 비유할 수 있지만 반환되는 것은 실행된 로봇 동작이 아니라 모델의 XML 구조다. 이름과 매개변수를 같게 썼다는 이유로 두 링크가 자동으로 연결되는 것도 아니다. 확장 결과에 중복 이름이나 끊어진 트리가 생기면 별도로 고쳐야 한다. 매크로 재사용은 오타를 줄일 수 있지만 잘못된 가정을 여러 곳에 복제할 수도 있다.

다음은 단일 링크의 표시 형상만 만드는 완전한 작은 Xacro다. 길이는 m이며 물리 모델이나 구동 모델로 완성된 예가 아니다. xmlns:xacro는 xacro 접두사의 XML 네임스페이스를 선언한다. property len은 0.2이고, macro box_link는 name과 length 인자를 사용한다.

<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="paper">
  <xacro:property name="len" value="0.2"/>
  <xacro:macro name="box_link" params="name length">
    <link name="${name}">
      <visual>
        <origin xyz="${length/2} 0 0"/>
        <geometry><box size="${length} 0.1 0.1"/></geometry>
      </visual>
    </link>
  </xacro:macro>
  <xacro:box_link name="arm" length="${len}"/>
</robot>

${...}는 값이나 수식을 계산하여 넣는 표기다. 이번 호출은 name=arm, length=0.2이므로 링크 이름은 arm, box 크기는 0.2/0.1/0.1 m, origin은 (0.1,0,0) m가 된다. 아래는 확장될 핵심 URDF 구조를 사람이 읽도록 정리한 예상 결과이며 실제 Xacro 실행 출력의 바이트 복사본은 아니다.

<robot name="paper">
  <link name="arm">
    <visual>
      <origin xyz="0.1 0 0"/>
      <geometry><box size="0.2 0.1 0.1"/></geometry>
    </visual>
  </link>
</robot>

len을 0.4로 바꾸면 크기의 x값은 0.4, origin의 x값은 0.2다. 그런데 이 매크로에는 collision과 inertial이 없다. 표시 형상을 바꿨다고 질량과 관성이 함께 갱신됐다는 뜻은 아니다. 물리 모델을 만들 때는 M08.01/04의 기준에 따라 입력과 식, 밀도/질량 가정을 함께 설계한다. 공식 Xacro 튜토리얼에서 수식 재사용의 편리함과 최종 모델의 의미를 나누어 읽는다.

경로는 어느 단계에서 누가 해석하는가

가상 패키지 paper_description의 소스에는 package.xml, CMakeLists.txt, urdf/model.urdf.xacro, meshes/body.stl이 있다고 하자. package.xml은 패키지 메타데이터와 의존성을, CMakeLists.txt는 빌드/설치 규칙을 기술한다. 소스 폴더에 메시가 존재한다는 사실과 설치 환경에서 소비자가 찾는다는 사실은 다르다. 일반적인 자산 설치 경로는 패키지의 share 디렉터리 아래다. 아래는 이미 준비된 ament_cmake 패키지의 자산 설치 규칙 부분만 보여 주는 발췌이며 완전한 빌드 파일은 아니다.

install(DIRECTORY urdf meshes
        DESTINATION share/${PROJECT_NAME})

프로젝트/패키지 이름이 paper_description이면 일반적인 분리 설치공간에서 install/paper_description/share/paper_description 아래에 자산이 놓일 수 있다. merged install 등 레이아웃은 다를 수 있으므로 문자열로 한 형태를 하드코딩하지 않고 실제 패키지 탐색 결과를 확인한다. 올바른 overlay를 읽었는지도 M05.01과 연결한다.

메시 URI package://paper_description/meshes/body.stl은 해당 패키지의 자산을 찾도록 소비자에게 전달하는 표기다. 이를 해석하는 도구가 패키지를 찾고 파일을 읽을 수 있어야 한다. Xacro가 성공했다고 모든 URI가 실제로 로드됐다는 뜻은 아니다. 일반적인 Xacro 전처리는 메시 내용을 읽어 충돌이나 형상까지 검증하지 않는다. 텍스트 경로가 생성물에 남아 있다가 RViz나 임포터 등의 다음 소비자가 읽는 경우를 구별한다.

반면 $(find paper_description) 같은 Xacro 치환은 패키지 share 경로를 전처리 중 찾는 데 쓰일 수 있다. 예를 들어 다른 Xacro 파일을 include하는 경로를 구성할 때 적용한다. 같은 package 이름이라도 전처리의 환경과 나중 소비자의 환경이 다르면 서로 다른 설치공간을 볼 수 있다. 상대 경로도 무엇을 기준으로 해석하는지 소비자마다 확인하고, 현재 작업 폴더에 우연히 파일이 있다는 이유로 이식성이 입증됐다고 하지 않는다.

생성 성공 뒤에도 검토할 것이 남는다

먼저 전처리의 성공/오류와 실제 생성물을 확인하고, 그다음 XML/URDF 의미와 트리, 자산 탐색, 형상/물리 정보를 검사한다. 텍스트 편집기에서 색이 입혀지거나 XML 파서가 읽었다는 사실은 Xacro의 변수 평가·패키지 탐색·URDF 의미를 모두 검증한 것은 아니다. 파일을 만드는 중 오류가 나 빈 생성물이 남았다면 이전 성공 파일이나 일부 출력과 혼동하지 않는다. 생성 성공과 내용 확인 뒤 소비자에게 넘기는 흐름을 설계한다.

출처 기록에는 원본 Xacro와 include 파일·매크로 인자/설정·Xacro 버전·사용한 패키지/자산 개정·확장 URDF 식별자를 남긴다. 자동 생성물만 고치면 다음 확장에서 사라질 수 있다. 반대로 원본만 검토하고 실제 산출물을 보지 않으면 조건부/인자 때문에 예상과 다른 링크를 놓칠 수 있다. 기존 3.1 모델 사슬의 구조를 재사용할 때에도 어떤 원본과 확장이 적용되었는지 확인한다.

학습 범위와 한계

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

실습 필수

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

입력은 위 작은 Xacro와 가상 설치 기록이다. 기록에는 소스 meshes/body.stl이 있지만 설치 share에는 urdf 폴더만 있다. 실제 소비자는 옛 overlay의 paper_description을 찾는다. 메시 URI는 package://paper_description/meshes/body.stl이다.

  1. Xacro 원본·예상 확장 URDF·설치 자산·소비자가 읽는 모델을 나누어 흐름도를 그린다. 원본 수정만으로 화면 변화가 보장되지 않는 이유를 적는다.
  2. len=0.2와 0.4의 이름/크기/origin을 계산한다. 같은 name=arm으로 매크로를 두 번 호출하면 중복 이름과 트리 검토가 필요한 이유, 물리 정보가 아직 없는 이유를 설명한다.
  3. 주어진 자산 탐색 실패에 필요한 확인 증거를 고른다. 소스 존재·설치 규칙/산출물·패키지 발견 경로·소비자 오류 중 어떤 연결이 빠졌는지 쓴다.

실제 파일 설치나 ROS 실행은 하지 않는다. 막히면 URI가 문자열로 생성되는 단계와 실제 파일을 읽는 단계를 나눈다. 예상 확장을 실제 전처리 실행 결과로 표시하지 않는다.

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

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

학습 범위와 한계

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

평가·해설 필수

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

확인 문제 Q1

.xacro 원본을 고쳤는데 실행기는 이전 model.urdf를 읽는다. 왜 화면이 바뀌지 않을 수 있는가? Xacro와 URDF, 설치 자산의 역할을 구분하라.

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

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

확인 문제 Q2

본문 매크로를 name=tool, length=0.6으로 호출하면 링크 이름과 box 크기/origin은 무엇인가? 이 변화만으로 관성이나 collision도 갱신되었다고 할 수 있는가?

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

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

확인 문제 Q3

Xacro 확장은 성공했지만 메시 로딩은 실패했다. package URI·설치 share·overlay 및 모델/자산 버전에서 무엇을 확인할 것인가? XML 파싱 성공이 모든 단계를 보장하지 않는 이유를 설명하라.

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

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

학습 범위와 한계

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

참고 자료

학습 확인

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

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

학습 이동

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

전체 목차로 돌아가기 →

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