一.什么是URDF机器人建模
- Unified Robot Description Format:统一机器人描述格式
- 使用XML格式描述机器人模型
- 由n个link连杆和n个joint关节描述
二. Link和Joint详解
link内容
- 描述机器人某个刚体部分的外观和物理属性
- 包含尺寸、颜色、外观、形状、惯性矩阵、碰撞参数等
- 由三个子标签去描述
<visual>
:描述外观参数<inertial>
:描述惯性参数<collision>
:描述碰撞参数
- 主要形式
<link name="<link name>">
<visual>......</visual>
<inertial>......</inertial>
<collision>......</collision>
</link>
joint内容
- 描述机器人运动关节的运动学和动力学属性
- 关节运动的位置和速度限制
- 六种关节类型
关节类型 | 描述 |
---|---|
continuous | 旋转环节,围绕单轴无限旋转 |
revolute | 旋转关节,围绕单轴有角度极限旋转 |
prismatic | 滑动关节,沿某一轴线有位置限制的移动 |
planar | 平面关节,可以在平面正交方向进行平移或者旋转 |
floating | 浮动关节,可以平移旋转 |
fixed | 固定关节,不允许运动的特殊关节 |
- 由五个子标签去描述
<calibration>
:关节的参考位置,是用来矫正关节的绝对位置的<dynamics>
:关节的物理属性,如阻尼值,物理摩擦力,在动力学仿真中用到<limit>
:描述运动的极限值,包括关节的上下限位置,速度限制,力矩限制<mimic>
描述该关节与已有关节的信息<safey_controller>
:描述安全控制参数
- 主要形式
<joint name="<joint name>" type="<joint type>">
<parent link="<parent_link>">
<child link="<child_link>">
<calibration....../>
<dynamics damping....../>
<linit effort......>
</joint>
三. 创建一个简单的车架Link模型
- 创建功能包
在catkin_ws /src下右键打开终端:
catkin_create_pkg mbot_description urdf xacro
- 创建相关文件夹
进入mbot_description创建四个文件夹:
cd mbot_description
mkdir urdf
mkdir meshes
mkdir launch
mkdir config
文件夹 | 描述 |
---|---|
urdf | 存放机器人的URDF或者XACRO文件 |
meshes | 放置URDF引用的模型渲染文件 |
launch | 保存启动文件 |
config | 保存rviz的配置文件 |
- 创建一个urdf文件
进入urdf文件夹:
cd urdf
创建模型文件:
touch mbot.urdf
添加代码:
<?xml version="1.0" ?>
<robot name="mbot">
<!-- color -->
<material name="Blank">
<color rgba="0 0 0 1"/>
</material>
<material name="White">
<color rgba="1 1 1 0.95"/>
</material>
<material name="Blue">
<color rgba="0 0 1 1"/>
</material>
<material name="Yellow">
<color rgba="1 0.4 0 1"/>
</material>
<!-- base_car -->
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
<material name="Yellow"/>
</visual>
</link>
</robot>
- 创建一个launch文件
进入launch文件夹:
cd launch
创建模型文件:
touch mbot_launch.launch
添加代码:
<launch>
<!-- 设置机器人模型路径参数 -->
<param name="robot_description" textfile="$(find mbot_description)/urdf/mbot.urdf" />
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
<!-- 运行robot_state_publisher节点,发布tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
<!-- 运行rviz可视化界面 -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" />
</launch>
- 进行编译
回到catkin_ws根目录的终端进行编译:
catkin_make
运行启动文件:
roslaunch mbot_desription mbot_launch.launch
然后就会出现rviz的界面,如果bash出现红色错误,返回去看看urdf文件和launch文件有没有语句错误
- 使用rviz软件
点击Add
选择RobotModel,双击
会有错误信息,是因为坐标问题
把坐标系由map改成定义的base_link即可
然后可以点击file里边的保存,保存到config文件夹中即可(mobot_description下的config)
四 . 创建一个简单的车轮模型
在urdf文件中添加:
<?xml version="1.0" ?>
<robot name="mbot">
<!-- / COLOR / -->
<material name="Black">
<color rgba="0 0 0 1"/>
</material>
<material name="White">
<color rgba="1 1 1 0.95"/>
</material>
<material name="Blue">
<color rgba="0 0 1 1"/>
</material>
<material name="Yellow">
<color rgba="1 0.4 0 1"/>
</material>
<!-- / BASE / -->
<link name="base_link">
<visual>
<origin xyz=" 0 0 0" rpy="0 0 0" />
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
<material name="Yellow"/>
</visual>
</link>
<!-- / WHEEL / -->
<link name="left_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
<material name="White"/>
</visual>
</link>
<joint name="left_wheel_joint" type="continuous">
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="right_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
<material name="White"/>
</visual>
</link>
<joint name="right_wheel_joint" type="continuous">
<origin xyz="0 -0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="right_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<!-- / CASTER / -->
<link name="front_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
<material name="Black"/>
</visual>
</link>
<joint name="front_caster_joint" type="fixed">
<origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="front_caster_link"/>
</joint>
<link name="back_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
<material name="Black"/>
</visual>
</link>
<joint name="back_caster_joint" type="fixed">
<origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="back_caster_link"/>
</joint>
</robot>
五 . 创建一个简激光雷达模型
- 创建一个urdf文件
进入urdf文件夹:
cd urdf
创建模型文件:
touch mbot_rplidar.urdf
添加代码:
<?xml version="1.0" ?>
<robot name="mbot">
<!-- / COLOR / -->
<material name="Black">
<color rgba="0 0 0 1"/>
</material>
<material name="White">
<color rgba="1 1 1 0.95"/>
</material>
<material name="Blue">
<color rgba="0 0 1 1"/>
</material>
<material name="Yellow">
<color rgba="1 0.4 0 1"/>
</material>
<!-- / BASE / -->
<link name="base_link">
<visual>
<origin xyz=" 0 0 0" rpy="0 0 0" />
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
<material name="Yellow"/>
</visual>
</link>
<!-- / WHEEL / -->
<link name="left_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
<material name="White"/>
</visual>
</link>
<joint name="left_wheel_joint" type="continuous">
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="right_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
<material name="White"/>
</visual>
</link>
<joint name="right_wheel_joint" type="continuous">
<origin xyz="0 -0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="right_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<!-- / CASTER / -->
<link name="front_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
<material name="Black"/>
</visual>
</link>
<joint name="front_caster_joint" type="fixed">
<origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="front_caster_link"/>
</joint>
<link name="back_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
<material name="Black"/>
</visual>
</link>
<joint name="back_caster_joint" type="fixed">
<origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="back_caster_link"/>
</joint>
<!-- / LASER / -->
<link name="laser_link">
<visual>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<material name="Black"/>
</visual>
</link>
<joint name="laser_joint" type="fixed">
<origin xyz="0 0 0.105" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="laser_link"/>
</joint>
</robot>
- 创建一个launch文件
进入launch文件夹:
cd launch
创建模型文件:
touch mbot_rplidar_launch.launch
添加代码:
<launch>
<!-- 设置机器人模型路径参数 -->
<param name="robot_description" textfile="$(find mbot_description)/urdf/mbot_rplidar.urdf" />
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" />
<!-- 运行robot_state_publisher节点,发布tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
<!-- 运行rviz可视化界面 -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" />
</launch>