天天看點

搭建自己的第一個URDF小車模型

一、URDF簡介

  URDF(Unified Robot Description Format,統一的機器人描述格式),是ROS中非常重要的機器人模型描述格式;可以解析URDF檔案中使用XML格式描述的機器人模型;ROS同時也提供URDF檔案的C++解析器。

二、建構URDF模型的XML語言說明:

搭建自己的第一個URDF小車模型

為了計算上的友善,經常會将模型簡化,比如例子中的橢圓的碰撞計算的時候,采用方形來簡化計算。Link origin:原始的坐标系,是模型參考系。

Joint:連接配接兩個link,并且有主次,parent/child link(父、子關節)

搭建自己的第一個URDF小車模型
搭建自己的第一個URDF小車模型

以上的link joint都是機器人模組化一部分,是以需要将其包括在一個大的标簽中:

這裡就是 robot

搭建自己的第一個URDF小車模型

三、建構自己小車模型

   先上效果圖:

搭建自己的第一個URDF小車模型

         各個元件的坐标系之間的關系圖:

搭建自己的第一個URDF小車模型

代碼如下:

<?xml version="1.0" ?>
<robot name="mbot">

    <link name="base_link">
        <visual>
            <origin xyz=" 0 0 0.05" rpy="0 0 0" />
            <geometry>
                <box size="0.26 0.26 0.10" />
            </geometry>
            <material name="yellow">
                <color rgba="1 0.4 0 1" />
            </material>
        </visual>
    </link>

    <link name="back_left_wheel_link">
        <visual>
            <origin xyz=" 0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder length="0.02" radius="0.026" />
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <joint name="back_left_wheel_joint" type="continuous">
        <origin xyz="0.10 0.13 0" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="back_left_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>

    <link name="back_right_wheel_link">
        <visual>
            <origin xyz=" 0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder length="0.02" radius="0.026" />
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <joint name="back_right_wheel_joint" type="continuous">
        <origin xyz="-0.10 0.13 0" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="back_right_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>



    <link name="front_left_wheel_link">
        <visual>
            <origin xyz=" 0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder length="0.02" radius="0.026" />
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <joint name="front_left_wheel_joint" type="continuous">
        <origin xyz="0.10 -0.13 0" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="front_left_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>

    <link name="front_right_wheel_link">
        <visual>
            <origin xyz=" 0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder length="0.02" radius="0.026" />
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <joint name="front_right_wheel_joint" type="continuous">
        <origin xyz="-0.10 -0.13 0" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="front_right_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>


    <link name="rplidar_link">
        <visual>
            <origin xyz=" 0 0 0" rpy="0 0 0" />
            <geometry>
                <cylinder length="0.05" radius="0.03" />
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"/>
            </material>
        </visual>
    </link>

    <joint name="rplidar_joint" type="fixed">
        <origin xyz="0 0 0.125" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="rplidar_link"/>
    </joint>


    <link name="camera_link">
        <visual>
            <origin xyz=" 0 0 0" rpy="0 0 1.5707" />
            <geometry>
                <box size="0.02 0.02 0.02"/>
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"/>
            </material>
        </visual>
    </link>

    <joint name="camera_joint" type="fixed">
        <origin xyz="0.14 0 0.05" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="camera_link"/>
    </joint>

</robot>



           

四、建構過程說明

1、準備工作

  在終端中建立一個工作空間:

       mkdir -p catkin_ws/src

  編譯并重新整理它:

      catkin_make 

      source ~/catkin_ws/devel/setup.bash

  在src目錄下建立功能包,後面跟上相應的模型依賴:

   catkin_create_pkg mbot_description urdf xacro

  然後在功能包中建立幾個檔案夾:

          urdf、 meshes、 launch、 config等幾個檔案夾

         mkdir urdf meshes launch config

  在urdf檔案夾中建立模型檔案 mbot_base.urdf

          ......

  在launch中建立display_mbot_base_urdf.launch檔案,内容如下:

<launch>
	<param name="mbot_description" textfile="$(find mbot_description)/urdf/mbot_base.urdf" />

	<!-- 設定GUI參數,顯示關節控制插件 -->
	<param name="use_gui" value="true"/>
	
	<!-- 運作joint_state_publisher節點,釋出機器人的關節狀态  -->
	<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
	
	<!-- 運作robot_state_publisher節點,釋出tf  -->
	<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
	
	<!-- 運作rviz可視化界面 -->
	<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" />
