ROS 시리즈: Chapter 6 로봇 모델링

기사 디렉토리

6. 로봇 시스템 시뮬레이션

1. 개요

**로봇 시스템 시뮬레이션:** 컴퓨터를 통해 물리적 로봇 시스템을 시뮬레이션하는 기술 ROS에서는 시뮬레이션 구현에 관련된 세 가지 주요 콘텐츠가 있습니다: 로봇 모델링(URDF), 시뮬레이션 환경 생성(Gazebo) 및 환경(Rviz) 및 기타 시스템 구현을 인식합니다.

시뮬레이션 이점:

시뮬레이션은 로봇 시스템 개발에 중추적인 역할을 합니다.R&D 및 테스트에서 물리적 로봇과 비교할 때 시뮬레이션은 다음과 같은 중요한 이점이 있습니다.

1. **저비용: **로봇의 현재 비용은 여전히 ​​높으며 종종 수십만 대에 달하며 시뮬레이션을 통해 비용을 크게 줄이고 위험을 줄일 수 있습니다.

2. **효율성: **구성된 환경이 더 다양하고 유연하여 테스트 효율성과 테스트 범위를 개선할 수 있습니다.

3. ** 높은 보안: ** 시뮬레이션 환경에서 마모 문제를 고려할 필요가 없습니다.

시뮬레이션 결함:

시뮬레이션 환경과 실제 환경에서 로봇의 성능은 상당히 다릅니다.즉, 시뮬레이션은 실제 물리적 세계를 완전히 시뮬레이션할 수 없으며 일부 "왜곡" 상황이 있습니다.이유는 다음과 같습니다.

1. 에뮬레이터에서 사용하는 물리 엔진은 아직 실제 세계의 물리적 조건을 완전하고 정확하게 시뮬레이션할 수 없습니다.

2. 에뮬레이터는 조인트 드라이버(모터 및 기어박스), 센서 및 신호 통신의 절대적인 이상적인 상황을 구축합니다.현재 실제 하드웨어 결함 또는 일부 중요한 상태의 시뮬레이션을 지원하지 않습니다.

2. URDF 통합 Rviz의 기본 프로세스

요구 사항 설명:

Rviz에서 상자 로봇 표시

구현 과정:

  1. 준비: 새 함수 패키지 만들기 및 종속 항목 가져오기
  2. 코어: urdf 파일 작성
  3. 핵심: 실행 파일에 URDF와 Rviz 통합
  4. Rviz에서 로봇 모델 표시

1. 함수 패키지 생성 및 종속 항목 가져오기

사용자 지정 이름으로 새 기능 패키지를 만들고 종속 패키지를 가져옵니다 urdf.xacro

현재 기능 패키지에서 몇 개의 디렉터리를 더 만듭니다.

urdf: urdf 파일이 저장되는 디렉토리

meshes: 로봇 모델 렌더링 파일(아직 사용하지 않음)

config: 구성 파일

launch: 시작 시작 파일 저장

2. URDF 파일 작성

새 하위 폴더 만들기: (선택 사항) urdf폴더에 .urdf파일을 추가하고 다음 콘텐츠를 복사합니다.

<robot name="mycar">
    <link name="base_link">
        <visual>
            <geometry>
                <box size="0.5 0.2 0.1" />
            </geometry>
        </visual>
    </link>
</robot>
Copy

3. 런치 파일에 URDF와 Rviz 통합

디렉토리 에서 launch새로운 실행 파일을 생성합니다.실행 파일은 Rviz를 시작하고 urdf 파일을 가져와야 합니다.Rviz가 시작된 후 자동으로 분석 파일을 로드하고 로봇 모델을 표시할 수 있습니다.핵심 질문: urdfurdf 파일을 가져오는 방법 ? ROS에서 사용할 수 있습니다. urdf 파일의 경로는 매개변수 서버로 설정되고 사용된 매개변수 이름은 다음과 같습니다. robot_description샘플 코드는 다음과 같습니다.

<launch>

    <!-- 设置参数 -->
    <param name="robot_description" textfile="$(find 包名)/urdf/urdf/urdf01_HelloWorld.urdf" />

    <!-- 启动 rviz -->
    <node pkg="rviz" type="rviz" name="rviz" />

</launch>
Copy

4. Rviz에서 로봇 모델 표시

