ros建模与仿真(urdf介绍)
机器人描述格式:.urdf(使用XML格式描述模型)
1 <?xml version="1.0" ?> 2 <!-- 最外层标签为robot --> 3 <robot name="mrobot_chassis"> 4 <!-- link标签描述机器人某个刚体的外观和物理属性 --> 5 <link name="base_link"> 6 <!-- visual描述这个link的外观参数 --> 7 <visual> 8 <!-- origin表示位置标签:xyz为空间位置,包含x,y,z值;rpy是方位角,包含roll、pitch、yaw值 --> 9 <origin xyz=" 0 0 0" rpy="0 0 0" /> 10 <geometry> 11 <cylinder length="0.005" radius="0.13"/> 12 </geometry> 13 <!-- material标签可以描述这个刚体的颜色 --> 14 <material name="yellow"> 15 <color rgba="1 0.4 0 1"/> 16 </material> 17 </visual> 18 <!-- inertial为惯性参数 --> 19 <inertial> 20 <mass value="2" /> 21 <origin xyz="0 0 0.0" /> 22 <inertia ixx="0.01" ixy="0.0" ixz="0.0" 23 iyy="0.01" iyz="0.0" izz="0.5" /> 24 </inertial> 25 26 <!-- collision描述碰撞属性,就是用一个几何体用来代替link,这个几何体比visual中描述的要简约以利于简化碰撞计算 --> 27 <collision> 28 <origin xyz="0 0 0" rpy="0 0 0" /> 29 <geometry> 30 <cylinder length="0.005" radius="0.13" /> 31 </geometry> 32 </collision> 33 </link> 34 35 <!-- joint为连接两个link的关节 --> 36 <joint name="base_left_motor_joint" type="fixed"> 37 <origin xyz="-0.055 0.075 0" rpy="0 0 0" /> 38 <parent link="base_link"/> 39 <child link="left_motor" /> 40 </joint> 41 42 <link name="left_motor"> 43 <visual> 44 <origin xyz="0 0 0" rpy="1.5707 0 0" /> 45 <geometry> 46 <cylinder radius="0.02" length = "0.08"/> 47 </geometry> 48 <material name="gray"> 49 <color rgba="0.75 0.75 0.75 1"/> 50 </material> 51 </visual> 52 </link> 53 54 </robot>
各标签下的子标签及释义(以下内容转自:https://blog.csdn.net/weixin_30640769/article/details/96914796)
urdf提供一些工具来帮助我们检查、梳理模型文件,需要在终端中安装该工具:sudo apt install libburdfdom-tools
然后可以使用check_urdf命令对模型文件xxx.urdf进行检查:
check_urdf xxx.urdf
可以使用以下命令查看模型整体结构(生成一个pdf)
urdf_to_graphiz xxx.urdf
在rviz中显示模型:
在launch文件中定义在rviz中显示模型
各功能包放在工作空间的src目录下,
然后在src目录下执行创建新功能包命令:
catkin_create_pkg <pkg_name> [depend1] [depend2] [depend3]
<pkg_name>即功能包名称(一般也是src中功能包文件夹的名称),后面的depend是这个功能包的依赖
然后回到工作空间目录执行:
catkin_make
然后使环境变量生效:
source devel/setup.bash
我们将功能包文件夹放到工作空间src目录并执行创建功能包命令、使环境变量生效后,可在任何路径下执行以下命令来启动功能包中的launch文件:
roslaunch <pkg_name> xxx.launch
urdf因为不支持代码复用,所以写起来可能会有很多重复的内容。xacro是另一种精简化、可复用、 模块化的描述格式,他的语法支持一些可编程接口,如常量、变量、数学公式、宏定义、条件语句等。
例如宏定义:
1 <xacro:property name="M_PI" value="3.14159"/>
例如调用数学公式:
<origin xyz="0 ${(motor_length+wheel_length)/2} 0" rpy="0 0 0"/>
同样的模型,我们可以定义xacro:
<xacro:macro name="mrobot_standoff_2in" params="parent number x_loc y_loc z_loc"> <!-- params表示入参有5各个:parent, number, x_loc, y_lov, z_loc --> <joint name="standoff_2in_${number}_joint" type="fixed"> <origin xyz="${x_loc} ${y_loc} ${z_loc}" rpy="0 0 0" /> <parent link="${parent}"/> <child link="standoff_2in_${number}_link" /> </joint> <link name="standoff_2in_${number}_link"> <inertial> <mass value="0.001" /> <origin xyz="0 0 0" /> <inertia ixx="0.0001" ixy="0.0" ixz="0.0" iyy="0.0001" iyz="0.0" izz="0.0001" /> </inertial> <visual> <origin xyz=" 0 0 0 " rpy="0 0 0" /> <geometry> <box size="0.01 0.01 0.07" /> </geometry> <material name="black"> <color rgba="0.16 0.17 0.15 0.9"/> </material> </visual> <collision> <origin xyz="0.0 0.0 0.0" rpy="0 0 0" /> <geometry> <box size="0.01 0.01 0.07" /> </geometry> </collision> </link> </xacro:macro>
可以这样调用来创造出4个对象:
<mrobot_standoff_2in parent="base_link" number="1" x_loc="-${standoff_x/2 + 0.03}" y_loc="-${standoff_y - 0.03}" z_loc="${plate_height/2}"/> <mrobot_standoff_2in parent="base_link" number="2" x_loc="-${standoff_x/2 + 0.03}" y_loc="${standoff_y - 0.03}" z_loc="${plate_height/2}"/> <mrobot_standoff_2in parent="base_link" number="3" x_loc="${standoff_x/2}" y_loc="-${standoff_y}" z_loc="${plate_height/2}"/> <mrobot_standoff_2in parent="base_link" number="4" x_loc="${standoff_x/2}" y_loc="${standoff_y}" z_loc="${plate_height/2}"/>
如果要在一个xacro文件中引用另一个xacro文件,可使用形如下面的语句:
<xacro:include filename="$(find mrobot_description)/urdf/mrobot_body.urdf.xacro" />
将xacro文件转换成urdf文件:
我们可以先写xacro,再用xacro生成urdf:
rosrun xacro xacro.py xxx.xacro > xxx.urdf
以上命令将xxx.xacro转化为xxx.urdf,然后就可以用上面介绍的方法将urdf模型显示在rviz中
当然也可以在launch文件中进行配置,,直接运行launch文件就可以将xacro定义的模型显示在rviz中
check_urdf