ROS2 6일차(2) URDF

2024. 9. 27. 15:23ROS2/URDF

1. URDF를 Gazebo에서 로딩하기

아래 명령을 실행해서 'src/urdf_tutorial/urdf/robot_2.xacro' 파일을 'src/urdf_tutorial/urdf/robot_3.xacro'파일로 복사

$ cd ~/ch2_ws
$ cp src/urdf_tutorial/urdf/robot_2.xacro src/urdf_tutorial/urdf/robot_3.xacro

 

다음은 robot_3.launch.py를 만들고 robot_2.launch.py에서 'robot_2.xacro'를 robot_3.xacro로 바꿔준다.

그 이후 첫 번째 터미널에서 아래 명령을 실행해서 'robot_state_publisher'를 실행

이때 use_sim_time 옵션을 true로 설정해서 simulation mode를 활성화

# Teminal 1
cd ~/ch2_ws
colcon build --symlink-install
source install/setup.bash
ros2 launch urdf_tutorial robot_3.launch.py use_sim_time:=true

# Terminal 2
ros2 launch gazebo_ros gazebo.launch.py

urdf 정보를 읽어오지 못했기 때문에 아무것도 뜨지않는다

ros2 run gazebo_ros spawn_entity.py -topic robot_description -entity with_robot

ROS 2의 /robot_description 토픽에서 로봇 모델을 읽고, Gazebo에 "with_robot"이라는 이름으로 로봇을 생성하는 역할

로봇이 나오게 된다.

 

여기서 ROS를 실행하고 gazebo를 실행하고 spawn하는 과정이 귀찮기 때문에 이 과정을 하나의 script로 만들어서 한꺼번에 실행할 수 있도록 한다. sim.launch.py를 만들고 아래와 같이 편집

import os
from ament_index_python.packages import get_package_share_directory
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from launch_ros.actions import Node


def generate_launch_description():
    package_name = "urdf_tutorial"

    rsp = IncludeLaunchDescription(
        PythonLaunchDescriptionSource(
            [os.path.join(get_package_share_directory(package_name), "launch", "robot_3.launch.py")]
        ),
        launch_arguments={"use_sim_time": "true"}.items(),
    )

    # Include the Gazebo launch file, provided by the gazebo_ros package
    gazebo = IncludeLaunchDescription(
        PythonLaunchDescriptionSource(
            [os.path.join(get_package_share_directory("gazebo_ros"), "launch", "gazebo.launch.py")]
        ),
    )

    # Run the spawner node from the gazebo_ros package. The entity name doesn't really matter if you only have a single robot.
    spawn_entity = Node(
        package="gazebo_ros",
        executable="spawn_entity.py",
        arguments=["-topic", "robot_description", "-entity", "with_robot"],
        output="screen",
    )

    # Launch them all!
    return LaunchDescription(
        [
            rsp,
            gazebo,
            spawn_entity,
        ]
    )

 

robot_3.xacro 파일도 수정하여 gazebo가 색깔을 출력할 수 있도록 함

 

실행 중인 모든 프로그램을 종료한 뒤 첫 번째 터미널에서 아래 명령을 실행해서 'sim.launch.py'를 실행

cd ~/ch2_ws
colcon build --symlink-install
source install/setup.bash
ros2 launch urdf_tutorial sim.launch.py

이렇게 한번에 나오게 된다!!!!

 

그 다음 주행을 하기 위한 gazebo 플러그인을 사용한다.

gazebo.xacro파일을 생성 후 아래 내용을 추가한다.

<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">

    <gazebo>
        <plugin name="diff_drive" filename="libgazebo_ros_diff_drive.so">

            <!-- Wheel Information -->
            <left_joint>left_wheel_joint</left_joint>
            <right_joint>right_wheel_joint</right_joint>
            <wheel_separation>0.35</wheel_separation>
            <wheel_diameter>0.1</wheel_diameter>

            <!-- Limits -->
            <max_wheel_torque>200</max_wheel_torque>
            <max_wheel_acceleration>10.0</max_wheel_acceleration>

            <!-- Output -->
            <odometry_frame>odom</odometry_frame>
            <robot_base_frame>base_link</robot_base_frame>

            <publish_odom>true</publish_odom>
            <publish_odom_tf>true</publish_odom_tf>
            <publish_wheel_tf>true</publish_wheel_tf>

        </plugin>
    </gazebo>

