URDF机器人建模

1.机器人的定义

各个国家对机器人的定义各不相同,但总体上,机器人是指能够自动或通过编程的方式协助人类处理一些任务的机械装置。

2.机器人的组成

机器人通常可以由四大部分组成:控制系统、驱动系统、执行机构和传感系统。每个部分功能相对独立,但又密切联系。

对于没有实物机器人的我们,该怎么学习机器人呢?

有人说可以通过仿真环境搭建机器人的模型,那么如何通过代码来搭建我们的机器人仿真模型呢?那就得请我们今天的主角-----URDF出场了!

3.URDF建模

URDF(Unified Robot Description Format)统一机器人模型描述格式,使用xml语言描述,该格式的目的在于提供一种通用的机器人模型描述规范。

从机构学角度讲,机器人通常被建模为由连杆和关节组成的结构。连杆是带有质量属性的刚体,而关节是连接、限制两个刚体相对运动的结构。。通过关节将连杆依次连接起来,就构成了一个个运动链(即机器人模型)。一个URDF文档即描述了这样的一系列关节与连杆的相对关系、惯性属性、几何特点和碰撞模型。具体来说,包括:

  1.  机器人模型的运动学与动力学描述;
    
  2.  机器人的几何表示;
    
  3.  机器人的碰撞模型。
    

在URDF中,我们通常使用link和joint信息来对机器人进行描述。

【link】

  1.  描述机器人某个刚体部分的外观和物理属性;
    
  2.  描述连杆尺寸(size)、颜色(color)、形状(shape)、惯性矩阵(inertial matrix)、碰撞参数(collision properties)等;
    
  3.  每个Link会成为一个单独的坐标系。
    

在这里插入图片描述
【joint】

  1.  描述两个link之间的关系,分为六种类型;
    
  2.  包括关节运动的位置和速度限制;
    
  3.  描述机器人关节的运动学和动力学属性。
    
关节类型描述
continuous旋转关节,可以围绕单轴无限旋转
revolute旋转关节,类似于continuous,但是有选择的角度极限
prismatic滑动关节,沿某一轴线移动的关节,带有位置极限
planar平面关节,允许在平面正交方向上平移或旋转
floating浮动关节,允许进行平移,旋转运动
fixed固定关节,不允许运动的特殊关节

在这里插入图片描述
【robot】

  1.  完整机器人模型的最顶层标签;
    
  2.  <link><joint>标签都必须包含在<robot>标签内;
    
  3.  一个完整的机器人模型,由一系列<link>和<joint>组成。
    

比如:

<robot  name=”name of the robot”>
     <link>……</link>

     <link>……</link>

 
     <joint>……</joint>

     <joint>……</joint>
</robot>
4.URDF机器人实战

下面,我们将亲自搭建一个简易的URDF机器人模型,来更加深入了解URDF。

在这之前,我们首先需要创建自己的ROS工作空间,创建src文件夹等步骤,然后创建mbot_description功能包。

$ catkin_create_pkg  mbot_description urdf  xacro
  1.  urdf: 存放机器人模型的URDF或xacro文件;
    
  2.  meshes:放置URDF中引用的模型渲染文件;
    
  3.  launch: 保存相关启动文件;
    
  4.  config: 保存rviz的配置文件。
    

上面这些文件夹,其中meshes文件夹这里不会用到,我们编写的mbot_base.urdf文件放在urdf文件夹下。下面我们来看具体的模型搭建步骤。

1.根据xml语言格式创建我们的根元素

一个urdf文件必要包含一个根元素,然后其他标签则放在根元素里面。

<?xml version="1.0"?>
<robot name="mbot">
...
...
</robot>

2.创建base_link底盘

首先,我们需要创建一个底盘base_link,算是搭建房子的“地基”。

<link name="base_link">
       <!--可视化部分-->
        <visual>
            <!--中心点 -->
            <origin xyz="0 0 0" rpy="0 0 0"></origin>
            <!--几何特征-->
            <geometry>
                <!--cylinder:圆柱,length:高;radius:半径-->
                <cylinder length="0.16" radius="0.20"></cylinder>
            </geometry>
            <!--材料/颜色-->
            <material name="yellow">
                <color rgba="1 0.4 0 1"></color>
            </material>
        </visual>
</link>

3.创建左轮以及左轮关节

接着,创建左轮,相当于机器人的左脚。

<!--左轮旋转关节-->
<joint name="left_wheel_joint" type="continuous">
        <!--中心点-->
        <origin xyz="0 0.19 -0.05" rpy="0 0 0"></origin>
        <!--子母连杆-->
        <parent link="base_link"></parent>
        <child link="left_wheel_link"></child>
        <!--绕y轴旋转-->
        <axis xyz="0 1 0"></axis>
</joint>
<!--左轮连杆-->
<link name="left_wheel_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0"></origin>
            <!--几何特征-->
            <geometry>
                <!--圆柱-->
                <cylinder radius="0.06" length="0.025"></cylinder>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"></color>
            </material>
        </visual>
</link>
  1. 创建右轮及右轮关节

创建右轮,相当于机器人的右脚。

<!--右轮连续关节-->
<joint name="right_wheel_joint" type="continuous">
        <origin xyz="0 -0.19 -0.05" rpy="0 0 0"></origin>
        <parent link="base_link"></parent>
        <child link="right_wheel_link"></child>
        <axis xyz="0 1 0"></axis>