rviz를 시작하면 박스형 로봇 모델이 없다는 것을 알 수 있습니다.로봇 표시 구성 요소가 기본적으로 추가되지 않고 수동으로 추가해야 하기 때문입니다.추가 방법은 다음과 같습니다.[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다(img-2XO1iRYZ-1670239754316)(http://www.autolabor.com.cn/ book/ROSTutorials/assets/01_URDF %E6%96%87%E4%BB%B6%E6%89%A7%E8%A1%8Crviz%E9%85%8D%E7%BD%AE01.png)][외부 링크 사진 전송 실패, 소스 사이트 거머리 방지 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다(img-8XRxLmmk-1670239754320)(http://www.autolabor.com.cn/book/ROSTutorials/ assets/02_URDF%E6%96%87%E4%BB %B6%E6%89%A7%E8%A1%8Crviz%E9%85%8D%E7%BD%AE02.png)]여기에 이미지 설명 삽입

설정 후 정상적으로 표시될 수 있습니다.

5. rviz 시작 최적화

파일이 반복적으로 시작 launch되면 Rviz 이전의 구성 요소 구성 정보가 자동으로 저장되지 않고 4단계의 작업을 반복해야 합니다.사용의 편의를 위해 다음 방법을 사용하여 최적화할 수 있습니다.

먼저 현재 구성을 config디렉토리 에 저장한 [외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다(img-hkr2wM0H-1670239754330) (http://www.autolabor.com.cn/ book/ROSTutorials/assets/10_rviz %E9%85%8D%E7%BD%AE%E4%BF%9D%E5%AD%98.png)]
다음 launch파일에서 Rviz의 시작 구성에 매개변수를 추가합니다 args.-d 配置文件路径

<launch>
    <param name="robot_description" textfile="$(find 包名)/urdf/urdf/urdf01_HelloWorld.urdf" />
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find 报名)/config/rviz/show_mycar.rviz" />
</launch>
Copy

다시 시작할 때 이전 구성 요소 구성을 포함할 수 있으므로 더 편리하고 빠르게 사용할 수 있습니다.

3. URDF 구문에 대한 자세한 설명

  • 시작 파일의 시작 태그와 유사한 로봇 루트 태그
  • 링크 연결 레이블
  • 조인트 조인트 라벨
  • 전망대 전망대를 통합하는 데 필요한 태그

3.1 URDF 구문 01_robot에 대한 자세한 설명


로봇

urdf에서는 xml 구문의 무결성을 보장하기 위해 태그를 robot루트 태그로 사용합니다.모든 링크, 조인트 및 기타 태그는 로봇 태그에 포함되어야 합니다.이 태그에서 로봇 모델의 이름은 다음과 같을 수 있습니다. name 속성을 통해 설정

1. 속성

이름: 로봇 모델의 이름을 지정합니다.

2. 하위 탭

다른 모든 태그는 하위 태그입니다.

3.2 URDF 구문에 대한 자세한 설명 02_link


링크

urdf의 링크 태그는 다음과 같은 로봇의 특정 부분(즉, 단단한 부분)의 모양과 물리적 속성을 설명하는 데 사용됩니다. 로봇 베이스, 바퀴, 라이다, 카메라... 각 부분은 링크에 해당합니다. 링크 태그에서 부품의 모양, 크기, 색상, 관성행렬, 충돌 매개변수 등 일련의 속성을 디자인할 수 있습니다.[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다(img-sKElfjJs-1670239754331)(http://www.autolabor.com.cn/ book/ROSTutorials/assets/% E5%AE%98%E6%96%B901_link.png)]

1. 속성

  • 이름 —> 커넥팅 로드 이름 지정

2. 하위 탭

  • 시각적 —> 외관을 기술하십시오 (해당 데이터는 시각적입니다)
    • 지오메트리는 링크의 모양을 설정합니다.
      • 레이블 1: 상자(상자 모양)
        • 속성: 크기=길이(x) 너비(y) 높이(z)
      • 레이블 2: 실린더(실린더)
        • 속성: 반지름=반지름 길이=높이
      • 레이블 3: 구체(sphere)
        • 속성: 반지름=반지름
      • 라벨 4: 메쉬(커넥팅 로드에 스킨 추가)
        • 속성: 파일 이름=리소스 경로(형식: 패키지: 파일 )
    • origin은 오프셋과 틸트 라디안을 설정합니다.
      • 속성 1: xyz=x 오프셋 y 저렴한 z 오프셋
      • 속성 2: rpy=x 롤 y 피치 z 요(단위는 라디안)
    • Metrial 세트 재료 속성(색상)
      • 속성: 이름
      • 태그: 색상
        • 속성: rgba=red, green, blue 가중치 및 투명도(각 가중치 및 투명도 값 [0,1])
  • 충돌 —> 커넥팅 로드의 충돌 속성
  • 관성 —> 커넥팅 로드의 관성 매트릭스

3.3 URDF 구문 03_joint에 대한 자세한 설명


관절

urdf의 관절 태그는 로봇 관절의 운동학 및 역학 속성을 설명하는 데 사용되며 관절 이동의 안전 제한을 지정할 수도 있습니다.로봇의 두 부분(부모 링크 및 자식 링크라고 함)은 다음과 같습니다. "조인트"의 형태로 연결 연결, 다른 관절에는 다른 동작 형태가 있습니다: 회전, 슬라이딩, 고정, 회전 속도, 회전 각도 제한... 예: 베이스에 설치된 바퀴는 360도 회전할 수 있지만 카메라는 베이스에 완전히 고정될 수 있습니다.

관절 태그에 해당하는 데이터는 모델에서 보이지 않습니다.[외부 링크 사진 전송 실패, 소스 사이트에 도난 방지 링크 메커니즘이 있을 수 있으므로 사진을 저장하고 직접 업로드하는 것이 좋습니다(img-44yTaDfi-1670239754332)(http://www.autolabor.com.cn/ book/ROSTutorials/assets/% E5%AE%98%E6%96%B902_link.png)]

1. 속성

  • 이름 —> 조인트 이름 지정
  • 유형 —> 관절 운동 형태
    • 연속: 단일 축을 중심으로 무한히 회전할 수 있는 회전 조인트
    • 회전: 연속과 유사하지만 회전 각도 제한이 있는 회전 관절
    • 프리즘: 슬라이딩 관절, 위치 제한이 있는 특정 축을 따라 움직이는 관절
    • 플래너: 평면에 직교하는 방향으로 변환 또는 회전을 허용하는 평면 조인트
    • 플로팅: 병진 및 회전 운동을 허용하는 플로팅 조인트
    • 고정: 고정 관절, 움직임을 허용하지 않는 특수 관절

2. 하위 탭

  • 부모(필수)

    상위 링크의 이름은 필수 속성입니다.

    • 링크: 로봇 구조 트리에서 이 링크의 이름인 상위 링크의 이름입니다.
  • 어린이 (필수)

    하위 링크의 이름은 필수 속성입니다.

    • 링크: 로봇 구조 트리에서 이 링크의 이름인 자식 링크의 이름입니다.
  • 기원

    • 속성: xyz=각 축의 오프셋 rpy=각 축의 호 오프셋.
  • 중심선

    • 속성: xyz는 이동할 관절 축을 설정하는 데 사용됩니다.

3.4 URDF 연습


요구 사항 설명:

4륜 원통형 로봇 모델을 생성하고, 로봇 매개변수는 다음과 같으며, 섀시는 원통형, 반경은 10cm, 높이는 8cm이며, 4개의 바퀴는 2개의 구동 바퀴와 2개의 범용 지지 바퀴로 구성됩니다. 두 개의 구동 바퀴는 3.25cm, 너비는 1.5cm, 두 개의 범용 바퀴는 구형, 반경은 0.75cm, 섀시와 지면 사이의 거리는 1.5cm(범용 바퀴의 직경과 일치)

예상 결과 데모:이미지

1. 새로운 urdf 생성 및 파일 실행

urdf 파일: ​​기본 구현

<robot name="mycar">
    <!-- <优化项> -->
    <link name="base_footprint">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
                <sphere radius="0.001"/>
            </geometry>
        </visual>
    </link>
    <!-- <底盘> -->
    <link name="base_link">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
                <!-- <1.1立方体 长宽高>  -->
                <!-- <box size="0.5 0.2 0.1"/> -->
                <!-- <1.2圆柱 半径、高度> -->
                <cylinder radius="0.1" length="0.08"/>
                <!-- <1.3球体 半径> -->
                <!-- <sphere radius="2"/> -->
                <!-- <1.4皮肤> -->
                <!-- <mesh filename="package://urdf01_rviz/meshes/autolabor_mini.stl" /> -->
            </geometry>
            <!-- <2.偏移量与倾斜弧度> -->
            <!-- <xyz坐标 rpy旋转角度3.14=180度 1.57=90度翻滚、俯仰、偏航> -->
            <!-- <无特殊情况不要在此处对xyz进行操作,影响后期TF坐标变换,可在下方joint操作 rpy可以操作> -->
            <origin xyz="0.0 0.0 0.0" rpy="0.0  0.0 0.0"/>
            <!-- <3.颜色>red green blue a透明度 取值范围[0,1]-->
            <material name="baselink_color">
                <color rgba="0.7 0.3 0.2 0.8"/>
            </material>
        </visual>
    </link>
    <!-- <joint关节 关联footprint & baselink> -->
    <joint name="baselink2basefootprint" type="fixed">
        <!-- <设置偏移量> -->
        <origin xyz="0.0 0.0 0.055" rpy="0.0 0.0 0.0"/>
        <!-- <父级 link> -->
        <parent link="base_footprint"/>
        <!-- <子级 link> -->
        <!-- <关节z偏移量 = 车体高度/2 + 离地间距 > -->
        <child link="base_link"/>
        <!-- <fixed不需要设置关节旋转参考的坐标轴> -->
        <!-- <axis xyz="0.0 0.0 0.0"/> -->
        <!-- <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/> -->
    </joint>

    <!-- <驱动轮01> -->
    <link name="left_Wheel">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
                <!-- <1.1立方体>  -->
                <!-- <box size="0.02 0.05 0.05"/> -->
                <!-- <1.2圆柱> -->
                <cylinder radius="0.0325" length="0.015"/>
                <!-- <1.3球体> -->
                <!-- <sphere radius="0.0075"/> -->
                <!-- <1.4皮肤> -->
                <!-- <mesh filename="package://urdf01_rviz/meshes/autolabor_mini.stl" /> -->
            </geometry>
            <!-- <2.偏移量与倾斜弧度> -->
            <!-- <xyz坐标 rpy旋转角度3.14=180度 1.57=90度翻滚、俯仰、偏航> -->
            <!-- <先使用默认后期要修改 为防止下沉应该上移动一半的高度> -->
            <!-- <无特殊情况不要在此处对xyz进行操作,影响后期TF坐标变换,可在下方joint操作 rpy可以操作> -->
            <origin xyz="0.0 0.0 0.0" rpy="1.5708 0.0 0.0"/>
            <!-- <3.颜色>red green blue a透明度 取值范围[0,1]-->
            <material name="Whell03_color">
                <color rgba="0.0 0.0 0.0 0.8"/>
            </material>
        </visual>
    </link>
    <!-- <joint关节  关联baselink& Wheel_01> -->
    <joint name="LeftWheel2baselink" type="continuous">
        <!-- <设置偏移量> -->
        <!-- <
            x 无偏移
            y 车体半径
            z 车体高度/2 + 离地 - 车轮半径
    
        > -->
        <origin xyz="0.0 0.1 -0.0225" rpy="0.0 0.0 0.0"/>
        <!-- <父级 link> -->
        <parent link="base_link"/>
        <!-- <子级 link> -->
        <child link="left_Wheel"/>
        <!-- <设置关节旋转参考的坐标轴> -->
        <axis xyz="0.0 1.0 0.0"/>
        <!-- <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/> -->
    </joint>

    <!-- <驱动轮02> -->
    <link name="right_Wheel">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
                <!-- <1.1立方体>  -->
                <!-- <box size="0.02 0.05 0.05"/> -->
                <!-- <1.2圆柱> -->
                <cylinder radius="0.0325" length="0.015"/>
                <!-- <1.3球体> -->
                <!-- <sphere radius="0.0075"/> -->
                <!-- <1.4皮肤> -->
                <!-- <mesh filename="package://urdf01_rviz/meshes/autolabor_mini.stl" /> -->
            </geometry>
            <!-- <2.偏移量与倾斜弧度> -->
            <!-- <xyz坐标 rpy旋转角度3.14=180度 1.57=90度翻滚、俯仰、偏航> -->
            <!-- <先使用默认后期要修改 为防止下沉应该上移动一半的高度> -->
            <!-- <无特殊情况不要在此处对xyz进行操作,影响后期TF坐标变换,可在下方joint操作 rpy可以操作> -->
            <origin xyz="0.0 0.0 0.0" rpy="1.5708 0.0 0.0"/>
            <!-- <3.颜色>red green blue a透明度 取值范围[0,1]-->
            <material name="Whell03_color">
                <color rgba="0.0 0.0 0.0 0.8"/>
            </material>
        </visual>
    </link>
    <!-- <joint关节  关联baselink& Wheel_02> -->
    <joint name="RightWheel2baselink" type="continuous">
        <!-- <设置偏移量> -->
        <!-- <
            x 无偏移
            y 车体半径
            z 车体高度/2 + 离地 - 车轮半径
    
        > -->
        <origin xyz="0.0 -0.1 -0.0225" rpy="0.0 0.0 0.0"/>
        <!-- <父级 link> -->
        <parent link="base_link"/>
        <!-- <子级 link> -->
        <child link="right_Wheel"/>
        <!-- <设置关节旋转参考的坐标轴> -->
        <axis xyz="0.0 1.0 0.0"/>
        <!-- <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/> -->
    </joint>

    <!-- <万向轮01> -->
    <link name="front_Wheel">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
                <!-- <1.1立方体>  -->
                <!-- <box size="0.02 0.05 0.05"/> -->
                <!-- <1.2圆柱> -->
                <!-- <cylinder radius="0.0325" length="0.015"/> -->
                <!-- <1.3球体> -->
                <sphere radius="0.0075"/>
                <!-- <1.4皮肤> -->
                <!-- <mesh filename="package://urdf01_rviz/meshes/autolabor_mini.stl" /> -->
            </geometry>
            <!-- <2.偏移量与倾斜弧度> -->
            <!-- <xyz坐标 rpy旋转角度3.14=180度 1.57=90度翻滚、俯仰、偏航> -->
            <!-- <先使用默认后期要修改 为防止下沉应该上移动一半的高度> -->
            <!-- <无特殊情况不要在此处对xyz进行操作,影响后期TF坐标变换,可在下方joint操作 rpy可以操作> -->
            <origin xyz="0.0 0.0 0.0" rpy="0.0  0.0 0.0"/>
            <!-- <3.颜色>red green blue a透明度 取值范围[0,1]-->
            <material name="Whell01_color">
                <color rgba="0.0 0.0 0.0 0.8"/>
            </material>
        </visual>
    </link>
    <!-- <joint关节  关联baselink& Wheel_Universal_01> -->
    <joint name="FrontWheel2baselink" type="continuous">
        <!-- <设置偏移量> -->
        <!-- <
            x 小于车体半径
            y 无偏移
            z 车体高度/2 + 离地 - 车轮半径
    
        > -->
        <origin xyz="0.08 0.0 -0.0475" rpy="0.0 0.0 0.0"/>
        <!-- <父级 link> -->
        <parent link="base_link"/>
        <!-- <子级 link> -->
        <child link="front_Wheel"/>
        <!-- <设置关节旋转参考的坐标轴> -->
        <axis xyz="1.0 1.0 0.0"/>
        <!-- <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/> -->
    </joint>



    <!-- <万向轮02> -->
    <link name="back_Wheel">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
                <!-- <1.1立方体>  -->
                <!-- <box size="0.02 0.05 0.05"/> -->
                <!-- <1.2圆柱> -->
                <!-- <cylinder radius="0.0325" length="0.015"/> -->
                <!-- <1.3球体> -->
                <sphere radius="0.0075"/>
                <!-- <1.4皮肤> -->
                <!-- <mesh filename="package://urdf01_rviz/meshes/autolabor_mini.stl" /> -->
            </geometry>
            <!-- <2.偏移量与倾斜弧度> -->
            <!-- <xyz坐标 rpy旋转角度3.14=180度 1.57=90度翻滚、俯仰、偏航> -->
            <!-- <先使用默认后期要修改 为防止下沉应该上移动一半的高度> -->
            <!-- <无特殊情况不要在此处对xyz进行操作,影响后期TF坐标变换,可在下方joint操作 rpy可以操作> -->
            <origin xyz="0.0 0.0 0.0" rpy="0.0  0.0 0.0"/>
            <!-- <3.颜色>red green blue a透明度 取值范围[0,1]-->
            <material name="Whell02_color">
                <color rgba="0.0 0.0 0.0 0.8"/>
            </material>
        </visual>
    </link>
    <!-- <joint关节  关联baselink& Wheel_Universal_02> -->
    <joint name="BackWheel2baselink" type="continuous">
        <!-- <设置偏移量> -->
        <!-- <设置偏移量> -->
        <!-- <
            x 小于车体半径
            y 无偏移
            z 车体高度/2 + 离地 - 车轮半径
    
        > -->
        <origin xyz="-0.08 0.0 -0.0475" rpy="0.0 0.0 0.0"/>
        <!-- <父级 link> -->
        <parent link="base_link"/>
        <!-- <子级 link> -->
        <child link="back_Wheel"/>
        <!-- <设置关节旋转参考的坐标轴> -->
        <axis xyz="1.0 1.0 0.0"/>
        <!-- <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/> -->
    </joint>


</robot>

실행 파일:

<launch>

    <!-- 设置参数 -->
    <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/urdf/demo05_test.urdf" />

    <!-- 启动 rviz -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz" />

    <!-- 添加关节状态节点 -->
    <!-- <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" /> -->
    <!-- 添加关节运动控制节点(应该在机器人状态发布节点之上防止抖动) -->
    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
    <!-- 添加机器人状态发布节点 -->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />

</launch>

[외부 링크 이미지 전송 실패, 소스 사이트에 거머리 방지 메커니즘이 있을 수 있으므로 이미지를 저장하고 직접 업로드하는 것이 좋습니다(img-PmcZuDCE-1670239754335)(C:\Users\Haotian\AppData\Roaming\Typora\ typora-user-images \1669983533650.png)]

3.5 URDF 도구


ROS에서는 다음과 같은 URDF 파일 작성을 용이하게 하는 몇 가지 도구가 제공됩니다.

  • check_urdf복잡한 urdf 파일에서 구문 문제를 확인하는 명령
  • urdf_to_graphiz이 명령은 urdf 모델 구조를 보고 다른 링크의 계층적 관계를 표시할 수 있습니다.

물론 도구를 사용하기 전에 먼저 설치해야 합니다. 설치 명령은 다음과 같습니다.sudo apt install liburdfdom-tools

1. check_urdf 구문 검사

urdf 파일이 속한 디렉토리를 입력하고 다음을 호출하십시오. check_urdf urdf文件예외가 발생하지 않으면 파일이 합법적이고 그렇지 않으면 불법입니다.

여기에 이미지 설명 삽입

실험:

여기에 이미지 설명 삽입

첫 번째 urdf 폴더를 마우스 오른쪽 버튼으로 클릭하면 탭 완성이 허용됩니다.

2. urdf_to_graphiz 구조 보기

urdf 파일이 속한 디렉토리를 입력하고 다음을 호출합니다. urdf_to_graphiz urdf文件현재 디렉토리에 pdf 파일이 생성됩니다.

여기에 이미지 설명 삽입

4. URDF 최적화_xacro


개념

Xacro는 XML Macros의 약자이며, Xacro는 프로그래밍 가능한 XML인 XML 매크로 언어입니다.

원칙

Xacro는 변수를 선언하고 수학적 연산을 통해 이를 해결하고 프로세스 제어를 사용하여 실행 순서를 제어하고 유사한 함수 구현을 통해 고정 논리를 캡슐화하여 논리에 필요한 변수 데이터를 매개변수로 노출하여 코드를 개선할 수 있습니다. 보안.

효과

순수한 URDF 구현과 비교하여 더 안전하고 더 컴팩트하며 더 읽기 쉬운 로봇 모델 파일을 작성할 수 있으며 쓰기 효율성을 향상시킬 수 있습니다.

4.1 Xacro_Quick 경험


요구 사항 설명:

이전 섹션의 사례에서 구동 휠의 구현을 최적화하기 위해 xacro를 사용하려면 섀시의 반경과 높이를 캡슐화하는 변수가 필요하고 수학 공식을 사용하여 섀시의 조인트 포인트 좌표를 동적으로 계산하고 Xacro 매크로를 사용하여 반복되는 것을 캡슐화해야 합니다. 휠의 코드를 작성하고 매크로를 호출하여 두 개의 휠을 생성합니다(참고: 여기에서는 Xacro의 기본 사용에 대해 설명합니다. 합법적인 URDF를 생성할 필요는 없습니다).

준비하다:

함수 패키지를 만들고 urdf 및 xacro를 가져옵니다.

1. Xacro 파일 쓰기

속성(일정한 반지름, 높이, 바퀴 반지름...)을 변수로 캡슐화하고 반복 구현(바퀴 추가)을 함수로 캡슐화하는 Xacro 파일을 작성합니다.

<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
<!-- <
    1.代码复用     Xacro 宏定义 (函数调用)
    2.参数设计     Xacro 变量
> -->
    <!-- 属性封装 -->
    <xacro:property name="wheel_radius" value="0.0325" />
    <xacro:property name="wheel_length" value="0.0015" />
    <xacro:property name="PI" value="3.1415927" />
    <xacro:property name="base_link_length" value="0.08" />
    <xacro:property name="lidi_space" value="0.015" />

    <!-- 宏 -->
    <xacro:macro name="wheel_func" params="wheel_name flag" >
        <link name="${wheel_name}_wheel">
            <visual>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_length}" />
                </geometry>

                <origin xyz="0 0 0" rpy="${PI / 2} 0 0" />

                <material name="wheel_color">
                    <color rgba="0 0 0 0.3" />
                </material>
            </visual>
        </link>

        <!-- 3-2.joint -->
        <joint name="${wheel_name}2link" type="continuous">
            <parent link="base_link"  />
            <child link="${wheel_name}_wheel" />
            <!-- 
                x 无偏移
                y 车体半径
                z z= 车体高度 / 2 + 离地间距 - 车轮半径

            -->
            <origin xyz="0 ${0.1 * flag} ${(base_link_length / 2 + lidi_space - wheel_radius) * -1}" rpy="0 0 0" />
            <axis xyz="0 1 0" />
        </joint>

    </xacro:macro>
    <!-- <调用> -->
    <xacro:wheel_func wheel_name="left" flag="1" />
    <xacro:wheel_func wheel_name="right" flag="-1" />
</robot>

2. Xacro 파일을 urdf 파일로 변환

명령줄을 사용하여 xacro 파일이 속한 디렉토리를 입력하고 다음을 실행하면 rosrun xacro xacro xxx.xacro > xxx.urdfxacro 파일이 urdf 파일로 구문 분석됩니다.

참고: 이 사례는 불법 URDF 파일을 생성하기 위해 작성되었으며, 그 목적은 Xacro의 최소 사용 및 이점을 보여주기 위한 것입니다.

4.2 Xacro_ 문법 상세 설명


xacro는 변수 선언 및 호출, 함수 선언 및 호출과 같은 구문 구현을 포함하여 컴퓨터 언어와 유사한 프로그래밍 가능한 인터페이스를 제공합니다. xacro를 사용하여 urdf를 생성할 때 robot네임스페이스 선언이 루트 태그에 포함되어야 합니다.xmlns:xacro="http://wiki.ros.org/xacro"

1. 속성 및 산술 연산

PAI 값, 자동차 크기, 휠 반경 등과 같은 URDF의 일부 필드를 캡슐화하는 데 사용됩니다.

속성 정의

<xacro:property name="xxxx" value="yyyy" />

속성 호출

${属性名称}

산수

${数学表达式}

2. 매크로

함수 구현 유사, 코드 재사용률 향상, 코드 구조 최적화, 보안성 향상

매크로 정의

<xacro:macro name="宏名称" params="参数列表(多参数之间使用空格分隔)">

    .....

    参数调用格式: ${参数名}

</xacro:macro>

매크로 호출

<xacro:宏名称 参数1=xxx 参数2=xxx/>

3. 파일에는 다음이 포함됩니다.

로봇은 여러 부분으로 구성되어 있으며 서로 다른 부분을 별도의 xacro 파일로 패키징할 수 있습니다.마지막으로 서로 다른 파일을 통합하여 완전한 로봇으로 결합하며 파일 포함을 사용하여 구현할 수 있습니다.

파일에는

<robot name="xxx" xmlns:xacro="http://wiki.ros.org/xacro">
      <xacro:include filename="my_base.xacro" />
      <xacro:include filename="my_camera.xacro" />
      <xacro:include filename="my_laser.xacro" />
      ....
</robot>

4.3 Xacro_ 전체 사용 프로세스 예


요구 사항 설명:

Xacro를 사용하여 자동차 섀시 모델의 URDF 버전 최적화

예상 결과 데모:

이미지

1. Xacro 파일 작성

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
   
    <xacro:property name="footprint_radius" value="0.001"/>
    
     <link name="base_footprint">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
            <sphere radius="${footprint_radius}"/>
            </geometry>
        </visual>
    </link>
    <xacro:property name="base_radius" value="0.1"/>
    <xacro:property name="base_length" value="0.08"/>
    <xacro:property name="lidi" value="0.015"/>
    <xacro:property name="base_joint_z" value="${base_length / 2 + lidi}"/>
    <!-- <底盘> -->
    <link name="base_link">
        <!-- <可视化标签> -->
        <visual>
            <!-- <1.形状> -->
            <geometry>
                <cylinder radius="${base_radius}" length="${base_length}"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0  0.0 0.0"/>
            <material name="baselink_color">
                <color rgba="0.7 0.3 0.2 0.5"/>
            </material>
        </visual>
    </link>
    <!-- <joint关节 关联footprint & baselink> -->
    <joint name="baselink2basefootprint" type="fixed">
        <!-- <设置偏移量> -->
        <origin xyz="0.0 0.0 ${base_joint_z}" rpy="0.0 0.0 0.0"/>
        <!-- <父级 link> -->
        <parent link="base_footprint"/>
        <!-- <子级 link> -->
        <!-- <关节z偏移量 = 车体高度/2 + 离地间距 > -->
        <child link="base_link"/>
    </joint>

    <xacro:property name="wheel_radius" value="0.0325"/>
    <xacro:property name="wheel_length" value="0.015"/>
    <xacro:property name="PI" value="3.1415927"/>
    <!-- <结果是负数> -->
    <xacro:property name="wheel_joint_z" value="${(base_length / 2 + lidi - wheel_radius) * -1}"/>
   
    <xacro:macro name="wheel_func" params="wheel_name flag">
    <!-- <
        wheel_name : left or right
        flag : 1 or -1 right/left wheel
    > -->
    <!-- <驱动轮01> -->
        <link name="${wheel_name}">
            <!-- <可视化标签> -->
            <visual>
                <!-- <1.形状> -->
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_length}"/>
                </geometry>
                <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0"/>
                <material name="whell03_color">
                    <color rgba="0.0 0.0 0.0 0.8"/>
                </material>
            </visual>
        </link>
        <!-- <joint关节  关联baselink& Wheel_01> -->
        <joint name="${wheel_name}2baselink" type="continuous">
            <!-- <设置偏移量> -->
            <!-- <
                x 无偏移
                y 车体半径
                z 车体高度/2 + 离地 - 车轮半径
            > -->
            <origin xyz="0.0 ${flag * 0.1} ${wheel_joint_z}" rpy="0.0 0.0 0.0"/>
            <!-- <父级 link> -->
            <parent link="base_link"/>
            <!-- <子级 link> -->
            <child link="${wheel_name}"/>
            <!-- <设置关节旋转参考的坐标轴> -->
            <axis xyz="0.0 1.0 0.0"/>
            <!-- <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/> -->
        </joint>
    </xacro:macro>
    <xacro:wheel_func wheel_name="base_l_wheel_joint" flag="1"/>
    <xacro:wheel_func wheel_name="base_r_wheel_joint" flag="-1"/>


    <xacro:property name="sup_wheel_radius" value="0.0075"/>
     <xacro:property name="sup_wheel_joint_x" value="${base_radius - sup_wheel_radius }"/>
     <!-- <结果是负数> -->
    <xacro:property name="sup_wheel_joint_z" value="${(base_length / 2 + lidi - sup_wheel_radius ) * -1}"/>


    <xacro:macro name="sup_wheel_func" params="name flag">
        <!-- <万向轮01> -->
        <link name="${name}_wheel">
            <!-- <可视化标签> -->
            <visual>
                <!-- <1.形状> -->
                <geometry>
                    <sphere radius="${sup_wheel_radius}"/>
                </geometry>
                <origin xyz="0.0 0.0 0.0" rpy="0.0  0.0 0.0"/>
                <material name="whell01_color">
                    <color rgba="0.0 0.0 0.0 0.8"/>
                </material>
            </visual>
        </link>
        <!-- <joint关节  关联baselink& Wheel_Universal_01> -->
        <joint name="${name}2baselink" type="continuous">
            <!-- <设置偏移量> -->
                    <!-- <
                x 小于车体半径 自定义  底盘半径-万象轮半径=0.1-0.0075=0.0925
                y 无偏移
                z 车体高度/2 + 离地 - 车轮直径
            > -->
            <origin xyz="${sup_wheel_joint_x * flag } 0.0 ${sup_wheel_joint_z}" rpy="0.0 0.0 0.0"/>
            <!-- <父级 link> -->
            <parent link="base_link"/>
            <!-- <子级 link> -->
            <child link="${name}_wheel"/>
            <!-- <设置关节旋转参考的坐标轴> -->
            <axis xyz="1.0 1.0 1.0"/>
            <!-- <limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/> -->
        </joint>
    </xacro:macro>
    <xacro:sup_wheel_func name="front" flag="1"/>
    <xacro:sup_wheel_func name="back" flag="-1"/>

</robot>

2. 런치 파일 통합

**방법 1:** 먼저 xacro 파일을 urdf 파일로 변환한 다음 통합

먼저 xacro 파일을 urdf 파일로 구문 분석합니다. rosrun xacro xacro xxx.xacro > xxx.urdf그런 다음 이전 통합 방법에 따라 시작 파일을 직접 통합합니다.

**방법 2:** 실행 파일에서 xacro를 직접 로드( 권장 )

시작 콘텐츠 예:

<launch>

    <!-- 设置参数 -->
    <!-- <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/xacro/demo05_car_base.urdf" /> -->
     <param name="robot_description" command="$(find xacro)/xacro $(find urdf01_rviz)/urdf/xacro/demo05_car_base.xacro" />
    <!-- 启动 rviz -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz" />
    <!-- 添加关节状态节点 -->
    <!-- <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" /> -->
    <!-- 添加关节运动控制节点(应该在机器人状态发布节点之上防止抖动) -->
    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
    <!-- 添加机器人状态发布节点 -->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />

</launch>

핵심 코드:

 <param name="robot_description" command="$(find xacro)/xacro $(find urdf01_rviz)/urdf/xacro/demo05_car_base.xacro" />

속성은 를 로드할 robot_description때 사용되며 command속성 값은 xacro 함수 패키지의 xacro 프로그램을 호출하여 xacro 파일을 직접 파싱하기 위한 것입니다.

4.4 URDF 구문 01_robot에 대한 자세한 설명


요구 사항 설명:

앞차 섀시를 기반으로 카메라와 레이더 센서를 추가합니다.

결과 데모:

여기에 이미지 설명 삽입

분석 실현:

로봇 모델은 여러 부분으로 구성되며 서로 다른 구성 요소를 별도의 파일로 설정할 수 있으며 마지막으로 파일 포함을 통해 구성 요소의 조립을 실현할 수 있습니다.

구현 과정:

  1. 먼저 카메라와 레이더의 xacro 파일을 작성합니다.
  2. 그런 다음 섀시, 카메라 및 레이더를 결합하기 위해 결합된 파일을 작성합니다.
  3. 마지막으로 런치 파일을 통해 Rviz를 시작하고 모델을 표시합니다.

1. 카메라 및 레이더 Xacro 파일 구현

카메라 xacro 파일:

<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
    <!-- <摄像头> -->
    <!-- <
        1.连杆属性:厚度(x)宽度(y) 高度(z)
        2.关节属性: x y z
    > -->

    <xacro:property name="camera_length" value="0.02"/>
    <xacro:property name="camera_width" value="0.05"/>
    <xacro:property name="camera_hight" value="0.05"/>

    <xacro:property name="joint_camera_x" value="0.08"/>
    <xacro:property name="joint_camera_y" value="0.0"/>
    <xacro:property name="joint_camera_z" value="${base_length / 2 +  camera_length / 2 + lidi }"/>
    
    <link name="camera">
      
        <visual>
        <geometry>
            <box size="${camera_length} ${camera_width} ${camera_hight}"/>
        </geometry>
        <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
        <material name="camera_black">
            <color rgba="0.0 0.0 0.0 1.0"/>
        </material>
        </visual>

    </link>
    <joint name="camera2base" type="fixed">
        <parent link="base_link"/>
        <child link="camera"/>
        <origin xyz="${joint_camera_x} ${joint_camera_y} ${joint_camera_z}" rpy="0.0 0.0 0.0"/>
    </joint>
    

</robot>

레이더 xacro 파일:

<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
    <!-- <雷达> -->
    <!-- <
        1.支撑尺寸:高度 半径
        2.关节属性: x y z

        1.雷达尺寸:高度 半径
        2.关节属性: x y z
    > -->
    <xacro:property name="support_radius" value="0.01"/>
    <xacro:property name="support_length" value="0.15"/>

    <xacro:property name="joint_support_x" value="0"/>
    <xacro:property name="joint_support_y" value="0"/>
    <!-- z=车体高度/2+支撑高度/2  -->
    <xacro:property name="joint_support_z" value="${support_length / 2+ base_length / 2 }"/>

    <xacro:property name="laser_radius" value="0.03"/>
    <xacro:property name="laser_length" value="0.05"/>

    <xacro:property name="joint_laser_x" value="0"/>
    <xacro:property name="joint_laser_y" value="0"/>
    <xacro:property name="joint_laser_z" value="${support_length / 2+ laser_length / 2}"/>
    <!-- 支架 -->
    <link name="support">
        <visual>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            <geometry>
                <cylinder radius="${support_radius}" length="${support_length}"/>
            </geometry>
            <material name="yellow">
                <color rgba="0.8 0.5 0.0 0.5"/>
            </material>
        </visual>
    </link>

    <joint name="support2baselink" type="fixed">
        <parent link="base_link"/>
        <child link="support"/>
        <origin xyz="${joint_support_x} ${joint_support_y} ${joint_support_z}" rpy="0.0 0.0 0.0"/>
    </joint>
    <!-- 雷达 -->
    <link name="laser">
        <visual>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            <geometry>
                <cylinder radius="${laser_radius}" length="${laser_length}"/>
            </geometry>
            <material name="laser">
                <color rgba="0.0 0.0 0.0 0.5"/>
            </material>
        </visual>
    </link>
    <joint name="laser2supportlink" type="fixed">
        <parent link="support"/>
        <child link="laser"/>
        <origin xyz="${joint_laser_x} ${joint_laser_y} ${joint_laser_z}" rpy="0 0 0"/>
    </joint>

</robot>


2. 섀시 카메라와 레이더의 xacro 파일 결합

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
    <!-- <文件包含> -->

    <xacro:include filename="demo05_car_base.urdf.xacro"/>
    <xacro:include filename="demo06_car_camera.urdf.xacro"/>
    <xacro:include filename="demo07_car_laser.urdf.xacro"/>

</robot>

3. 실행 파일

<launch>

    <!-- 设置参数 -->
    <!-- <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/xacro/demo05_car_base.urdf" /> -->
    <param name="robot_description" command="$(find xacro)/xacro $(find urdf01_rviz)/urdf/xacro/car.urdf.xacro" />
    <!-- 启动 rviz -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz" />
    <!-- 添加关节状态节点 -->
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />
    <!-- 添加机器人状态发布节点 -->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />

</launch>

여기에 이미지 설명 삽입

5. Rviz에서 로봇 모델의 움직임 제어

**Arbotix:**Arbotix는 모터 및 서보 제어를 위한 제어 보드이며 해당 ros 기능 패키지를 제공합니다 .이 기능 패키지의 기능은 실제 Arbotix 제어 보드를 구동할 수 있을 뿐만 아니라 차동 속도 컨트롤러도 제공합니다. , rviz에서 로봇의 움직임을 실현하는 데 도움이 되는 속도 제어 명령을 수락하여 로봇의 관절 상태를 업데이트합니다.

차동 컨트롤러는 arbotix_python 패키지에 포함되어 있으며 전체 arbotix 패키지에는 다이나믹셀 모터, 다관절 로봇 팔 및 다양한 모양의 그리퍼에 해당하는 다양한 컨트롤러도 포함되어 있습니다.

다음으로 케이스를 통해 알보틱스 사용법을 시연합니다.

요구 사항 설명:

rviz에서 원형 동작을 수행하도록 로봇 모델 제어

결과 데모:

여기에 이미지 설명 삽입

구현 과정:

  1. Arbotix 설치
  2. 새 기능 패키지 생성, 로봇 urdf, xacro 파일 준비
  3. Arbotix 구성 파일 추가
  4. Arbotix를 구성하기 위한 실행 파일 작성
  5. 런치 파일을 시작하고 로봇 모델의 움직임을 제어

1. 알보틱스 설치

**방법 1:**명령줄 호출

sudo apt-get install ros-<<VersionName()>>-arbotix

<<VsersionName()>>을 현재 ROS 버전의 이름으로 바꾸십시오.함수 패키지를 찾을 수 없다는 메시지가 표시되면 방법 2를 사용하십시오.

**방법 2:**소스코드 설치

먼저 github에서 소스 코드를 다운로드한 다음 catkin_make를 호출하여 컴파일합니다.

git clone https://github.com/vanadiumlabs/arbotix_ros.git

2. 새로운 기능 패키지를 생성하고 로봇 urdf 및 xacro를 준비합니다.

urdf와 xacro는 이전 강의를 호출하여 구현할 수 있습니다.

3. arbotix에 필요한 구성 파일 추가

arbotix 필수 구성 파일 추가

# 该文件是控制器配置,一个机器人模型可能有多个控制器,比如: 底盘、机械臂、夹持器(机械手)....
# 因此,根 name 是 controller
controllers: {
    
    
   # 单控制器设置
   base_controller: {
    
    
          #类型: 差速控制器
       type: diff_controller,
       #参考坐标
       base_frame_id: base_footprint, 
       #两个轮子之间的间距
       base_width: 0.2,
       #控制频率
       ticks_meter: 2000, 
       #PID控制参数,使机器人车轮快速达到预期速度
       Kp: 12, 
       Kd: 12, 
       Ki: 0, 
       Ko: 50, 
       #加速限制
       accel_limit: 1.0 
    }
}

참조: http://wiki.ros.org/arbotix_python/diff_controller

4. 시작 파일에서 arbotix 노드 구성

샘플 코드 실행

<launch>

    <!-- 设置参数 -->
    <!-- <param name="robot_description" textfile="$(find urdf01_rviz)/urdf/xacro/demo05_car_base.urdf" /> -->
    <param name="robot_description" command="$(find xacro)/xacro $(find urdf01_rviz)/urdf/xacro/car.urdf.xacro" />
    <!-- 启动 rviz -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz" />
    <!-- 添加关节状态节点 -->
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />
    <!-- 添加机器人状态发布节点 -->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
    <!-- 添加集成 arbotix 运动控制节点,并加载参数 -->
    <node pkg="arbotix_python" type="arbotix_driver" name="driver" output="screen">
        <rosparam command="load" file="$(find urdf01_rviz)/config/control.yaml" />
        <param name="sim" value="true"/>
        <!-- 可以控制现实和仿真环境,因此需要设置为仿真 -->


    </node>

</launch>

코드 설명:

arbotix_python 함수 패키지에서 arbotix_driver 노드라고 함

arbotix가 로봇을 구동하여 실행하려면 로봇 정보를 얻어야 하며 파일을 통해 구성 파일을 로드할 수 있습니다.

시뮬레이션 환경에서 sim을 true로 구성해야 합니다.

5. 런치 파일을 시작하고 로봇 모델의 움직임을 제어

**시작 시작:** roslaunch xxxx...시작

시작 오류:

Joint state with name: "base_l_wheel_joint" was received but not found in URDF

이유: arbotix 구성과 다른 이름

demo05_car_base.urdf는 왼쪽 및 오른쪽 바퀴의 조인트 노드 이름을 "base_l_wheel_joint" 및 "base_r_wheel_joint"로 변경합니다.

xacro를 urdf로 변환: rosrun xacro xacro demo05_car_base.urdf.xacro > demo05.urdf

보기 위해 PDF로 변환: urdf_to_graphiz urdf/demo05.urdf

여기에 이미지 설명 삽입

rviz 구성:

여기에 이미지 설명 삽입

자동차의 움직임 제어:

이때 rostopic list를 호출하면 익숙한 주제를 찾을 수 있습니다: /cmd_vel

여기에 이미지 설명 삽입

rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{
    
    linear: {
    
    x: 0.2, y: 0, z: 0}, angular: {
    
    x: 0, y: 0, z: 0.5}}'

다음도 참조하십시오.

  • http://wiki.ros.org/arbotix

6. URDF는 Gazebo를 통합합니다.

시각화된 로봇 모델을 표시하려면 URDF를 Rviz 또는 Gazebo에 통합해야 합니다.

6.1URDF와 Gazebo의 기본 통합 프로세스

URDF와 Gazebo의 통합 프로세스는 Rviz의 통합 프로세스와 유사하며 주요 단계는 다음과 같습니다.

  1. 기능 패키지 만들기 및 종속성 가져오기
  2. URDF 또는 Xacro 파일 쓰기
  3. Gazebo 시작 및 로봇 모델 표시

1. 기능 패키지 생성

새 기능 패키지를 만들고 종속 패키지 가져오기: urdf, xacro, gazebo_ros, gazebo_ros_control, gazebo_plugins

2. URDF 파일 작성

URDF를 Gazebo와 통합해야 하는 경우 Rviz와 크게 다릅니다.

1. 시뮬레이션 환경이기 때문에 충돌 감지를 포함해야 하고 충돌은 충돌 감지의 기반을 제공하므로 충돌 태그를 사용해야 합니다.

2. 관성 태그를 사용해야 합니다.이 태그는 현재 로봇의 특정 강체 부분의 관성 매트릭스를 표시하며 일부 기계 관련 시뮬레이션 계산에 사용됩니다.

3. 이전 색상 설정에는 디버깅 편의를 위해 투명도가 포함되어 있고 시뮬레이션 환경에는 그러한 옵션이 없기 때문에 색상 설정도 전망대 레이블로 다시 레이블을 지정해야 합니다.

3. Gazebo 시작 및 모델 표시

코드 설명:

<include file="$(find gazebo_ros)/launch/empty_world.launch" />
<!-- 启动 Gazebo 的仿真环境,当前环境为空环境 -->

<node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />

<!-- 
    在 Gazebo 中加载一个机器人模型,该功能由 gazebo_ros 下的 spawn_model 提供:
    -urdf 加载的是 urdf 文件
    -model mycar 模型名称是 mycar
    -param robot_description 从参数 robot_description 中载入模型
    -x 模型载入的 x 坐标
    -y 模型载入的 y 坐标
    -z 模型载入的 z 坐标
-->

6.2 URDF 통합 Gazebo 관련 설정

rviz와 비교하여 가제보는 URDF를 통합할 때 약간의 수정이 필요합니다. 이식하면 표시되지 않으며 그에 따라 색상 설정도 변경해야 합니다.

1. 충돌

로봇 링크가 표준 기하학적 모양인 경우 링크의 시각적 속성과 일치하도록 설정할 수 있습니다.

2.관성

관성행렬의 설정은 링크의 품질 및 형상 매개변수와 조합하여 동적으로 생성되어야 하며, 원칙적으로 base_footprint를 제외하고 로봇의 각 강체 부분에 관성행렬을 설정해야 하며, 관성행렬은 반드시 강체 부분의 관성을 임의로 Matrix로 정의하면 Gazebo에서 로봇이 흔들리고 움직일 수 있습니다.

3. 색상 설정

가제보에서 링크 색상을 표시하려면 지정된 레이블을 사용해야 합니다.

<gazebo reference="link节点名称">
     <material>Gazebo/Blue</material>
</gazebo>

**PS: **소재태그에서 설정값은 대소문자를 구분하고 색상은 빨강 파랑 초록 검정...

6.3 URDF 통합 Gazebo 실제 작동 요구 사항 설명:

가제보에 이전 로봇 모델(xacro 버전) 표시

결과 데모:
여기에 이미지 설명 삽입

구현 과정:

  1. 관성 행렬 알고리즘을 캡슐화하는 xacro 파일을 작성해야 합니다.
  2. 로봇 모델의 각 링크에 충돌 및 관성 태그를 추가하고 색상 속성을 재설정합니다.
  3. 실행 파일에서 전망대를 시작하고 로봇 모델을 추가하십시오.

1. 관성 행렬 알고리즘을 캡슐화하는 xacro 파일 작성

<robot name="base" xmlns:xacro="http://wiki.ros.org/xacro">
    <!-- Macro for inertia matrix -->
    <xacro:macro name="sphere_inertial_matrix" params="m r">
        <inertial>
            <mass value="${m}" />
            <inertia ixx="${2*m*r*r/5}" ixy="0" ixz="0"
                iyy="${2*m*r*r/5}" iyz="0" 
                izz="${2*m*r*r/5}" />
        </inertial>
    </xacro:macro>

    <xacro:macro name="cylinder_inertial_matrix" params="m r h">
        <inertial>
            <mass value="${m}" />
            <inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
                iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
                izz="${m*r*r/2}" /> 
        </inertial>
    </xacro:macro>

    <xacro:macro name="Box_inertial_matrix" params="m l w h">
       <inertial>
               <mass value="${m}" />
               <inertia ixx="${m*(h*h + l*l)/12}" ixy = "0" ixz = "0"
                   iyy="${m*(w*w + l*l)/12}" iyz= "0"
                   izz="${m*(w*w + h*h)/12}" />
       </inertial>
   </xacro:macro>
</robot>

2. 해당 xacro 파일을 복사하고 충돌 관성 및 색상 등의 매개 변수를 설정합니다.

A. 섀시 Xacro 파일
<robot name="my_base"
    xmlns:xacro="http://www.ros.org/wiki/xacro">
    <!-- 封装变量、常量 -->
    <!-- PI 值设置精度需要高一些,否则后续车轮翻转量计算时,可能会出现肉眼不能察觉的车轮倾斜,从而导致模型抖动 -->

    <!-- 宏:黑色设置 -->
    <material name="black">
        <color rgba="0.0 0.0 0.0 1.0" />
    </material>

    <!-- 底盘属性 -->
    <xacro:property name="footprint_radius" value="0.001" />
    <xacro:property name="PI" value="3.1415926"/>
    <!-- base_footprint 半径  -->
    <xacro:property name="base_radius" value="0.1" />
    <!-- base_link 半径 -->
    <xacro:property name="base_length" value="0.08" />
    <!-- base_link 长 -->
    <xacro:property name="lidi" value="0.015" />
    <!-- 离地间距 -->
    <xacro:property name="base_mass" value="0.5" />
    <!-- 质量  -->
    <!-- 驱动轮属性 -->
    <xacro:property name="wheel_radius" value="0.0325" />
    <!-- 半径 -->
    <xacro:property name="wheel_length" value="0.015" />
    <!-- 宽度 -->
    <xacro:property name="wheel_mass" value="0.05" />
    <!-- 质量  -->
    <!-- 支撑轮属性 -->
    <xacro:property name="sup_wheel_radius" value="0.0075" />
    <!-- 支撑轮半径 -->
    <xacro:property name="sup_wheel_mass" value="0.03" />
    <!-- 质量  -->
    <!-- 底盘 -->
    <link name="base_footprint">
        <visual>
            <geometry>
                <sphere radius="${footprint_radius}" />
            </geometry>
        </visual>
    </link>
    <link name="base_link">
        <visual>
            <geometry>
                <cylinder radius="${base_radius}" length="${base_length}" />
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
            <material name="yellow">
                <color rgba="0.5 0.3 0.0 0.5" />
            </material>
        </visual>
        <collision>
            <geometry>
                <cylinder radius="${base_radius}" length="${base_length}" />
            </geometry>
            <origin xyz="0 0 0" rpy="0 0 0" />
        </collision>
        <xacro:cylinder_inertial_matrix m="${base_mass}" r="${base_radius}" h="${base_length}" />
    </link>
    <joint name="base_link2base_footprint" type="fixed">
        <parent link="base_footprint" />
        <child link="base_link" />
        <origin xyz="0 0 ${lidi + base_length / 2 }" />
    </joint>
    <gazebo reference="base_link">
        <material>Gazebo/Yellow</material>
    </gazebo>
    <!-- 驱动轮 -->
    <!-- 驱动轮宏实现 -->
    <xacro:macro name="wheel_func" params="name flag">
        <link name="${name}_wheel">
            <visual>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_length}" />
                </geometry>
                <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
                <material name="black" />
            </visual>
            <collision>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_length}" />
                </geometry>
                <origin xyz="0.0 0.0 0.0" rpy="${PI / 2} 0.0 0.0" />
            </collision>
            <xacro:cylinder_inertial_matrix m="${wheel_mass}" r="${wheel_radius}" h="${wheel_length}" />

        </link>
        <joint name="${name}_wheel2base_link" type="continuous">
            <parent link="base_link" />
            <child link="${name}_wheel" />
            <origin xyz="0 ${flag * base_radius} ${-(lidi + base_length / 2 - wheel_radius) }" />
            <axis xyz="0 1 0" />
        </joint>

        <gazebo reference="${name}_wheel">
            <material>Gazebo/Red</material>
        </gazebo>
    </xacro:macro>
    <xacro:wheel_func name="left" flag="1" />
    <xacro:wheel_func name="right" flag="-1" />
    <!-- 支撑轮 -->
    <!-- 支撑轮宏 -->
    <xacro:macro name="sup_wheel_func" params="name flag">
        <link name="${name}_wheel">
            <visual>
                <geometry>
                    <sphere radius="${sup_wheel_radius}" />
                </geometry>
                <origin xyz="0 0 0" rpy="0 0 0" />
                <material name="black" />
            </visual>
            <collision>
                <geometry>
                    <sphere radius="${sup_wheel_radius}" />
                </geometry>
                <origin xyz="0 0 0" rpy="0 0 0" />
            </collision>
            <xacro:sphere_inertial_matrix m="${sup_wheel_mass}" r="${sup_wheel_radius}" />
        </link>

        <joint name="${name}_wheel2base_link" type="continuous">
            <parent link="base_link" />
            <child link="${name}_wheel" />
            <origin xyz="${flag * (base_radius - sup_wheel_radius)} 0 ${-(base_length / 2 + lidi / 2)}" />
            <axis xyz="1 1 1" />
        </joint>
        <gazebo reference="${name}_wheel">
            <material>Gazebo/Red</material>
        </gazebo>
    </xacro:macro>
    <xacro:sup_wheel_func name="front" flag="1" />
    <xacro:sup_wheel_func name="back" flag="-1" />
</robot>

참고: Gazebo에서 로봇 모델이 흔들리거나 미끄러지거나 느리게 움직이는 경우 확인하십시오.

  1. 관성행렬의 설정 여부 및 그 설정이 올바르고 합리적인지 여부
  2. 휠 플립은 PI 값에 의존해야 하며, PI 값의 정확도가 낮으면 위와 같은 상황이 발생할 수도 있습니다.
B. 카메라 Xacro 파일
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
    <!-- <摄像头> -->
    <!-- <
        1.连杆属性:厚度(x)宽度(y) 高度(z)
        2.关节属性: x y z
    > -->

    <xacro:property name="camera_length" value="0.02"/>
    <xacro:property name="camera_width" value="0.05"/>
    <xacro:property name="camera_hight" value="0.05"/>
    <xacro:property name="camera_mass" value="0.01"/>

    <xacro:property name="joint_camera_x" value="0.08"/>
    <xacro:property name="joint_camera_y" value="0.0"/>
    <xacro:property name="joint_camera_z" value="${base_length / 2 +  camera_length / 2 + lidi }"/>

    <link name="camera">
        <visual>
            <geometry>
                <box size="${camera_length} ${camera_width} ${camera_hight}"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            <material name="camera_black">
                <color rgba="0.0 0.0 0.0 1.0"/>
            </material>
        </visual>
        <collision>
            <geometry>
                <box size="${camera_length} ${camera_width} ${camera_hight}"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
        </collision>
        <xacro:Box_inertial_matrix m="${camera_mass}" l="${camera_length}" w="${camera_width}" h="${camera_hight}" />
    </link>

    <joint name="camera2base" type="fixed">
        <parent link="base_link"/>
        <child link="camera"/>
        <origin xyz="${joint_camera_x} ${joint_camera_y} ${joint_camera_z}" rpy="0.0 0.0 0.0"/>
    </joint>
    <gazebo reference="camera">
        <material>
            Gazebo/Blue 
        </material>
    </gazebo>

</robot>
C. 레이더 Xacro 파일
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
    <!-- <雷达> -->
    <!-- <
        1.支撑尺寸:高度 半径
        2.关节属性: x y z


        1.雷达尺寸:高度 半径
        2.关节属性: x y z
    > -->
    <xacro:property name="suport_radius" value="0.01"/>
    <xacro:property name="suport_length" value="0.15"/>
    <xacro:property name="suport_mass" value="0.10"/>

    <xacro:property name="joint_suport_x" value="0"/>
    <xacro:property name="joint_suport_y" value="0"/>
    <xacro:property name="joint_suport_z" value="${suport_length / 2+ base_length / 2 }"/>

    <xacro:property name="laser_radius" value="0.03"/>
    <xacro:property name="laser_length" value="0.05"/>
    <xacro:property name="laser_mass" value="0.15"/>

    <xacro:property name="joint_laser_x" value="0"/>
    <xacro:property name="joint_laser_y" value="0"/>
    <xacro:property name="joint_laser_z" value="${suport_length / 2+ laser_length / 2}"/>

    <link name="suport_link">
        <visual>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            <geometry>
                <cylinder radius="${suport_radius}" length="${suport_length}"/>
            </geometry>
            <material name="suport_link">
                <color rgba="1.0 0.0 1.0 0.6"/>
            </material>
        </visual>
        <collision>
            <geometry>
                <cylinder radius="${suport_radius}" length="${suport_length}"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
        </collision>
        <xacro:cylinder_inertial_matrix m="${suport_mass}" r="${suport_radius}" h="${suport_length}"/>
    </link>

    <joint name="suport2baselink" type="fixed">
        <parent link="base_link"/>
        <child link="suport_link"/>
        <origin xyz="${joint_suport_x} ${joint_suport_y} ${joint_suport_z}" rpy="0.0 0.0 0.0"/>
    </joint>
    <gazebo reference="suport_link">
        <material>
                Gazebo/Grey 
        </material>
    </gazebo>


    <link name="laser">
        <visual>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
            <geometry>
                <cylinder radius="${laser_radius}" length="${laser_length}"/>
            </geometry>
            <material name="laser">
                <color rgba="0.5 0.7 1.0 0.8"/>
            </material>
        </visual>
        <collision>
            <geometry>
                <cylinder radius="${laser_radius}" length="${laser_length}"/>
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
        </collision>
        <xacro:cylinder_inertial_matrix m="${laser_mass}" r="${laser_radius}" h="${laser_length}"/>
    </link>

    <joint name="laser2suportlink" type="fixed">
        <parent link="suport_link"/>
        <child link="laser"/>
        <origin xyz="${joint_laser_x} ${joint_laser_y} ${joint_laser_z}" rpy="0 0 0"/>
    </joint>
    <gazebo reference="laser">
        <material>
                Gazebo/Black 
        </material>
    </gazebo>


</robot>
D. 섀시, 카메라 및 레이더를 결합한 Xacro 파일
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
    <xacro:include filename="inertia.xacro"/>

    <!-- <文件包含> -->

    <xacro:include filename="demo05_car_base.urdf.xacro"/>
    <xacro:include filename="demo06_car_camera.urdf.xacro"/>
    <xacro:include filename="demo07_car_laser.urdf.xacro"/>

</robot>

3. 가제보에서 실행

실행 파일:

<launch>
    <!-- <需要在参数服务器中载入urdf> -->
    <param name="robot_description" command="$(find xacro)/xacro $(find urdf02_gazebo)/urdf/car.urdf.xacro" />
    <!-- <启动Gazebo仿真环境> -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="world_name" value="$(find urdf02_gazebo)/worlds/box_house.world" />
    </include>
    <!-- <在Gazebo中添加机器人模型> -->
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description" />
</launch>

여기에 이미지 설명 삽입

6.4 가제보 시뮬레이션 환경 구축

Gazebo에서 시뮬레이션 구현을 생성하는 두 가지 방법이 있습니다.

  • 방법 1: 내장 구성 요소를 직접 추가하여 시뮬레이션 환경 생성
  • 방법 2: 시뮬레이션 환경을 수동으로 그리기(더 유연함)

공식 또는 타사 고급 시뮬레이션 환경 플러그인을 직접 다운로드하여 사용할 수도 있습니다.

1. 내장 구성 요소를 추가하여 시뮬레이션 환경 생성

1.1 Gazebo 시작 및 구성 요소 추가

여기에 이미지 설명 삽입

1.2 시뮬레이션 환경 저장

여기에 이미지 설명 삽입

추가 후 파일 —> 다른 이름으로 World 저장을 선택하여 저장 경로(함수 패키지: worlds 디렉터리 아래)를 선택하고 파일 이름을 사용자 지정하고 접미사를 .world로 설정합니다.

1.3 시작
<launch>

    <!-- 将 Urdf 文件的内容加载到参数服务器 -->
    <param name="robot_description" command="$(find xacro)/xacro $(find demo02_urdf_gazebo)/urdf/xacro/my_base_camera_laser.urdf.xacro" />
    <!-- 启动 gazebo -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="world_name" value="$(find demo02_urdf_gazebo)/worlds/hello.world" />
    </include>

    <!-- 在 gazebo 中显示机器人模型 -->
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description"  />
</launch>
Copy

핵심 코드: empty_world를 시작한 후 다음과 같이 arg사용자 지정 시뮬레이션 환경을 로드합니다.

<include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find demo02_urdf_gazebo)/worlds/hello.world" />
</include>
Copy

2. 시뮬레이션 환경 사용자 지정

2.1 가제보 시작 구성 패널을 열고 시뮬레이션 환경 그리기

여기에 이미지 설명 삽입

2.2 빌드 환경 저장

클릭: 왼쪽 상단 모서리에 있는 파일 —> 저장(저장 경로 기능 패키지 아래: 모델)

그런 다음 파일 —> 건물 편집기 종료

2.3 세계 파일로 저장

방법 1과 같이 일부 플러그인을 추가한 후 월드 파일로 저장할 수 있습니다(세이브 경로 기능 패키지: worlds 아래).

여기에 이미지 설명 삽입

2.4 시작

같은 방법으로 1

3. 공식 플러그인 사용

현재 Gazebo에서 제공하는 시뮬레이션 소품은 제한적이며 공식 지원도 다운로드하여 보다 풍부한 시뮬레이션 구현을 제공할 수 있습니다.구체적인 구현은 다음과 같습니다.

3.1 공식 모델 라이브러리 다운로드
git clone https://github.com/osrf/gazebo_models

이전: hg clone https://bitbucket.org/osrf/gazebo_models하지만 더 이상 사용할 수 없음

참고: 이 프로세스는 시간이 오래 걸릴 수 있습니다.

3.2 모델 라이브러리를 가제보에 복사

얻은 gazebo_models 폴더 내용을 /usr/share/gazebo-*/models에 복사합니다.

3.3 적용

Gazebo를 다시 시작하고 왼쪽 메뉴 모음에서 삽입을 선택하여 관련 소품을 선택하고 삽입합니다.

7 URDF, Gazebo 및 Rviz의 포괄적인 적용

Gazebo를 통해 로봇의 센서를 시뮬레이션한 다음 이러한 센서가 인식한 데이터를 Rviz에 표시합니다. 주요 내용은 다음과 같습니다.

  • 모션 컨트롤 및 주행 정보 표시
  • 레이더 정보 시뮬레이션 및 디스플레이
  • 카메라 정보 시뮬레이션 및 표시
  • kinect 정보 시뮬레이션 및 디스플레이

7.1 로봇 모션 제어 및 주행 정보 표시

로봇 모델은 가제보에서 정상적으로 표시될 수 있는데, rviz에서처럼 로봇의 움직임을 제어하는 ​​방법은 무엇일까요? 여기에서 ros의 구성 요소인 ros_control이 관련되어야 합니다.

1. ros_control 소개

**시나리오:** 서로 다른 로봇 시스템에 동일한 ROS 프로그램 세트를 배포하는 방법, 예: 개발 단계에서 효율성을 개선하기 위해 시뮬레이션 플랫폼에서 테스트하고 배포 시 서로 다른 물리적 로봇 플랫폼.다른 플랫폼의 구현은 차이점이 있다면 ROS 프로그램의 이식성을 어떻게 보장합니까? ROS 내장 솔루션은 ros_control입니다.

**ros_control:**은 컨트롤러 인터페이스, 컨트롤러 관리자, 전송 및 하드웨어 인터페이스를 포함하는 패키지 세트입니다. ros_control은 로봇 제어를 위한 미들웨어의 집합으로 규격의 집합으로 서로 다른 로봇 플랫폼이 이 규격에 따라 구현되는 한 ROS 프로그램과의 호환성을 보장할 수 있다. , 프로그램 설계의 효율성과 유연성을 크게 향상시킵니다.

Gazebo는 ros_control의 관련 인터페이스를 구현했습니다. Gazebo에서 로봇 움직임을 제어해야 하는 경우 관련 인터페이스를 직접 호출할 수 있습니다.

2. 모션 컨트롤 구현 프로세스(Gazebo)

상속된 모션 제어의 기본 프로세스:

  1. 생성된 로봇 모델에 대해 별도의 xacro 파일을 작성하여 로봇 모델에 변속기 및 컨트롤러 추가
  2. 이 파일을 xacro 파일에 통합
  3. Gazebo를 시작하고 /cmd_vel 메시지를 발행하여 로봇 움직임을 제어합니다.
2.1 조인트에 트랜스미션과 컨트롤러 추가

2륜 차동 구성

<robot name="my_car_move"
    xmlns:xacro="http://wiki.ros.org/xacro">

    <!-- 传动实现:用于连接控制器与关节 -->
    <xacro:macro name="joint_trans" params="joint_name">
        <!-- Transmission is important to link the joints and the controller -->
        <transmission name="${joint_name}_trans">
            <type>transmission_interface/SimpleTransmission</type>
            <joint name="${joint_name}">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
            </joint>
            <actuator name="${joint_name}_motor">
                <hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
                <mechanicalReduction>1</mechanicalReduction>
            </actuator>
        </transmission>
    </xacro:macro>

    <!-- 每一个驱动轮都需要配置传动装置 参考demo05 joint name ${name}2link    名字一定要打对,否则后续启动gazebo不会出现cmd_vel-->
    <xacro:joint_trans joint_name="left2link" />
    <xacro:joint_trans joint_name="right2link" />

    <!-- 控制器 -->
    <gazebo>
        <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
            <rosDebugLevel>Debug</rosDebugLevel>
            <publishWheelTF>true</publishWheelTF>
            <robotNamespace>/</robotNamespace>
            <publishTf>1</publishTf>
            <publishWheelJointState>true</publishWheelJointState>
            <alwaysOn>true</alwaysOn>
            <updateRate>100.0</updateRate>
            <legacyMode>true</legacyMode>
            <leftJoint>left2link</leftJoint>            <!-- 左轮 -->
            <rightJoint>right2link</rightJoint>            <!-- 右轮 -->
            <wheelSeparation>${base_radius * 2}</wheelSeparation>            <!-- 车轮间距 -->
            <wheelDiameter>${wheel_radius * 2}</wheelDiameter>            <!-- 车轮直径 -->
            <broadcastTF>1</broadcastTF>
            <wheelTorque>30</wheelTorque>
            <wheelAcceleration>1.8</wheelAcceleration>
            <commandTopic>cmd_vel</commandTopic>            <!-- 运动控制话题 -->
            <odometryFrame>odom</odometryFrame>
            <odometryTopic>odom</odometryTopic>            <!-- 里程计话题 -->
            <robotBaseFrame>base_footprint</robotBaseFrame>            <!-- 根坐标系 -->
        </plugin>
    </gazebo>

</robot>

2.2 xacro 파일 추가
<!-- 摄像头 -->
<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
  <!-- 被引用的link -->
  <gazebo reference="camera">
    <!-- 类型设置为 camara -->
    <sensor type="camera" name="camera_node">
      <update_rate>30.0</update_rate> <!-- 更新频率 -->
      <!-- 摄像头基本信息设置 -->
      <camera name="head">
        <horizontal_fov>1.3962634</horizontal_fov>
        <image>
          <width>1280</width>
          <height>720</height>
          <format>R8G8B8</format>
        </image>
        <clip>
          <near>0.02</near>
          <far>300</far>
        </clip>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.007</stddev>
        </noise>
      </camera>
      <!-- 核心插件 -->
      <plugin name="gazebo_camera" filename="libgazebo_ros_camera.so">
        <alwaysOn>true</alwaysOn>
        <updateRate>0.0</updateRate>
        <cameraName>/camera</cameraName>
        <imageTopicName>image_raw</imageTopicName>
        <cameraInfoTopicName>camera_info</cameraInfoTopicName>
        <frameName>camera</frameName>
        <hackBaseline>0.07</hackBaseline>
        <distortionK1>0.0</distortionK1>
        <distortionK2>0.0</distortionK2>
        <distortionK3>0.0</distortionK3>
        <distortionT1>0.0</distortionT1>
        <distortionT2>0.0</distortionT2>
      </plugin>
    </sensor>
  </gazebo>
</robot>

<!-- kinetic -->
<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">
    <gazebo reference="suport_link">  
      <sensor type="depth" name="camera">
        <always_on>true</always_on>
        <update_rate>20.0</update_rate>
        <camera>
          <horizontal_fov>${60.0*PI/180.0}</horizontal_fov>
          <image>
            <format>R8G8B8</format>
            <width>640</width>
            <height>480</height>
          </image>
          <clip>
            <near>0.05</near>
            <far>8.0</far>
          </clip>
        </camera>
        <plugin name="kinect_camera_controller" filename="libgazebo_ros_openni_kinect.so">
          <cameraName>camera</cameraName>
          <alwaysOn>true</alwaysOn>
          <updateRate>10</updateRate>
          <imageTopicName>rgb/image_raw</imageTopicName>
          <depthImageTopicName>depth/image_raw</depthImageTopicName>
          <pointCloudTopicName>depth/points</pointCloudTopicName>
          <cameraInfoTopicName>rgb/camera_info</cameraInfoTopicName>
          <depthImageCameraInfoTopicName>depth/camera_info</depthImageCameraInfoTopicName>
          <frameName>support_depth</frameName>
          <baseline>0.1</baseline>
          <distortion_k1>0.0</distortion_k1>
          <distortion_k2>0.0</distortion_k2>
          <distortion_k3>0.0</distortion_k3>
          <distortion_t1>0.0</distortion_t1>
          <distortion_t2>0.0</distortion_t2>
          <pointCloudCutoff>0.4</pointCloudCutoff>
        </plugin>
      </sensor>
    </gazebo>

</robot>


<!-- laser-->
<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro">

  <!-- 雷达 -->
  <gazebo reference="laser"><!-- mingzi -->
    <sensor type="ray" name="rplidar">
      <pose>0 0 0 0 0 0</pose>
      <visualize>true</visualize>
      <update_rate>5.5</update_rate>
      <ray>
        <scan>
          <horizontal>
            <samples>360</samples>
            <resolution>1</resolution>
            <min_angle>-3</min_angle>
            <max_angle>3</max_angle>
          </horizontal>
        </scan>
        <range>
          <min>0.10</min>
          <max>30.0</max>
          <resolution>0.01</resolution>
        </range>
        <noise>
          <type>gaussian</type>
          <mean>0.0</mean>
          <stddev>0.01</stddev>
        </noise>
      </ray>
      <plugin name="gazebo_rplidar" filename="libgazebo_ros_laser.so">
        <topicName>/scan</topicName><!-- hua ti -->
        <frameName>laser</frameName><!-- leidazuobiaoxi -->
      </plugin>
    </sensor>
  </gazebo>
</robot>


2.3 xacro 파일 통합

마지막으로 위의 xacro 파일을 전체 로봇 모델 파일에 통합해야 합니다.코드 예제는 다음과 같습니다.

<!-- 组合小车底盘与摄像头 -->
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="mycar">
    <xacro:include filename="inertia.xacro"/>

    <!-- <文件包含> -->


    <xacro:include filename="demo05_car_base.urdf.xacro"/>
    <xacro:include filename="demo06_car_camera.urdf.xacro"/>
    <xacro:include filename="demo07_car_laser.urdf.xacro"/>

    <xacro:include filename="gazebo/move.xacro"/>

    <xacro:include filename="gazebo/laser.xacro"/>
    <xacro:include filename="gazebo/camera.xacro"/>
    <xacro:include filename="gazebo/kinect.xacro"/>



</robot>

현재 코어: 컨트롤러 및 드라이브 구성이 포함된 xacro 파일

<xacro:include filename="move.xacro" />
2.4 가제보 시작 및 로봇 이동 제어

실행 파일:

<launch>
    <!-- <需要在参数服务器中载入urdf> -->
    <param name="robot_description" command="$(find xacro)/xacro $(find urdf02_gazebo)/urdf/car.urdf.xacro" />
    <!-- <启动Gazebo仿真环境> -->
    <include file="$(find gazebo_ros)/launch/empty_world.launch">
        <arg name="world_name" value="$(find urdf02_gazebo)/worlds/box_house.world" />
    </include>
    <!-- <在Gazebo中添加机器人模型> -->
    <node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description" />
</launch>

시작 파일을 시작하고 주제 목록을 사용하여 주제 목록을 보면 더 많은 /cmd_vel이 있음을 확인한 다음 vmd_vel 메시지 제어를 해제합니다.

명령 제어 사용(또는 개별 노드 제어를 작성할 수 있음)

rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.2, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

가제보에서 차가 정상적으로 달리고 있다

3. Rviz 주행 정보 보기

Gazebo의 시뮬레이션 환경에서는 로봇의 주행 정보와 움직임 방향을 얻을 수 없으며 Rviz를 통해 로봇의 주행 거리 정보와 움직임 방향을 표시할 수 있습니다.

Odometer: 시작점의 좌표계(X 좌표, Y 좌표, Z 좌표 및 방향)에 대한 로봇의 자세 상태입니다.

3.1 Rviz 시작하기

발사 파일

<launch>

    <!-- 设置点云图tf变换参数 -->
    <node pkg="tf2_ros" type="static_transform_publisher" name="static_transform_publisher" args="0 0 0 -1.57 0 -1.57 /suport_link /support_depth" />

    <!-- 启动 rviz -->
    <node pkg="rviz" type="rviz" name="rviz" args="-d $(find urdf01_rviz)/config/show_mycar.rviz" />
    <!-- 添加关节状态节点 -->
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />

    <!-- 添加机器人状态发布节点 -->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />

</launch>
3.2 구성 요소 추가

실행 파일을 실행한 후 Rviz에 아이콘 구성 요소를 추가합니다.

여기에 이미지 설명 삽입

달리다:

roslaunch urdf02_gazebo demo03_env.launch 
roslaunch urdf02_gazebo demo04_sensor.launch 
rosrun teleop_twist_keyboard teleop_twist_keyboard.py _speed:=0.3 _turn:=0.5
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist "linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.3" 

참고: 이름을 올바르게 입력해야 합니다. 그렇지 않으면 cmd_vel이 다음 시작 시 가제보에 나타나지 않습니다.

8. 이 장의 요약

URDF는 로봇 모델을 설명하는 데 사용되는 xml 파일입니다.다른 태그를 사용하여 다른 의미를 나타낼 수 있습니다.URDF는 로봇 모델 코드 중복을 작성합니다.xacro는 URDF 구현을 최적화할 수 있으며 코드 구현은 보다 간소화되고 효율적이며 읽기 쉽습니다. Rviz와 Gazebo를 혼동하기 쉽습니다. 여기서는 다음 두 가지의 차이점에 중점을 둡니다.

rviz는 기존 데이터의 시각화를 강조하는 3D 시각화 도구 입니다.

전망대는 가상 시뮬레이션 환경의 생성을 강조하는 3D 물리적 시뮬레이션 플랫폼 입니다 .

rviz에는 기존 데이터가 필요합니다 .

rviz는 많은 플러그인을 제공하는데, 이러한 플러그인은 이미지, 모델, 경로 등과 같은 정보를 표시할 수 있지만 전제는 이러한 데이터가 주제 및 매개 변수의 형태로 릴리스되었다는 것입니다.rviz가 하는 일은 이러한 데이터를 구독하고 시각적 렌더링을 완료하여 개발 독자가 데이터의 의미를 더 쉽게 이해할 수 있도록 합니다.

Gazebo는 디스플레이 도구가 아니며 시뮬레이션을 강조하고 데이터가 필요하지 않지만 데이터를 생성합니다 .

로봇의 동작 기능을 시뮬레이션할 수 있을 뿐만 아니라 로봇의 센서 데이터를 시뮬레이션할 수 있는 전망대에서 무료로 로봇 세계를 만들 수 있습니다. 그리고 이러한 데이터는 rviz에서 표시가 가능하기 때문에 가제보를 사용할 때 rviz와 함께 사용하는 경우가 많습니다. 로봇 하드웨어가 없거나 실험 환경을 구축하기 어려울 때 시뮬레이션은 종종 매우 유용한 도구입니다.

요약하면 이미 로봇 하드웨어 플랫폼이 있고 필요한 기능을 완료할 수 있는 경우 rviz를 사용하면 개발 요구 사항을 충족할 수 있어야 합니다.

로봇 하드웨어가 없거나 시뮬레이션 환경에서 일부 알고리즘 및 응용 프로그램 테스트를 수행하려는 경우 gazebo+rviz가 필요합니다.

또한 rviz는 rviz+ArbotiX와 같은 다른 기능 패키지로 간단한 시뮬레이션 환경을 만들 수도 있습니다.

추천

출처blog.csdn.net/TianHW103/article/details/128191905