URDF机器人建模

本文涉及的产品
资源编排,不限时长
简介: ROS学习不必须非要机器人硬件平台,需要了解如何创建机器人的模型 如何使用ROS中的URDF工具创建机器人的模型

ROS学习不必须非要机器人硬件平台,需要了解如何创建机器人的模型
如何使用ROS中的URDF工具创建机器人的模型

# 什么是URDF

  • Unified Robot Description Format,统一机器人描述格式
  • ROS中一个非常重要的机器人模型描述格式
  • 可以解析URDF文件中使用XML格式描述的机器人模型
  • ROS同时也提供URDF文件的C++解析器(可以在C++代码中直接解析URDF机器人模型,好处:在基于模型的计算算法中,可以在代码中调用模型的信息,方便计算)

URDF实例
在这里插入图片描述
可以看到使用的是xml格式
从上面可以大概看到如何创建一个机器人模型

创建机器人模型需要将机器人拆解开,分成很多个部分
拆开的部分大概可以分为两大类
一类是link(连杆,刚体),视觉上可以感知的,比如人的大臂、小臂可以称之为两个连杆,连杆直接需要通过一定的关节来连接也就是另一类
另一类是joint(关节)。

整个机器人可以是 n个link + n个 joint 组成

URDF机器人建模

link

  • 描述机器人某个刚体部分的外观和物理属性;
  • 尺寸(size)、颜色(color)、形状(shape)、惯性矩阵(inertial matrix)、碰撞属性(collision properties)等。

主要以下面xml的格式来描述
在这里插入图片描述
包括3个子标签

  • < visual >:描述机器人link部分的外观参数, 尺寸、颜色、形状等的外观信息
  • < inertial >:描述link的惯性参数,主要用到机器人动力学的运算部分
  • < collision >:描述link的碰撞属性,

如下图
展示了三个子标签的相关内容

首先绿色椭圆形是直观上去看到的是visual表达的

另外一个惯性参数 比如质心 是在蓝色的坐标下面,可以通过一些三维仿真软件、三维设计软件可以计算惯性矩阵参数

外侧红色的框是碰撞参数,一但该link和其它link或环境在红色框中发生交叉,代表和其它部分发生了碰撞。为了计算方便,会把碰撞属性做简化。
在这里插入图片描述
link还有一个比较关键的部分 就是坐标系

上图中 Link origin 是起始坐标,整个link创建的时候都是相对 Link origin坐标系创建的

joint

joint就是用来连接两个具体的link部分的

  • 描述机器人关节的运动学和动力学属性
  • 包括关节运动的位置和速度限制
  • 根据关节的运动形式,可以将其分为六种类型。
关节类型 描述
continuous 旋转关节,可以围绕单轴无限旋转
revolute 旋转关节,类似于continuous,但是有旋转的角度限制
prismatic 滑动关节,沿某一轴线移动的关节,带有位置极限
planar 平面关节,允许在平面正交方向上平移或者旋转
floating 浮动关节,允许进行平移、旋转运动
fixed 固定关节,不允许运动的特殊关节

下面图中,蓝色关节表示出一个运动的轴,蓝色关节是可以围绕该轴旋转的,也就是child这个link是可以围绕joint上下旋转。

joint是连接两个link,需要分一个主次关系,主关节是parent link,子关节是child link, 在xml形式的描述中 这个两个 link是必须存在的
在这里插入图片描述
joint 标签
在这里插入图片描述在这里插入图片描述

robot

整个一个机器人的完整模型可以用link和joint两种标签来描述

这两种标签需要包含到更大的标签中去 就是robot

  • 完整机器人模型的最顶层标签
  • < link > 和 < joint >标签必须包含在 < robot > 标签内

在这里插入图片描述
在这里插入图片描述

URDF 实践

创建机器人描述的功能包

创建一个机器人建模的功能包

进入工作空间中的src 功能包目录下

$ cd ./catkin_ws/src/

输入创建功能包命令

$ catkin_create_pkg mbot_description urdf xacro

机器人模型、描述文件在ROS里 通常的以 机器人名_description
并且需要urdf 依赖功能呢包 和 xacro(优化urdf用的)依赖

