ROS-URDF仿真
前言:URDF (標準化機器人描述格式),是一種用于描述機器人及其部分結構、關節、自由度等的XML格式文件。
一、首先做一個帶有四個輪子的機器人底座。
1.1 新建urdf文件
在chapter4_tutorials/robot1_description/urdf文件夾下新建robot1.urdf文件,內容如下:
<?xml version="1.0"?> <robot name="robot1"> <link name="base_link"><visual><geometry><box size="0.2 .3 .1"/></geometry><origin rpy="0 0 0" xyz="0 0 0.05"/><material name="white"><color rgba="1 1 1 1"/></material></visual><collision><geometry><box size="0.2 .3 0.1"/></geometry></collision><inertial><mass value="100"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial> </link><link name="wheel_1"><visual><geometry><cylinder length="0.05" radius="0.05"/></geometry><origin rpy="0 1.5 0" xyz="0.1 0.1 0"/><material name="black"><color rgba="0 0 0 1"/></material></visual><collision><geometry><cylinder length="0.05" radius="0.05"/></geometry></collision><inertial><mass value="10"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><link name="wheel_2"><visual><geometry><cylinder length="0.05" radius="0.05"/></geometry><origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/><material name="black"/></visual><collision><geometry><cylinder length="0.05" radius="0.05"/></geometry></collision><inertial><mass value="10"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><link name="wheel_3"><visual><geometry><cylinder length="0.05" radius="0.05"/></geometry><origin rpy="0 1.5 0" xyz="0.1 -0.1 0"/><material name="black"/></visual><collision><geometry><cylinder length="0.05" radius="0.05"/></geometry></collision><inertial><mass value="10"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><link name="wheel_4"><visual><geometry><cylinder length="0.05" radius="0.05"/></geometry><origin rpy="0 1.5 0" xyz="-0.1 -0.1 0"/><material name="black"/></visual><collision><geometry><cylinder length="0.05" radius="0.05"/></geometry></collision><inertial><mass value="10"/><inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/></inertial></link><joint name="base_to_wheel1" type="fixed"><parent link="base_link"/><child link="wheel_1"/><origin xyz="0 0 0"/></joint><joint name="base_to_wheel2" type="fixed"><parent link="base_link"/><child link="wheel_2"/><origin xyz="0 0 0"/></joint><joint name="base_to_wheel3" type="fixed"><parent link="base_link"/><child link="wheel_3"/><origin xyz="0 0 0"/></joint><joint name="base_to_wheel4" type="fixed"><parent link="base_link"/><child link="wheel_4"/><origin xyz="0 0 0"/></joint> </robot>解析:urdf文件主要有link和joint組成。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
<robot name="robot1">? ?機器人標簽,機器人名字為robot1? ? ? ? ? ? ? ? ? ? ?
<link name="base_link">? 連桿標簽,連桿名字為base_link
<visual>? 可視化屬性
<geometry>? 形狀
<box size="0.2 .3 .1"/>? ?方形,尺寸為0.2m*0.3m*1m
<origin rpy="0 0 0" xyz="0 0 0.05"/>? 起點位置無位移,繞z軸旋轉。
<material name="white">? 材料名稱為白色
<color rgba="1 1 1 1"/>? 顏色屬性為1 1 1 1?
<collision>??
<inertial>
<mass value="100"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
<joint name="base_to_wheel1" type="fixed">? joint標簽,關節名稱為base_to_wheel1,類型為固定。continuous為繞某一軸旋轉
<parent link="base_link"/>? 父連桿是base_link
<child link="wheel_1"/>子連桿是wheel_1
<origin xyz="0 0 0"/>? ?起點位置無偏移。注:這里的起點是相對與父連桿的位置,并不是絕對坐標。
?為了檢查書寫的語法是否正確和配置是否有誤,可以使用語法檢查工具:
check_urdf robot1.urdf?-------------------------------------------
顯示如下:
robot name is: Robot1
---------- Successfully Parsed XML ---------------
root Link: base_link has 4 child(ren)
child(1): wheel1
child(2): wheel2
child(3): wheel3
child(4): wheel4
查詢工具(可選)
使用urdf_to_graphiz命令工具:
urdf_to_graphiz robot1.urdf生成兩個文件:robot1.pdf和robot1.gv
直接查看robot1.pdf或者使用命令:
evince Robot1.pdf?-------------------------------------------
顯示如下:
1.2 在rviz里查看3D模型
新建launch文件
在robot_description/launch文件夾下新建display.launch文件,代碼如下:
<?xml version="1.0"?> <launch><arg name="model" /><arg name="gui" default="False" /><param name="robot_description" textfile="$(arg model)" /><param name="use_gui" value="$(arg gui)"/><node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" /><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" /><node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.rviz" /> </launch>運行launch文件?
roslaunch chapter4_tutorials display.launch model:=/home/cdq/dev/catkin_ws/src/chapter4_tutorials/robot1_description/robot1.urdf注意:不要把冒號和等號寫反了,文件位置信息可以把文件直接拖進終端就會顯示出來。
--------------------------------------------
顯示如下:
默認狀態下畫面中什么都沒有,此時需要做出調整。
在左下角的add按鈕中添加RobotModel,然后將Fixed Frame選為base_link
?
?
?二、添加基座臂、連接臂和夾持臂
2.1 補充urdf文件
在</robot>前增添以下代碼:
<link name="arm_base"> <visual> <geometry> <box size="0.1 .1 .1"/> </geometry> <origin rpy="0 0 0" xyz="0 0 0.1"/> <material name="white"> <color rgba="1 1 1 1"/> </material> </visual> <collision> <geometry> <box size="0.1 .1 .1"/> </geometry> </collision> <inertial> <mass value="1"/> <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/> </inertial> </link> <joint name="base_to_arm_base" type="continuous"> <parent link="base_link"/> <child link="arm_base"/> <axis xyz="0 0 1"/> <origin xyz="0 0 0"/> </joint> <link name="arm_1"> <visual> <geometry> <box size="0.05 .05 0.5"/> </geometry> <origin rpy="0 0 0" xyz="0 0 0.25"/> <material name="white"> <color rgba="1 1 1 1"/> </material> </visual> <collision> <geometry> <box size="0.05 .05 0.5"/> </geometry> </collision> <inertial> <mass value="1"/> <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/> </inertial> </link> <joint name="arm_1_to_arm_base" type="revolute"> <parent link="arm_base"/> <child link="arm_1"/> <axis xyz="1 0 0"/> <origin xyz="0 0 0.15"/> <limit effort ="1000.0" lower="-1.0" upper="1.0" velocity="0.5"/> </joint> <link name="arm_2"> <visual> <geometry> <box size="0.05 0.05 0.5"/> </geometry> <origin rpy="0 0 0" xyz="0.06 0 0.15"/> <material name="white"> <color rgba="1 1 1 1"/> </material> </visual> <collision> <geometry> <box size="0.05 .05 0.5"/> </geometry> </collision> <inertial> <mass value="1"/> <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/> </inertial> </link> <joint name="arm_2_to_arm_1" type="revolute"> <parent link="arm_1"/> <child link="arm_2"/> <axis xyz="1 0 0"/> <origin xyz="0.0 0 0.45"/> <limit effort ="1000.0" lower="-2.5" upper="2.5" velocity="0.5"/> </joint> <joint name="left_gripper_joint" type="revolute"> <axis xyz="0 0 1"/> <limit effort="1000.0" lower="0.0" upper="0.548" velocity="0.5"/> <origin rpy="0 -1.57 0" xyz="0.06 0 0.4"/> <parent link="arm_2"/> <child link="left_gripper"/> </joint> <link name="left_gripper"> <visual> <origin rpy="0 0 0" xyz="0 0 0"/> <geometry> <mesh filename="package://pr2_description/meshes/gripper_v0/l_finger.dae"/> </geometry> </visual> <collision> <geometry> <box size="0.1 .1 .1"/> </geometry> </collision> <inertial> <mass value="1"/> <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/> </inertial> </link> <joint name="left_tip_joint" type="fixed"> <parent link="left_gripper"/> <child link="left_tip"/> </joint> <link name="left_tip"> <visual> <origin rpy="0.0 0 0" xyz="0.09137 0.00495 0"/> <geometry> <mesh filename="package://pr2_description/meshes/gripper_v0/l_finger_tip.dae"/> </geometry> </visual> <collision> <geometry> <box size="0.1 .1 .1"/> </geometry> </collision> <inertial> <mass value="1"/> <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/> </inertial> </link> <joint name="right_gripper_joint" type="revolute"> <axis xyz="0 0 -1"/> <limit effort="1000.0" lower="0.0" upper="0.548" velocity="0.5"/> <origin rpy="0 -1.57 0" xyz="0.06 0 0.4"/> <parent link="arm_2"/> <child link="right_gripper"/> </joint> <link name="right_gripper"> <visual> <origin rpy="-3.1415 0 0" xyz="0 0 0"/> <geometry> <mesh filename="package://pr2_description/meshes/gripper_v0/l_finger.dae"/> </geometry> </visual> <collision> <geometry> <box size="0.1 .1 .1"/> </geometry> </collision> <inertial> <mass value="1"/> <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/> </inertial> </link> <joint name="right_tip_joint" type="fixed"> <parent link="right_gripper"/> <child link="right_tip"/> </joint> <link name="right_tip"> <visual> <origin rpy="-3.1415 0 0" xyz="0.09137 0.00495 0"/> <geometry> <mesh filename="package://pr2_description/meshes/gripper_v0/l_finger_tip.dae"/> </geometry> </visual> <collision> <geometry> <box size="0.1 .1 .1"/> </geometry> </collision> <inertial> <mass value="1"/> <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/> </inertial> </link>2.2 顯示3D圖形
roslaunch chapter4_tutorials display.launch model:=/home/cdq/dev/catkin_ws/src/chapter4_tutorials/robot1_description/urdf/robot1.urdf-----------------------------------------
如果終端顯示錯誤:
[rospack] Error: package 'pr2_description' not found........
?則需要安裝pr2模型文件
sudo apt-get install ros-kinetic-pr2-common-----------------------------------------
如果顯示如下警告,請忽視,程序正常運行:
libGL error: failed to create drawable
TIFFFieldWithTag: Internal error, unknown tag 0x829a.
TIFFFieldWithTag: Internal error, unknown tag 0x829d.
TIFFFieldWithTag: Internal error, unknown tag 0x8822.
......
2.3 使機器人運動?
配合joint_state_publisher,調用gui功能:
roslaunch chapter4_tutorials display.launch model:=/home/cdq/dev/catkin_ws/src/chapter4_tutorials/robot1_description/urdf/robot1.urdf gui:=ture--------------------------------------------------
顯示如下:
urdf文件中每一個axis對應一個調節器,joint_state_publisher應該是ros中自帶的調節joint的功能,所以直接調用就可以。
如在arm_1_to_arm_base上所使用的限制通過<limit effort="1000.0"lower="-1.0"upper="1.0"velocity="0.5"/>這一行設置,可以用axis xyz="100"選擇轉動軸來運動。
<limit>標簽用于選擇以下屬性:
effort(關節所承受的最大力),lower(賦值給關節的下限,旋轉關節的單位是弧度,移動關節的單位是米),upper(賦值給關節的上限),velocity(強制關節的最大速度)。
?-END-?
轉載于:https://www.cnblogs.com/chendeqiang/p/10205874.html
總結
以上是生活随笔為你收集整理的ROS-URDF仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 何以解养老之忧
- 下一篇: php CI 实战教程:如何去掉inde