파이톨치

[Robot] ros&gazebo 이륜차 만들기 본문

AI&ML

[Robot] ros&gazebo 이륜차 만들기

파이톨치 2024. 8. 26. 00:35
728x90

https://www.youtube.com/watch?v=V9ztoMuSX8w&t=3007s

 

 

위 영상에 나오는 코드들과 개념들을 정리한 글입니다.

코드들을 사용하려면 돈을 내야하길래 직접 작성했습니다. 

 

정리된 코드는 깃허브에 올렸습니다. 

https://github.com/jung0228/ros/tree/main/2_wheel_bot

 

ros/2_wheel_bot at main · jung0228/ros

Contribute to jung0228/ros development by creating an account on GitHub.

github.com

 

이 프로젝트는 가제보와 ros가 연동되어 돌아갑니다. 

 

Gazebo File (robot.gazebo)

<?xml version="1.0"?>
<robot>
  ...
</robot>

 

전체적으로 위와 같은 구조를 가지고 있습니다. 

이 코드는 Gazebo 시뮬레이터에서 로봇의 물리적 속성과 제어 플러그인을 설정하는 XML 파일입니다.

이 파일은 로봇의 외형과 동작을 정의하고, Gazebo 시뮬레이션 환경에서 로봇이 어떻게 움직이는지 제어하는 중요한 요소들을 설정합니다.

이러한 파일을 URDF(Unified Robot Description Format) or SDF(Simulation Description Format) 라고 부르나 봅니다.  많이 쓰는듯하니 기억해둡시다. 

 

각 <gazebo> 태그는 Gazebo 시뮬레이터에서 사용할 로봇의 특정 물리적 속성 또는 재질을 설정합니다.

<gazebo reference="body_link">
  <mu1>0.2</mu1>
  <mu2>0.2</mu2>
  <material>Gazebo/Red</material>
</gazebo>

 

이러한 조각을 파이썬의 클래스라고 이해하면 좋을 것 같습니다. 조각 조각을 붙여서 로봇을 만드는 겁니다. 

 

reference: 이 속성은 Gazebo에서 설정을 적용할 특정 링크의 이름을 지정합니다. 예를 들어, "body_link"는 로봇의 본체에 해당하는 링크일 수 있습니다. 뒤에서 이 레퍼런스를 통해서 ros와 연결할 겁니다.

 

mu1 및 mu2: 마찰 계수를 설정하는 태그입니다. mu1과 mu2는 각각 접촉면의 두 축을 따라 적용되는 마찰 계수로, 값을 높이면 해당 축의 마찰력이 증가합니다.

 

material: Gazebo에서 사용할 링크의 재질을 정의합니다.

 

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

 

plugin 태그: Gazebo에서 로봇의 동작을 제어하기 위해 사용되는 플러그인을 정의합니다.

  • name: 플러그인의 이름을 지정합니다. 이 이름은 시뮬레이션에서 이 플러그인을 참조할 때 사용됩니다.
  • filename: 플러그인의 실제 파일 경로를 지정합니다. 여기서는 libgazebo_ros_diff_drive.so 파일을 사용하고 있으며, 이는 ROS와 연동되는 차동 구동 플러그인입니다. => 외부 플러그인 사용 
<ros>
  <namespace></namespace>
</ros>

 

=> 이건 뭔지 잘 모르겠음. ros 관련된 설명 정의하는 곳이라고 한다. 

 

로봇의 물리적 속성과의 연결

이제 본격적으로 위에서 정의된 로봇의 물리적 속성과 이 플러그인을 어떻게 연결하는지 살펴보겠습니다.

<num_wheel_pairs>1</num_wheel_pairs>

 

num_wheel_pairs: 차동 구동에 사용되는 바퀴 쌍의 수를 지정합니다. 이 값은 1로 설정되어 있어, 좌우에 각각 하나의 바퀴가 있는 기본적인 차동 구동 시스템을 의미합니다.

 

<left_joint>wheel2_joint</left_joint>
<right_joint>wheel_joint</right_joint>

 