</launch>
           

   在config檔案夾中添加配置檔案 mbot_urdf.rviz 如下:

Panels:
  - Class: rviz/Displays
    Help Height: 78
    Name: Displays
    Property Tree Widget:
      Expanded:
        - /Global Options1
        - /Status1
        - /TF1
      Splitter Ratio: 0.5
    Tree Height: 548
  - Class: rviz/Selection
    Name: Selection
  - Class: rviz/Tool Properties
    Expanded:
      - /2D Pose Estimate1
      - /2D Nav Goal1
      - /Publish Point1
    Name: Tool Properties
    Splitter Ratio: 0.588679016
  - Class: rviz/Views
    Expanded:
      - /Current View1
    Name: Views
    Splitter Ratio: 0.5
  - Class: rviz/Time
    Experimental: false
    Name: Time
    SyncMode: 0
    SyncSource: ""
Toolbars:
  toolButtonStyle: 2
Visualization Manager:
  Class: ""
  Displays:
    - Alpha: 0.5
      Cell Size: 1
      Class: rviz/Grid
      Color: 160; 160; 164
      Enabled: true
      Line Style:
        Line Width: 0.0299999993
        Value: Lines
      Name: Grid
      Normal Cell Count: 0
      Offset:
        X: 0
        Y: 0
        Z: 0
      Plane: XY
      Plane Cell Count: 10
      Reference Frame: <Fixed Frame>
      Value: true
    - Alpha: 1
      Class: rviz/RobotModel
      Collision Enabled: false
      Enabled: true
      Links:
        All Links Enabled: true
        Expand Joint Details: false
        Expand Link Details: false
        Expand Tree: false
        Link Tree Style: Links in Alphabetic Order
        back_left_wheel_link:
          Alpha: 1
          Show Axes: false
          Show Trail: false
          Value: true
        back_right_wheel_link:
          Alpha: 1
          Show Axes: false
          Show Trail: false
          Value: true
        base_link:
          Alpha: 1
          Show Axes: false
          Show Trail: false
          Value: true
        front_left_wheel_link:
          Alpha: 1
          Show Axes: false
          Show Trail: false
          Value: true
        front_right_wheel_link:
          Alpha: 1
          Show Axes: false
          Show Trail: false
          Value: true
      Name: RobotModel
      Robot Description: robot_description
      TF Prefix: ""
      Update Interval: 0
      Value: true
      Visual Enabled: true
    - Class: rviz/TF
      Enabled: true
      Frame Timeout: 15
      Frames:
        All Enabled: true
        back_left_wheel_link:
          Value: true
        back_right_wheel_link:
          Value: true
        base_link:
          Value: true
        front_left_wheel_link:
          Value: true
        front_right_wheel_link:
          Value: true
      Marker Scale: 0.200000003
      Name: TF
      Show Arrows: true
      Show Axes: true
      Show Names: true
      Tree:
        base_link:
          back_left_wheel_link:
            {}
          back_right_wheel_link:
            {}
          front_left_wheel_link:
            {}
          front_right_wheel_link:
            {}
      Update Interval: 0
      Value: true
  Enabled: true
  Global Options:
    Background Color: 48; 48; 48
    Default Light: true
    Fixed Frame: base_link
    Frame Rate: 30
  Name: root
  Tools:
    - Class: rviz/Interact
      Hide Inactive Objects: true
    - Class: rviz/MoveCamera
    - Class: rviz/Select
    - Class: rviz/FocusCamera
    - Class: rviz/Measure
    - Class: rviz/SetInitialPose
      Topic: /initialpose
    - Class: rviz/SetGoal
      Topic: /move_base_simple/goal
    - Class: rviz/PublishPoint
      Single click: true
      Topic: /clicked_point
  Value: true
  Views:
    Current:
      Class: rviz/Orbit
      Distance: 0.791995764
      Enable Stereo Rendering:
        Stereo Eye Separation: 0.0599999987
        Stereo Focal Distance: 1
        Swap Stereo Eyes: false
        Value: false
      Focal Point:
        X: -0.00707128178
        Y: 0.000214380445
        Z: 0.0199916083
      Focal Shape Fixed Size: true
      Focal Shape Size: 0.0500000007
      Invert Z Axis: false
      Name: Current View
      Near Clip Distance: 0.00999999978
      Pitch: -0.0296021849
      Target Frame: <Fixed Frame>
      Value: Orbit (rviz)
      Yaw: 5.86357117
    Saved: ~
