ROS:机器人描述(URDF、XACRO)
Urdf语法详解
Urdf教程:https://wiki.ros.org/urdf/Tutorials/Create%20your%20own%20urdf%20file
1.创建一个树型结构
Urdf中采用link和joint构成树状的结构来描述机器人。
首先需要定义一个base_link,在坐标系的原点。
2.添加位置
Urdf中通过orgin标签来定义link所在的位置。
<?xml version="<?xml version="1.0"?>
<robot name="test_robot">
<link name="base_link" />
<link name="link2" />
<link name="link3" />
<link name="link4" />
<joint name="joint1" type="continuous">
<parent link="base_link"/>
<child link="link2"/>
<origin xyz="0.3 0 0" rpy="1 0 0" />
</joint>
<joint name="joint2" type="continuous">
<parent link="base_link"/>
<child link="link3"/>
<origin xyz="0 0.3 0" rpy="0 1 0" />
</joint>
<joint name="joint3" type="continuous">
<parent link="base_link"/>
<child link="link4"/>
<origin xyz="0 0 0.3" rpy="0 0 1" />
</joint>
</robot>
origin:xyz以parent link为原点,child link的三维坐标系位置。
origin:rpy child link绕z轴旋转的滚动角(roll),绕y轴方向旋转的俯仰(pitch)角,和绕x轴旋转的偏转(yaw)角.
图中以base_link为基准,红色为x轴,绿色为y轴,蓝色为z轴。
3.添加link外观
Deometry定义link形状
Material 定义link材料
Origin 定义link相对于自己原来的位置的变化
<link name="base_link">
<visual>
<geometry>
<box size="0.25 .16 .05"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0"/>
<material name="blue">
<color rgba="0 0 .8 1"/>
</material>
</visual>
</link>
4.添加限制
Collision标签(碰撞)
Collision的内容与visiual中内容一样。
Axis joint定义旋转轴,例如(0 0 1)为以z轴旋转,(1 1 1)为以向量1 1 1为轴旋转,不指定以x轴旋转。
Limit 标签,限制joint的旋转范围。
<limit lower="-3.14" upper="3.14" effort="150.0" velocity="3.15"/>, 从标签中可以看到, 上下限以及速度, 力矩等都是可以指定的.
建立一个smartcar模型
1.新建一个smartcar包
catkin_create_pkg smartcar std_msgs rospy roscpp urdf
2.包文件夹下新建urdf文件夹,且在urdf文件夹下新建smartcar.urdf文件
依据上面的语法创建的内容为
<?xml version="1.0"?>
<robot name="test_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.25 .16 .05"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0"/>
<material name="blue">
<color rgba="0 0 .8 1"/>
</material>
</visual>
</link>
<link name="wheel_1">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="red">
<color rgba="1 0 0 1"/>
</material>
</visual>
</link>
<joint name="joint1" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="wheel_1"/>
<origin rpy="1.5707 0 0" xyz="0.08 0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="wheel_2">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="joint2" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="wheel_2"/>
<origin rpy="1.57075 0 0" xyz="0.08 -0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="wheel_3">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="red">
<color rgba="1 0 0 1"/>
</material>
</visual>
</link>
<joint name="joint_3" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="wheel_3"/>
<origin rpy="1.57075 0 0" xyz="-0.08 0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="wheel_4">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="joint_4" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="wheel_4"/>
<origin rpy="1.57075 0 0" xyz="-0.08 -0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
</robot>
检查urdf文件语法:
check_urdf smartcar.urdf
可视化模型:
roslaunch urdf_tutorial display.launch model:=path/to/your/xxx.urdf gui:=true
3.新建launch文件夹,且在launch文件夹下新建smartcar_rviz.launch文件
仿照上面的display.launch文件,编辑smartcar_rviz.launch文件
smartcar_rviz.launch
<launch>
<arg name="model" />
<arg name="gui" default="False" />
<arg name="rvizconfig" default="$(find urdf_tutorial)/rviz/urdf.rviz" />
<param name="robot_description" command="$(find xacro)/xacro.py $(find smartcar_description)/urdf/smartcar.urdf" />
<param name="use_gui" value="$(arg gui)"/>
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" ></node>
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rvizconfig)" required="true" />
</launch>
出来的效果与上一步中可视化的效果相同。