在功能包下创建几个不用作用的文件夹
在这里插入图片描述

  • urdf:存放机器人模型的URDF或xacro文件
  • meshes:放置URDF中引用的模型渲染文件,机器人外观纹理,让外观和实际更相似,通过三维设计软件导出,放置此文件夹下
  • launch:保存相关启动文件
  • config:保存rviz的配置文件、功能包的配置文件

编辑launch启动文件

主要是加载urdf 并在rviz中显示
下面launch文件是在rviz中显示机器人的一种固定形态
想显示机器人基本上修改第一行 urdf文件的路径和最后一行rviz配置文件的路径就行

<launch>
    <!-- param是要加载ros的一个参数:robot_description (描述机器人的具体模型) 参数的具体内容是.urdf文件 ,将路径下的.urdf文件内容让到robot_description  -->
    <param name="robot_description" textfile="$(find mbot_description)/urdf/mbot_base.urdf" />
 
    <!-- 设置GUI参数,显示关节控制插件 -->
    <param name="use_gui" value="true"/>
    
    <!-- 运行joint_state_publisher节点,发布机器人的关节状态 ,而且可以通过UI界面对joint进行控制 -->
    <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可视化界面 通过 args加载参数 .rviz文件 作用:默认打开rviz没有任何显示插件 通过保存配置文件的形式保存设置好的插件 保存在config下  配置文件是可以通过rviz保存得到的 -->
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" />
</launch>

创建urdf模型

创建小车底盘

在urdf文件夹下 创建mbot_base.urdf文件

注意在运行launch文件时,.urdf里的注释要去掉,否正会报错误

在这里插入图片描述
将移动机器人小车的底盘抽象为一个圆柱体

<?xml version="1.0" ?>
    <!-- 机器人名字:mbot -->
<robot name="mbot">
     <!-- 一般在ros中会把机器人主体声明为base_link -->
    <link name="base_link">
        <!-- 通过visual子标签 描述link可视化的效果-->
        <visual>
              <!-- 本link的坐标 xyz单位是米 rpy单位是弧度-->
            <origin xyz=" 0 0 0" rpy="0 0 0" />
            <!-- geometry 几何 -->
            <geometry>
                  <!-- cylinder 圆柱体 -->
                <cylinder length="0.16" radius="0.20"/>
            </geometry>
            <material name="yellow">
                <!-- rgba a代表透明度 1不透明 -->
                <color rgba="1 0.4 0 1"/>
            </material>
        </visual>
    </link>

</robot>

可以先看下这个link显示的效果
执行刚写的launch文件

$ roslaunch display_mbot_base_urdf.launch

在这里插入图片描述

创建左侧车轮

在base_link下继续加

    <!-- 左轮link -->
    <link name="left_wheel_link">
        <visual>
            <!-- 在x轴方向旋转90度 -->
            <origin xyz="0 0 0" rpy="1.5707 0 0" />
            <geometry>
                <cylinder radius="0.06" length = "0.025"/>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

在base_link与left_wheel_link 中间加入joint :left_wheel_joint
类型是 continuous无限旋转 详见joint介绍

      <!-- 左轮joint -->
    <joint name="left_wheel_joint" type="continuous">
         <!-- joint坐标偏移 (注意child link也就是left_wheel_link 没有偏移) -->
        <origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="left_wheel_link"/>
        <!--child link(沿x轴转了90度)在该joint下 在y轴方向旋转 -->
        <axis xyz="0 1 0"/>
    </joint>

左轮添加完成,可以看下效果
在这里插入图片描述
其中的下面这个插件
在这里插入图片描述
可以来做旋转测试
对应launch文件中的
在这里插入图片描述

创建右侧车轮

和左轮类似 有的参数镜像就行 : joint 处 y轴与左轮相反

    <!-- 右轮joint -->
    <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>
     
    <!-- 右轮link -->
    <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">
                <color rgba="1 1 1 0.9"/>
            </material>
        </visual>
    </link>

创建前后支撑轮

      <!-- 前支撑轮joint -->
    <joint name="front_caster_joint" type="continuous">
        <origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="front_caster_link"/>
        <axis xyz="0 1 0"/>
    </joint>
     <!-- 前支撑轮link -->
    <link name="front_caster_link">
        <visual>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <geometry>
                <sphere radius="0.015" />
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"/>
            </material>
        </visual>
    </link>
    <!-- 后支撑轮joint -->
    <joint name="back_caster_joint" type="continuous">
        <origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="back_caster_link"/>
        <axis xyz="0 1 0"/>
    </joint>
    <!-- 后支撑轮link -->
    <link name="back_caster_link">
        <visual>
            <origin xyz="0 0 0" rpy="0 0 0"/>
            <geometry>
                <sphere radius="0.015" />
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"/>
            </material>
        </visual>
    </link>