left_jointright_joint: 왼쪽과 오른쪽 바퀴에 연결된 조인트를 지정합니다.

  • wheel2_joint: wheel2_link와 관련된 조인트입니다.
  • wheel_joint: wheel_link와 관련된 조인트입니다.

이 설정을 통해 Gazebo는 특정 조인트가 실제로 로봇의 왼쪽과 오른쪽 바퀴를 제어하는 데 사용된다는 것을 인식합니다.

 

바퀴 간 거리 및 크기

<wheel_separation>${body_link_y_dim+wheel_link_length}</wheel_separation>
<wheel_diameter>${wheel_link_radius}</wheel_diameter>

 

 

  • wheel_separation: 두 바퀴 사이의 거리를 지정합니다. 여기서는 ${body_link_y_dim+wheel_link_length}로 설정되어 있습니다. 이는 body_link의 Y축 크기와 wheel_link의 길이를 더한 값입니다.
  • wheel_diameter: 바퀴의 직경을 지정합니다. ${wheel_link_radius}로 설정되어 있으며, 이는 wheel_link의 반지름 값을 의미합니다.

아래 설계도를 참고하면 될거 같다. 저기 있는 body_link_y_dim 값과 같은 것들은 ROS에서 설정해주는 값이다. 

body의 y 사이즈 + (바퀴 길이 // 2 * 2) 하니까 => 두 바퀴 사이 거리다. 그림 상에서는 0.7 정도 되는듯하다.

직경은 말 그대로 직경이다. 

 

 

토크 및 가속도 설정

<max_wheel_torque>1000</max_wheel_torque>
<max_wheel_acceleration>5.0</max_wheel_acceleration>

 

 

  • max_wheel_torque: 바퀴에 적용할 수 있는 최대 토크를 설정합니다. 이 값은 1000으로 설정되어 있습니다. 이 설정은 바퀴가 얼마나 강하게 회전할 수 있는지를 제어합니다.
  • max_wheel_acceleration: 바퀴의 최대 가속도를 설정합니다. 이 값은 5.0으로 설정되어 있습니다. 이 설정은 바퀴가 얼마나 빠르게 가속할 수 있는지를 제어합니다.

토크는 돌림힘이다. 

https://namu.wiki/w/%EB%8F%8C%EB%A6%BC%ED%9E%98

 

돌림힘

돌림힘 또는 토크 (torque)란 물체가 회전운동을 할 때 나타나는 회전 의 경향의 척도, 물체를 회전시키기

namu.wiki

 

Odometry 및 TF 설정, 프레임 설정 (이건 아직 잘 모르겠다.) 

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

<odometry_frame>odom</odometry_frame>
<robot_base_frame>dummy</robot_base_frame>

  

  • publish_odom: 로봇의 위치와 방향 정보를 담고 있는 odometry 데이터를 퍼블리시할지 여부를 설정합니다. true로 설정되어 있어, Gazebo는 odometry 정보를 ROS 네트워크로 퍼블리시합니다.
  • publish_odom_tfpublish_wheel_tf: odometry 프레임과 바퀴의 TF(Transform Frame) 정보를 퍼블리시할지 여부를 설정합니다. 둘 다 true로 설정되어 있어, 로봇의 위치와 바퀴의 위치를 ROS TF 트리에 추가합니다.
  • odometry_frame: odometry 데이터의 기준 프레임을 지정합니다. 이 예제에서는 "odom"으로 설정되어 있으며, 이는 ROS에서 odometry 데이터를 참조할 기본 프레임이 됩니다.
  • robot_base_frame: 로봇의 기본 프레임을 지정합니다. "dummy"로 설정되어 있으며, 이 프레임은 로봇의 중심이 될 프레임을 나타냅니다. (뒤에 ros에서 dummy 사용할 예정임)

이 플러그인 설정은 Gazebo 시뮬레이션에서 로봇의 차동 구동 시스템을 정의하고 제어하는 데 사용됩니다. 로봇의 물리적 속성(예: 조인트, 바퀴 간 거리, 바퀴 크기)과 플러그인의 설정을 연결하여, 로봇이 시뮬레이션에서 물리적으로 올바르게 동작하도록 보장합니다. ROS와의 통합을 통해 실시간으로 odometry 데이터를 퍼블리시하고, 로봇의 위치와 움직임을 추적할 수 있습니다.

ROS File (robot.xacro)

이 코드는 ROS (Robot Operating System)에서 사용하는 URDF (Unified Robot Description Format) 파일입니다. 이 파일은 로봇의 물리적 속성, 모양, 관성 등을 정의하고 있습니다. URDF 파일은 XML 형식으로 작성되며, 로봇의 구조와 관련된 모든 정보를 명시합니다.
 

이 코드는 특히 xacro(XML Macros)라는 확장 기능을 사용하여, 매개변수화된 로봇 설명을 만들고 있습니다. xacro는 로봇의 속성을 정의할 때 변수와 매크로를 사용하여 코드의 반복을 줄이고 유지보수를 쉽게 해줍니다.

 

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

 

  • XML 선언: 파일이 XML 형식임을 명시합니다.
  • <robot> 태그: 로봇의 URDF 정의의 최상위 요소입니다.
    • name 속성: 로봇의 이름을 정의합니다. 여기서는 "differential_drive_robot"로 설정되었습니다.
    • xmlns:xacro 속성: xacro 네임스페이스를 정의하여 XML 파일에서 xacro 기능을 사용할 수 있도록 합니다.

이제 설계도를 따라 로봇의 크기, 위치, 밀도, 질량 등을 넣어줍시다! 

 

로봇의 기하학적 특성 정의

<xacro:property name="body_link_x_dim" value="1"/>
<xacro:property name="body_link_y_dim" value="0.6"/>
<xacro:property name="body_link_z_dim" value="0.3"/>

<xacro:property name="wheel_link_radius" value="0.15"/>
<xacro:property name="wheel_link_length" value="0.1"/>
<xacro:property name="wheel_link_z_location" value="-0.1"/>

<xacro:property name="caster_link_radius" value="0.15"/>
<xacro:property name="caster_link_z_location" value="-0.1"/>

 

 

  • body_link_x_dim: 로봇 본체의 X축 길이 (1 미터).
  • body_link_y_dim: 로봇 본체의 Y축 길이 (0.6 미터).
  • body_link_z_dim: 로봇 본체의 Z축 높이 (0.3 미터).
  • wheel_link_radius: 바퀴의 반지름 (0.15 미터).
  • wheel_link_length: 바퀴의 두께 또는 길이 (0.1 미터).
  • wheel_link_z_location: 바퀴의 Z축 위치 (-0.1 미터). 이는 바퀴가 로봇 본체 아래에 위치함을 의미합니다.
  • caster_link_radius: 캐스터 스피어(로봇의 앞이나 뒤에 위치한 작은 바퀴)의 반지름 (0.15 미터).
  • caster_link_z_location: 캐스터 스피어의 Z축 위치 (-0.1 미터).

재질 밀도 및 물리적 속성 정의

<xacro:property name="body_density" value="2710.0"/>
<xacro:property name="wheel_density" value="2710.0"/>
<xacro:property name="caster_density" value="2710.0"/>

<xacro:property name="pi_const" value="3.14159265"/>

<xacro:property name="body_mass" value="${body_density * body_link_x_dim * body_link_y_dim * body_link_z_dim}"/>
<xacro:property name="wheel_mass" value="${wheel_density * pi_const * wheel_link_radius * wheel_link_radius * wheel_link_length}"/>
<xacro:property name="caster_mass" value="${caster_density * (4.0/3.0) * pi_const * caster_link_radius * caster_link_radius * caster_link_radius}"/>

<xacro:property name="Iz_wheel" value="${0.5 * wheel_mass * wheel_link_radius * wheel_link_radius}" />
<xacro:property name="I_wheel" value="${(1.0/12.0) * wheel_mass * (3.0 * wheel_link_radius * wheel_link_radius + wheel_link_length * wheel_link_length)}" />
<xacro:property name="I_caster" value="${(2.0/5.0) * caster_mass * caster_link_radius * caster_link_radius}" />

 

 

 

  • body_density: 로봇 본체 재질의 밀도 (2710 kg/m³, 이는 알루미늄 밀도와 유사).
  • wheel_density: 바퀴 재질의 밀도 (2710 kg/m³).
  • caster_density: 캐스터 스피어 재질의 밀도 (2710 kg/m³).
  • pi_const: 원주율 π를 정의합니다. 바퀴와 캐스터의 부피 및 질량 계산에 사용됩니다.
  • body_mass: 로봇 본체의 질량을 계산합니다. 밀도와 부피를 곱하여 구합니다.
    • 부피는 X, Y, Z 축 길이를 모두 곱한 값입니다.
  • wheel_mass: 바퀴의 질량을 계산합니다.
    • **pi_const**와 바퀴 반지름의 제곱, 바퀴의 길이를 곱하여 구합니다.
  • caster_mass: 캐스터 스피어의 질량을 계산합니다.
    • 구의 부피 공식 4/3 * π * r³을 사용합니다.
  • Iz_wheel: 바퀴의 Z축에 대한 관성 모멘트를 계산합니다. 원통의 관성 모멘트 공식 0.5 * m * r²를 사용합니다.
  • I_wheel: 바퀴의 다른 축에 대한 관성 모멘트를 계산합니다. 원통에 대한 일반적인 관성 모멘트 공식을 사용합니다.
  • I_caster: 캐스터의 관성 모멘트를 계산합니다. 구에 대한 관성 모멘트 공식 (2/5) * m * r²을 사용합니다.

 

관성 모멘트 잘 몰라서...

https://namu.wiki/w/%EA%B4%80%EC%84%B1%20%EB%AA%A8%EB%A9%98%ED%8A%B8

 

관성 모멘트

moment of inertia 물체가 회전 운동을 하는 상태를 계속 유지하려는 성질을 의미한다. 회전 관성

namu.wiki

 

이 URDF 파일의 내용은 이전에 제공된 Gazebo 플러그인 설정과 연결됩니다. 예를 들어, wheel_separation이나 wheel_diameter와 같은 값들은 여기서 정의된 로봇의 기하학적 특성을 바탕으로 계산될 수 있으며, 이는 Gazebo에서의 로봇 동작 시뮬레이션에 직접적으로 영향을 미칩니다.

 

매크로 설정

xacro 매크로는 로봇의 여러 부분에서 반복적으로 사용할 수 있는 코드 블록을 정의하는 기능입니다. 매크로를 사용하면 로봇의 부품에 대한 정의를 보다 간결하고, 재사용 가능하게 만듭니다. 여기서 매크로는 로봇의 바퀴와 캐스터에 대한 관성 정보를 정의하는 데 사용됩니다.

<!-- Macros for inertia -->
<xacro:macro name="inertia_wheel">
  <inertial>
    <origin rpy="0 0 0" xyz="0 0 0"/>
    <mass value="${wheel_mass}"/>
    <inertia ixx="${I_wheel}" ixy="0.0" ixz="0.0" iyy="${I_wheel}" iyz="0" izz="${Iz_wheel}" />
  </inertial>
</xacro:macro>

<xacro:macro name="inertia_caster">
  <inertial>
    <origin rpy="0 0 0" xyz="0 0 0"/>
    <mass value="${caster_mass}"/>
    <inertia ixx="${I_caster}" ixy="0.0" ixz="0.0" iyy="${I_caster}" iyz="0" izz="${I_caster}" />
  </inertial>
</xacro:macro>
  • <xacro:macro> 태그: 새로운 매크로를 정의합니다.
    • name="inertia_wheel": 매크로의 이름입니다. 이 이름을 통해 나중에 이 매크로를 호출할 수 있습니다.
  • <inertial> 태그: URDF에서 링크의 질량 중심과 관성 모멘트를 정의하는 데 사용됩니다.
    • <origin> 태그:
      • rpy: 회전(rpy: roll, pitch, yaw)을 정의하며, 여기서는 "0 0 0"으로 설정되어 있어 회전이 없음을 의미합니다.
      • xyz: 원점의 위치를 정의하며, "0 0 0"으로 설정되어 있어 로컬 프레임의 원점에 있음을 의미합니다.
    • <mass> 태그:
      • value: 바퀴의 질량을 정의합니다. 이 값은 ${wheel_mass}로 설정되어 있으며, 앞서 정의한 wheel_mass 속성의 값을 사용합니다.
    • <inertia> 태그:
      • 관성 모멘트를 정의합니다. 이 모멘트는 물체가 회전하는데 얼마나 저항하는지를 나타냅니다.
      • ixx, iyy, izz: 바퀴의 X, Y, Z 축에 대한 관성 모멘트입니다.
        • ixx 및 iyy는 회전축에 수직한 면에서의 관성 모멘트 (I_wheel),
        • izz는 바퀴의 회전축을 따라 계산된 관성 모멘트 (Iz_wheel).

매크로가 중요한 이유

  • 재사용성: 한 번 정의된 매크로는 로봇 모델에서 여러 번 사용할 수 있습니다. 예를 들어, 여러 개의 바퀴가 있을 경우, inertia_wheel 매크로를 여러 번 호출하여 바퀴 각각의 관성 정보를 간단하게 추가할 수 있습니다.
  • 유지보수 용이성: 매크로를 사용하면 로봇 모델을 수정할 때 간편하게 업데이트할 수 있습니다. 예를 들어, 바퀴의 질량이나 관성 값이 변경될 경우 매크로 정의부만 수정하면 됩니다.
  • 가독성: 매크로를 사용하여 로봇의 복잡한 구조를 더 쉽게 이해할 수 있습니다. 코드가 중복되지 않고 깔끔해지기 때문에 가독성이 향상됩니다.

가제보와 연동 

<!-- Include Gazebo options -->
<xacro:include filename="$(find mobile_dd_robot)/model/robot.gazebo" />
  • <xacro:include> 태그: xacro 파일에서 외부 파일을 포함하는 데 사용됩니다.
  • filename="$(find mobile_dd_robot)/model/robot.gazebo": mobile_dd_robot 패키지의 model 폴더에 있는 robot.gazebo 파일을 포함합니다. 이 파일에는 Gazebo에서 로봇을 시뮬레이션하기 위해 필요한 추가적인 설정이 포함되어 있을 것입니다.
<!-- Dummy link for Gazebo -->
<link name="dummy"/>
<joint name="dummy_joint" type="fixed">
  <parent link="dummy"/>
  <child link="body_link"/>
</joint>
  • 더미 링크 (dummy): 이 링크는 실제 물리적 특성은 없고, 주로 Gazebo 시뮬레이션에서 특정 초기 상태나 참조점을 설정하기 위해 사용됩니다.
  • 더미 조인트 (dummy_joint):
    • name="dummy_joint": 조인트의 이름입니다.
    • type="fixed": 고정된 조인트로, 부모 링크(dummy)와 자식 링크(body_link) 사이에 상대적 움직임이 없음을 의미합니다.
    • <parent link="dummy"/>: 부모 링크를 dummy로 설정합니다.
    • <child link="body_link"/>: 자식 링크를 body_link로 설정합니다. 이 더미 조인트는 dummy 링크와 body_link를 연결합니다.
<!-- Body link of the robot -->
<link name="body_link"> 
  <visual> 
    <geometry> 
      <box size="${body_link_x_dim} ${body_link_y_dim} ${body_link_z_dim}" /> 
    </geometry> 
    <origin rpy="0 0 0" xyz="0 0 0" /> 
  </visual> 
  <collision> 
    <geometry> 
      <box size="${body_link_x_dim} ${body_link_y_dim} ${body_link_z_dim}" /> 
    </geometry> 
    <origin rpy="0 0 0" xyz="0 0 0" /> 
  </collision> 
  <inertial> 
    <origin rpy="0 0 0" xyz="0 0 0" /> 
    <mass value="${body_mass}" /> 
    <inertia 
      ixx="${(1/12)*body_mass*(body_link_y_dim*body_link_y_dim+body_link_z_dim*body_link_z_dim)}" 
      ixy="0" 
      ixz="0" 
      iyy="${(1/12)*body_mass*(body_link_x_dim*body_link_x_dim+body_link_z_dim*body_link_z_dim)}" 
      iyz="0" 
      izz="${(1/12)*body_mass*(body_link_x_dim*body_link_x_dim+body_link_y_dim*body_link_y_dim)}" 
    /> 
  </inertial> 
</link>
  • <link name="body_link">: 로봇의 본체에 해당하는 링크를 정의합니다.
    • name="body_link": 링크의 이름을 body_link로 설정합니다.
  • <visual> 태그: 시각적인 표현을 정의합니다.
    • <geometry>: 기하학적 모양을 정의합니다.
      • <box size="${body_link_x_dim} ${body_link_y_dim} ${body_link_z_dim}" />: 로봇의 본체를 박스 형태로 정의하며, 크기는 앞서 정의한 body_link_x_dim, body_link_y_dim, body_link_z_dim 변수를 사용합니다.
    • <origin rpy="0 0 0" xyz="0 0 0" />: 시각적 표현의 원점을 정의합니다. 여기서는 회전(rpy)과 위치(xyz) 모두 (0, 0, 0)으로 설정되어 있어, 로컬 프레임의 원점에 있음을 의미합니다.
  • <collision> 태그: 충돌 감지를 위한 물리적 모양을 정의합니다.
    • <geometry>: 충돌 감지에 사용할 기하학적 모양을 정의합니다.
      • <box size="${body_link_x_dim} ${body_link_y_dim} ${body_link_z_dim}" />: 로봇의 본체를 위한 충돌 감지 모양을 정의합니다.
    • <origin rpy="0 0 0" xyz="0 0 0" />: 충돌 감지 모양의 원점입니다. (0, 0, 0)으로 설정되어 있습니다.
  • <inertial> 태그: 링크의 질량 중심과 관성 모멘트를 정의합니다.
    • <origin rpy="0 0 0" xyz="0 0 0" />: 질량 중심의 위치와 회전을 정의합니다. (0, 0, 0)으로 설정되어 있어, 본체의 중심에 있음을 의미합니다.
    • <mass value="${body_mass}" />: 링크의 질량을 설정합니다. body_mass 변수에 의해 결정됩니다.
    • <inertia> 태그: 링크의 관성 모멘트를 정의합니다.
      • ixx, iyy, izz: 링크의 주요 축에 대한 관성 모멘트 값입니다.
      • ixx: X축에 대한 관성 모멘트.
      • iyy: Y축에 대한 관성 모멘트.
      • izz: Z축에 대한 관성 모멘트.
      • 관성 모멘트 값들은 표준적인 직육면체의 관성 공식에서 계산되며, 각각의 축에 대해 로봇 본체의 크기와 질량을 고려한 수식으로 표현됩니다.
<joint name="wheel_joint" type="continuous"> 
  <parent link="body_link" /> 
  <child link="wheel_link" /> 
  <origin xyz="${-2*wheel_link_radius} ${-body_link_y_dim/2-wheel_link_length/2} ${wheel_link_z_location}" rpy="0 0 0" /> 
  <axis xyz="0 1 0"/> 
  <limit effort="1000" velocity="1000"/> 
  <dynamics damping="1.0" friction="1.0"/> 
</joint>
  • <joint name="wheel_joint" type="continuous">: 이 태그는 로봇의 휠과 본체 사이의 조인트를 정의합니다.
    • name="wheel_joint": 조인트의 이름은 wheel_joint입니다.
    • type="continuous": 조인트 유형은 "continuous"로, 회전 운동을 허용하는 조인트 타입입니다. 즉, 휠이 무한히 회전할 수 있도록 설정됩니다.
  • <parent link="body_link" />: 부모 링크는 body_link로, 이는 휠이 로봇의 본체에 부착된다는 것을 의미합니다.
  • <child link="wheel_link" />: 자식 링크는 wheel_link로, 이 조인트가 휠 링크와 연결되어 있음을 나타냅니다.
  • <origin xyz="..." rpy="..." />: 조인트의 원점과 회전 방향을 설정합니다.
    • xyz: 조인트의 원점 위치입니다.
      • ${-2*wheel_link_radius}: X 방향으로 휠의 반지름의 두 배만큼 이동시켜 휠을 로봇의 중앙축에서 떨어뜨립니다.
      • ${-body_link_y_dim/2-wheel_link_length/2}: Y 방향으로 로봇의 바디의 절반 너비와 휠 길이의 절반을 빼서, 휠을 바디의 옆에 배치합니다.
      • ${wheel_link_z_location}: Z 방향은 휠의 Z 위치에 의해 설정됩니다.
    • rpy="0 0 0": 조인트의 회전(roll, pitch, yaw)을 정의하며, 여기서는 회전이 없습니다.
  • <axis xyz="0 1 0"/>: 조인트의 회전축을 정의합니다. xyz="0 1 0"은 Y축을 기준으로 회전하도록 설정됩니다.
  • <limit effort="1000" velocity="1000"/>: 조인트의 물리적 제한을 설정합니다.
    • effort="1000": 조인트에 가해질 수 있는 최대 힘(토크)를 설정합니다.
    • velocity="1000": 조인트의 최대 속도를 설정합니다.
  • <dynamics damping="1.0" friction="1.0"/>: 조인트의 동적 특성을 설정합니다.
    • damping="1.0": 조인트의 감쇠 계수입니다.
    • friction="1.0": 조인트의 마찰 계수입니다.
<link name="wheel_link"> 
  <visual> 
    <origin rpy="1.570795 0 0" xyz="0 0 0" /> 
    <geometry> 
      <cylinder length="${wheel_link_length}" radius="${wheel_link_radius}" /> 
    </geometry> 
  </visual> 
  <collision> 
    <origin rpy="1.570795 0 0" xyz="0 0 0" /> 
    <geometry> 
      <cylinder length="${wheel_link_length}" radius="${wheel_link_radius}" /> 
    </geometry> 
  </collision> 
  <xacro:inertia_wheel /> 
</link>
  • <link name="wheel_link">: 이 태그는 휠에 대한 링크를 정의합니다.
    • name="wheel_link": 링크의 이름은 wheel_link입니다.
  • <visual> 태그: 휠의 시각적 표현을 정의합니다.
    • <origin rpy="1.570795 0 0" xyz="0 0 0" />: 휠의 시각적 표현에 대한 원점과 회전을 설정합니다.
      • rpy="1.570795 0 0": X축을 기준으로 90도(1.570795 라디안) 회전하여, 휠이 수평이 아닌 수직으로 서 있도록 설정합니다.
      • xyz="0 0 0": 시각적 표현의 원점 위치를 설정합니다.
    • <geometry>: 휠의 기하학적 모양을 정의합니다.
      • <cylinder length="${wheel_link_length}" radius="${wheel_link_radius}" />: 휠의 기하학적 모양을 원통(cylinder)으로 정의하며, 길이와 반지름은 변수 wheel_link_length와 wheel_link_radius를 사용하여 설정합니다.
  • <collision> 태그: 휠의 충돌 감지를 위한 물리적 모양을 정의합니다. 시각적 표현과 거의 동일하게 설정됩니다.
    • <origin rpy="1.570795 0 0" xyz="0 0 0" />: 충돌 감지 모양의 원점과 회전을 설정합니다.
    • <geometry>: 충돌 감지에 사용할 기하학적 모양을 정의합니다.
      • <cylinder length="${wheel_link_length}" radius="${wheel_link_radius}" />: 충돌 감지 모양을 원통으로 설정합니다.
  • <xacro:inertia_wheel />: 앞서 정의한 inertia_wheel 매크로를 호출하여 휠의 관성 정보를 설정합니다.
    • inertia_wheel 매크로는 휠의 질량과 관성 모멘트를 포함하는 <inertial> 태그를 추가합니다. 휠의 무게 중심과 회전 저항 특성을 정의합니다.
<joint name="wheel2_joint" type="continuous">
  <parent link="body_link"/>
  <child link="wheel2_link" />
  <origin xyz="${-2*wheel_link_radius} ${body_link_y_dim/2+wheel_link_length/2} ${wheel_link_z_location}" rpy="0 0 0" />
  <axis xyz="0 1 0" />
  <limit effort="1000" velocity="1000"/>
  <dynamics damping="1.0" friction="1.0"/>
</joint>

<link name="wheel2_link">
  <visual>
    <origin rpy="1.570795 0 0" xyz="0 0 0"/>
    <geometry>
      <cylinder length="${wheel_link_length}" radius="${wheel_link_radius}"/>
    </geometry>
  </visual>
  <collision>
    <origin rpy="1.570795 0 0" xyz="0 0 0"/>
    <geometry>
      <cylinder length="${wheel_link_length}" radius="${wheel_link_radius}"/>
    </geometry>
  </collision>
  <xacro:inertia_wheel />
</link>
  • <joint name="wheel2_joint" type="continuous">: 이 태그는 로봇의 후방 왼쪽 휠을 본체에 연결하는 조인트를 정의합니다.
    • type="continuous": 휠이 계속 회전할 수 있도록 설정된 조인트 유형입니다.
    • <parent link="body_link"/>: 부모 링크는 로봇의 본체 body_link입니다.
    • <child link="wheel2_link"/>: 자식 링크는 휠 wheel2_link입니다.
    • <origin xyz="..." rpy="0 0 0"/>: 휠의 위치와 회전 설정.
      • ${-2*wheel_link_radius}: X축 방향으로 휠의 반지름의 두 배만큼 이동.
      • ${body_link_y_dim/2+wheel_link_length/2}: Y축 방향으로 본체의 반 너비와 휠 길이의 절반을 더해서 설정.
      • ${wheel_link_z_location}: Z축 방향으로 휠의 위치를 설정.
    • <axis xyz="0 1 0" />: Y축을 따라 회전.
    • <limit effort="1000" velocity="1000"/>: 최대 힘과 속도 제한.
    • <dynamics damping="1.0" friction="1.0"/>: 감쇠(damping)와 마찰(friction) 설정.
  • <link name="wheel2_link">: 후방 왼쪽 휠의 링크 정의.
    • <visual>: 휠의 시각적 요소 정의.
      • <geometry><cylinder>: 원통형(cylinder) 모양으로 시각화.
    • <collision>: 휠의 충돌 감지 요소 정의.
      • 시각적 요소와 동일한 원통형(cylinder) 정의.
    • <xacro:inertia_wheel />: 앞서 정의된 휠의 관성 모멘트(inertia)를 추가.
<joint name="caster_joint" type="fixed">
  <parent link="body_link"/>
  <child link="caster_link"/>
  <origin xyz="${2*caster_link_radius} 0 ${caster_link_z_location}" rpy="0 0 0"/>
</joint>

<link name="caster_link">
  <visual>
    <origin rpy="0 0 0" xyz="0 0 0"/>
    <geometry>
      <sphere radius="${caster_link_radius}"/>
    </geometry>
  </visual>
  <collision>
    <origin rpy="0 0 0" xyz="0 0 0"/>
    <geometry>
      <sphere radius="${caster_link_radius}"/>
    </geometry>
  </collision>
  <xacro:inertia_caster />
</link>
  • <joint name="caster_joint" type="fixed">: 캐스터를 본체에 고정하는 조인트 정의.
    • type="fixed": 이 조인트는 고정(fixed) 타입으로, 캐스터는 본체에 고정되어 회전하거나 움직이지 않습니다.
    • <parent link="body_link"/>: 부모 링크는 본체 body_link입니다.
    • <child link="caster_link"/>: 자식 링크는 캐스터 caster_link입니다.
    • <origin xyz="..." rpy="0 0 0"/>: 캐스터의 위치와 회전을 설정.
      • ${2*caster_link_radius}: X축 방향으로 캐스터 반지름의 두 배만큼 이동.
      • Y축은 0으로 본체의 중심선에 위치.
      • ${caster_link_z_location}: Z축 방향으로 캐스터의 위치를 설정.
  • <link name="caster_link">: 캐스터의 링크 정의.
    • <visual>: 캐스터의 시각적 요소 정의.
      • <geometry><sphere>: 구형(sphere) 모양으로 시각화.
    • <collision>: 캐스터의 충돌 감지 요소 정의.
      • 시각적 요소와 동일한 구형(sphere) 정의.
    • <xacro:inertia_caster />: 앞서 정의된 캐스터의 관성 모멘트(inertia)를 추가.

 

</robot>

 

Fin.....

728x90