</joint>
<link name="right_wheel_link">
        <visual>
            <origin xyz="0 0 0" rpy="1.5707 0 0"></origin>
            <geometry>
                <cylinder radius="0.06" length="0.025"></cylinder>
            </geometry>
            <material name="white">
                <color rgba="1 1 1 0.9"></color>
            </material>
        </visual>
</link>

5.创建前后万向轮

考虑到机器人运动的稳定性,我们在底盘的下面添加两个可以360度旋转的球形轮子,半径设置为0.015m。

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

6.创建摄像头

在底盘的上面靠前添加一个长方形的摄像头,用来充当机器人的眼睛。

<link name="camera_link">
        <visual>
            <origin xyz="0 0 0 " rpy="0 0 0"></origin>
            <geometry>
                <!--box:长方体,长宽高-->
                <box size="0.03 0.04 0.04"></box>
            </geometry>
            <material name="black">
                <color rgba="0 0 0 0.95"></color>
            </material>
        </visual>
</link>
<joint name="camera_joint" type="fixed">
        <origin xyz="0.17 0 0.1"></origin>
        <parent link="base_link"></parent>
        <child link="camera_link"></child>
</joint>

7.创建激光雷达

在底盘上添加一个激光雷达模块,可以让我们的机器人感知周围的环境。

<link name="laser_link">
        <visual>
            <origin xyz="0 0 0" rpy="0 0 0"></origin>
            <geometry>
                <!--圆柱-->
                <cylinder length="0.05" radius="0.05"></cylinder>
            </geometry>
            <material name="black">
            </material>
        </visual>
</link>
<!--固定关节-->
<joint name="laser_joint" type="fixed">
        <origin xyz="0 0 0.1" rpy="0 0 0"></origin>
        <parent link="base_link"></parent>
        <child link="laser_link"></child>
 </joint>

到此,我们的简易机器人就搭建好了。接下来还有一个工作要做,那就是编写我们的display_mbot_base_urdf.launch文件,用来启动相关的节点,调用我们的rviz(三维可视化工具)模块。

8.编写launch文件

<launch>
   <!--启动我们的urdf文件-->
   <param name="robot_description" textfile="$(find mbot_description)/urdf/mbot_base.urdf">       </param>

   <!--设置GUI参数,显示关节控制插件-->
   <param name="use_gui" value="true"></param>

   <!--运行joint_state_publisher节点,发布机器人的关节状态-->
   <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"></node>

   <!--运行robot_state_publisher节点,发布tf-->
   <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"></node>

   <!--运行rviz可视化界面-->
   <node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true"></node>

</launch>

这里需要注意,在学习古月老师的课程时,他给出的代码有点小错误,这里纠正一下:将type="state_publisher"改为如下形式即可,否则,robot_state_publisher节点启动不成功。

 <!--运行robot_state_publisher节点,发布tf-->
   <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"></node>

接下来,终于可以看我们的机器人模型啦!

在工作空间下进行编译:

$ catkin_make

然后执行:

$ roslaunch mbot_description display_mbot_base_urdf.launch

得到我们的机器人模型如下:
在这里插入图片描述

看起来还不错!

需要注意的是,这可不是URDF的全部!

这篇文章只是关于URDF的一个非常简单的例子,没有涉及到惯性矩阵,碰撞矩阵之类较复杂的设计,算是与URDF的初识吧。另外,URDF并不完美,在后面的学习中,我们还会继续优化URDF的相关编程。

参考文献

[1].https://class.guyuehome.com/index

[2].http://wiki.ros.org/ROS/Tutorials

[3].https://baike.baidu.com/item/urdf/23744717?fr=aladdin

  • 3
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
ROS(Robot Operating System)是一个开源的机器人操作系统,它提供了一系列的软件库和工具,可以帮助开发者轻松地构建机器人应用程序。在ROS中,可以使用各种传感器和执行器来感知和操纵机器人,同时还有众多功能强大的软件包可供使用。 对于ROS机器人小车的建模,首先需要定义其物理模型和运动模型。物理模型涉及到小车的尺寸、质量分布以及各个部件之间的连接关系等,可以使用三维建模软件(如SolidWorks、Blender等)进行建模。在模型中,可以添加传感器和执行器的模型,以便在软件层面对其进行控制和感知。 接下来,需要在ROS中创建一个软件包,该软件包将包含小车的相关源代码和配置文件。在软件包中,可以编写小车的控制算法、传感器数据处理和与外部环境的通信接口等。根据小车的物理模型和运动模型,可以在软件包中定义小车的运动规划和控制算法,使其能够实现自主导航、避障等功能。 在ROS的开发过程中,可以使用ROS提供的各种工具和软件包快速构建和测试小车的功能。例如,可以使用Gazebo仿真平台对小车进行虚拟环境下的仿真测试,通过仿真可以更快速地验证和优化算法;同时,可以使用Rviz可视化工具对小车的运动、传感器数据等进行可视化展示和调试。 总之,ROS提供了丰富的功能和工具,可用于对机器人小车进行建模和开发。通过合理的物理模型设计和运动算法编写,可以实现小车的各种功能,从而实现自主导航、运动规划、避障等应用。在开发过程中,可以利用ROS的丰富生态系统和强大的社区支持,使机器人小车建模更加高效和便捷。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rob月初

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值