在这里插入图片描述
在这里插入图片描述

增加传感器

摄像头
以黑色正方块表示

    <!-- 摄像头link -->
    <link name="camera_link">
        <visual>
            <origin xyz=" 0 0 0 " rpy="0 0 0" />
            <geometry>
                <box size="0.03 0.04 0.04" />
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"/>
            </material>
        </visual>
    </link>
    <!-- 摄像头joint -->
    <joint name="camera_joint" type="fixed">
        <origin xyz="0.17 0 0.10" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="camera_link"/>
    </joint>

激光雷达

     <!-- 激光雷达link -->
    <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  -->
    <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>

kinect

    <link name="kinect_link">
        <visual>
            <origin xyz="0 0 0" rpy="0 0 1.5708"/>
            <geometry>
                 <!--   加入纹理文件方法    -->
                <mesh filename="package://mbot_description/meshes/kinect.dae" />
            </geometry>
        </visual>
    </link>

    <joint name="laser_joint" type="fixed">
        <origin xyz="0.15 0 0.11" rpy="0 0 0"/>
        <parent link="base_link"/>
        <child link="kinect_link"/>
    </joint>

这样一个可视化的机器人就创建完成了

检查URDF模型整体结构

在urdf文件夹下执行 urdf_to_graphiz+要检查的urdf文件

$ urdf_to_graphiz mbot_with_kinect.urdf 

会在当前路径下创建一个pdf文件
在这里插入图片描述
可以看到机器人所以的link和joint的关系分析出来

URDF建模存在的问题

  • 模型冗长,重复内容过多
  • 参数修改麻烦,不便于二次开发
  • 没有参数计算功能

参考资料

wiki.ros.org/urdf/Tutorials

如何优化urdf模型,放在下次博客

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
相关文章
|
9天前
|
XML 算法 自动驾驶
ROS进阶:使用URDF和Xacro构建差速轮式机器人模型
【11月更文挑战第7天】本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。
|
6月前
|
机器学习/深度学习 机器人
LabVIEW对并行机器人结构进行建模仿真
LabVIEW对并行机器人结构进行建模仿真
46 0
|
机器学习/深度学习 传感器 XML
ubuntu16.04下ROS操作系统学习笔记(四 )机器人系组成、URDF机器人建模、xacro模型优化
ubuntu16.04下ROS操作系统学习笔记(四 )机器人系组成、URDF机器人建模、xacro模型优化
239 0
|
机器人
水下机器人双机械手系统动态建模与控制仿真(Matlab代码实现)
水下机器人双机械手系统动态建模与控制仿真(Matlab代码实现)
198 0
|
XML 传感器 算法
ROS中阶笔记(二):机器人系统设计—URDF机器人建模
ROS中阶笔记(二):机器人系统设计—URDF机器人建模
739 0
ROS中阶笔记(二):机器人系统设计—URDF机器人建模
|
机器学习/深度学习 机器人 vr&ar
平面2R机器人(二连杆)运动学与动力学建模+附仿真模型
平面2R机器人(二连杆)运动学与动力学建模+附仿真模型
1457 0
平面2R机器人(二连杆)运动学与动力学建模+附仿真模型
|
机器人
仿人机器人(五连杆、七连杆)拉格朗日动力学建模
仿人机器人(五连杆、七连杆)拉格朗日动力学建模
477 0
仿人机器人(五连杆、七连杆)拉格朗日动力学建模
|
机器人
ROS_机器人urdf建模仿真实践
实践内容: 1、运用 urdf建模 实现案例中的机器人。 2、根据以上掌握的方法,再快速创建一个机器人模型。 成果图: 成果图 创建需要用到的功能包以及各种文件夹: Build跟devel两个文件夹在...
1747 0
|
机器人
《机器人自动化:建模、仿真与控制》——2.4 习题
本节书摘来自华章计算机《机器人自动化:建模、仿真与控制》一书中的第2章,第2.4节,作者[法]吕克·若兰(Luc Jaulin),译 黄心汉 彭刚,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1307 0

热门文章

最新文章