</robot>

 

그 다음 robot_3.xacro 파일 마지막에 아래 내용을 추가해준다.

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

 

저장 후 실행

$ ros2 run teleop_twist_keyboard teleop_twist_keyboard

주행하다가 충돌이 나서 뒤집어진 모습

 

조인트 유형 운동 방식 주 사용 예
prismatic 선형 운동 자동화 기계, 로봇 팔 조정
continuous 무한 로봇 팔 회전, 카메라 팬
revolute 제한된 회전 로봇 관절
fixed 고정 구조적 연결
floating 6자유도 드론 프레임

 

URDF 추가 팁

xacro에 대해 알아보자

urdf파일을 간편하게 만들어주는 도구?라고 생각하면 되는데

예를 들어

<link name="base_link">
  <visual>
    <geometry>
      <cylinder length="0.6" radius="0.2"/>
    </geometry>
    <material name="blue"/>
  </visual>
  <collision>
    <geometry>
      <cylinder length="0.6" radius="0.2"/>
    </geometry>
  </collision>
</link>

 

이렇게 적어놓으면 실린더의 길이와 반지름을 두 번 지정했다. 그리고 수치를 수정할때 두 번 다 수정을 해줘야한다.

그런데 xacro를 사용하게 되면

<xacro:property name="width" value="0.2" />
<xacro:property name="bodylen" value="0.6" />
<link name="base_link">
    <visual>
        <geometry>
            <cylinder radius="${width}" length="${bodylen}"/>
        </geometry>
        <material name="blue"/>
    </visual>
    <collision>
        <geometry>
            <cylinder radius="${width}" length="${bodylen}"/>
        </geometry>
    </collision>
</link>

 

이렇게 위쪽에 값을 정의하면 나중에 수정할때 정의한 부분만 수정해주면 된다.

그리고 정의된 name들은 ${name} 내용을 대체하게 되고 ${}는 다른 텍스트와 결합할 수도 있다.

<xacro:property name=”robotname” value=”marvin” />
<link name=”${robotname}s_leg” />

<link name=”marvins_leg” />

 

그리고 임의로 복잡한 표현식도 구축할 수 있다.

<cylinder radius="${wheeldiam/2}" length="0.1"/>
<origin xyz="${reflect*(width+.02)} 0 0.25" />

 

매크로를 매개변수화 하게 되면

<xacro:macro name="default_inertial" params="mass">
    <inertial>
            <mass value="${mass}" />
            <inertia ixx="1e-3" ixy="0.0" ixz="0.0"
                 iyy="1e-3" iyz="0.0"
                 izz="1e-3" />
    </inertial>
</xacro:macro>

이렇게 되는데 하나의 블록이라고 생각하면 된다.

코드와 함께 사용하면 아래와 같이 된다.

<xacro:macro name="blue_shape" params="name *shape">
    <link name="${name}">
        <visual>
            <geometry>
                <xacro:insert_block name="shape" />
            </geometry>
            <material name="blue"/>
        </visual>
        <collision>
            <geometry>
                <xacro:insert_block name="shape" />
            </geometry>
        </collision>
    </link>
</xacro:macro>

<xacro:blue_shape name="base_link">
    <cylinder radius=".42" length=".01" />
</xacro:blue_shape>
  • 블록 매개변수를 지정하려면 매개변수 이름 앞에 별표를 포함한다
  • insert_block 명령을 사용하여 블록을 삽일할 수 있다.
  • 원하는 만큼 블록을 삽입

'ROS2 > URDF' 카테고리의 다른 글

ROS2 URDF(4)  (0) 2024.10.04
ROS2 URDF(3)  (0) 2024.09.30
ROS2 6일차(1) URDF  (0) 2024.09.27
ROS2 5일차(2) URDF  (0) 2024.09.26
ROS2 5일차(1) URDF  (0) 2024.09.26