Window Geometry:
  Displays:
    collapsed: false
  Height: 754
  Hide Left Dock: false
  Hide Right Dock: false
  QMainWindow State: 000000ff00000000fd00000004000000000000016a000002b2fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006100fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c0061007900730100000025000002b2000000d600fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f00000242fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a00560069006500770073000000002800000242000000ab00fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004a70000003efc0100000002fb0000000800540069006d00650000000000000004a7000002a400fffffffb0000000800540069006d0065010000000000000450000000000000000000000338000002b200000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
  Selection:
    collapsed: false
  Time:
    collapsed: false
  Tool Properties:
    collapsed: false
  Views:
    collapsed: false
  Width: 1191
  X: 297
  Y: 107
           

在建立好了模型之後,退出到工作空間進行編譯和重新整理環境變量;然後運作,并在rviz中檢視:

  roslaunch 包名 相應launch檔案

2、建構說明

  • 首先,一個模型需要一個根标簽:

  <?xml version=”1.0”?>

  <robot name=”mbot”>

  ......

  </robot>

  建立機器人的主體:一個方體(長 寬 高),設定顔色(rgb+透明度a),

<link name="base_link">
        <visual>
            <origin xyz=" 0 0 0.05" rpy="0 0 0" />
            <geometry>
                <box size="0.26 0.26 0.10" />
            </geometry>
            <material name="yellow">
                <color rgba="1 0.4 0 1" />
            </material>
        </visual>
    </link>
           
  • 在主體上建立輪子,一共四個,這裡隻是列出後面兩個,圓柱體旋轉90度(初始位置、旋轉弧度、大小、顔色)
<link name="back_left_wheel_link">
        <visual>
            <origin xyz=" 0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder length="0.02" radius="0.026" />
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <joint name="back_left_wheel_joint" type="continuous">
        <origin xyz="0.10 0.13 0" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="back_left_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>

    <link name="back_right_wheel_link">
        <visual>
            <origin xyz=" 0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder length="0.02" radius="0.026" />
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

    <joint name="back_right_wheel_joint" type="continuous">
        <origin xyz="-0.10 0.13 0" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="back_right_wheel_link"/>
        <axis xyz="0 1 0"/>
    </joint>
           

建立雷射雷達和攝像頭(分别用小圓柱和小方體代替)

<link name="rplidar_link">
        <visual>
            <origin xyz=" 0 0 0" rpy="0 0 0" />
            <geometry>
                <cylinder length="0.05" radius="0.03" />
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"/>
            </material>
        </visual>
    </link>

    <joint name="rplidar_joint" type="fixed">
        <origin xyz="0 0 0.125" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="rplidar_link"/>
    </joint>


    <link name="camera_link">
        <visual>
            <origin xyz=" 0 0 0" rpy="0 0 1.5707" />
            <geometry>
                <box size="0.02 0.02 0.02"/>
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"/>
            </material>
        </visual>
    </link>

    <joint name="camera_joint" type="fixed">
        <origin xyz="0.14 0 0.05" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="camera_link"/>
    </joint>
           

備注:剛體和關節都有自己的origin xyz;在兩者進行連接配接的時候,剛體的位置以關節的位置為主,此時,關節的origin xyz是相對parent link的,剛體的origin xyz是相對于關節來說的。另外,各個剛體的重心即坐标軸的中心。

不同形狀的圖形的表示方法以及導入現有的模型:

方形:box size=”長 寬 高”

圓柱:cylinder length=”高”  radius=”底面半徑”

球形:sphere radius=“球半徑”

借用已有的*.dae 以及相關的圖檔,将其放在meshes檔案中,然後在link的<geometry>

<mesh filename=”package://package_name/mesh/**.dae” />

</geometry>

如何将urdf模型轉換為xacro模型