一、URDF簡介
URDF(Unified Robot Description Format,統一的機器人描述格式),是ROS中非常重要的機器人模型描述格式;可以解析URDF檔案中使用XML格式描述的機器人模型;ROS同時也提供URDF檔案的C++解析器。
二、建構URDF模型的XML語言說明:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL6VlaORTVU10dRpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL5IzMxQDM0ATMzEzNwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
為了計算上的友善,經常會将模型簡化,比如例子中的橢圓的碰撞計算的時候,采用方形來簡化計算。Link origin:原始的坐标系,是模型參考系。
Joint:連接配接兩個link,并且有主次,parent/child link(父、子關節)
以上的link joint都是機器人模組化一部分,是以需要将其包括在一個大的标簽中:
這裡就是 robot
三、建構自己小車模型
先上效果圖:
各個元件的坐标系之間的關系圖:
代碼如下:
<?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模型