zoukankan      html  css  js  c++  java
  • 初次接触URDF

    使用URDF创建机器人3D仿真模型

    在真实的机器人上编程可以更好地让我们理解机器人的控制方式,因为真实的机器人会有反馈.如果没有真实的机器人,那么ROS仿真是一个很好的选择.

    ROS通过URDF(Unified Robot Description Format)描述机器人硬件尺寸布局.

    1.创建一个Ros包

    catkin_create_pkg smart_car std_msgs rospy roscpp urdf

    catkin_create_pkg最后一个参数是引入urdf 库

    cd smart_car

    mkdir urdf

    2.创建一个launch文件

    在包目录下创建一个launch文件夹,并新建文件display.launch,如下所示

     第一个输入参数 model 就是要启动的urdf文件路径。 

    第二个输入参数 gui 指定是否启用关节转动控制面板窗口。

    该文件可以帮助启动RViz来观察机器人。其中有三个node,一个是rviz,另外两个joint_state_publisher robot_state_publisher是必须的node。

    3.创建基座base_link

    ROS里面把每个零件称为link,作为基座的link统一称为base_link.其他的link都要依附到base_link上.这里把下层的板作为base_link.新建一个urdf文件,名为sp1s.urdf,其代码如下:

    link可以指定许多属性:    

      <inertial>    定义惯性     

    <visual>     定义一个link的外观,大小,颜色和材质纹理贴图     

    <collision>定义碰撞检测属性 

    我们详细看一下<visual>的定义:     

    <geometry> 定义了几何形状为一个立方体,三个参数分别为长宽高,单位是米(m). 这里我们指定下层小车板子的板的尺寸。

    <geometry>可以有好几个选项:<box> 立方体  <cylinder>圆柱体  <sphere>球体     <material> 指定颜色rgb和透明度a.  它们取值范围都是[0,1] 区间。

    4.运行下面命令

    roslaunch smart_car display.launch gui:=true
    出现如下的显示界面

    这时只是显示了一个半透明的长方体,就是我们的主体部分。中间的黄色点代表了base_link的原点,也是整个RViz世界的原点。

    5.下面创建轮子

    创建四个轮子,名字分别是tyer_front_left,tyer_front_right,tyer_back_left,tyer_back_right,尺寸大小直径为6.8cm,厚度为2.5cm,下面先以一个轮子为例:

    定义黄色的轮子tyer_front_left

    添加了一个关节 joint将base_link和tyer_front_left关联在一起,为了简单,将joint定义为fixed类型。

    两个及以上的link定义到一个文件里必须使用joint关联,否则出错.

    6.运行下面命令

     roslaunch smart_car display.launch gui:=true

    可以看到黄色的轮子显示到了车身的中央,因为它的原点origin和base_link的origin重合. 选中TFcheckbox,就会显示出XYZ坐标轴,红色为X, 绿色为Y,蓝色为Z。

    7.下面将讲述如何使用joint将轮子平移到左上方并旋转。

    1)建立可以转动的joint

    1. 将joint的类型改为"continuous" 这样front_left相对base_link就是一个转动的装置

    2. 转动的位置就是由 origin定义的,它同时定义了tyer_front_left的新原点,之前它的原点默认就是base_link的原点

         xyz 是相对parent base_link原点的偏移, 它把轮子移动到了左前方。其中:

         z = -0.011m = 6.8cm/2-4.5cm,保证轮子是在地上的

           y = 0.064m = 15cm/2 - 2.5cm / 2 (轮子厚度) + offset

         pry 是分别以 x y z 轴为中心转动的角度(弧度制) 1.57075 就是90度。 围绕x轴旋转90度轮子就竖了起来。

    3. axis重新定义转动轴在原点的方向,它是一个矢量,只指示方向,它们必须满足 x * x + y * y + z * z = 1   原点Z轴已经被旋转90度变成水平方向,所以这里定义Z轴方向为转动方向

    2)运行命令

     roslaunch smart_car display.launch gui:=true

    3)添加四个轮子

     roslaunch smart_car display.launch gui:=true

    4)添加四个柱子

    上下层的四个角上是高3cm的柱子. 在上面urdf的基础上再添加下面的内容添加一个左前方的柱子。

    1. 柱子不转动,所以joint的类型为 fixed 

    2. joint里面定义改变了柱子的原点为 xyz="0.13 0.07 0.0015" 是相对base_link的 

    3. link里面也定义了原点为xyz="0 0 0.015", 这里只是显示上的偏移,它相对于joint里面定义的原点,但并不改变joint里面定义的物理原点 

    4. 接下来重复加三个柱子,详见最后一段的urdf定义

    运行命令之后

    5)添加上层

    6)下面是完整的代码

    <?xml version="1.0"?>  
          <robot name="sp1s">    
          <link name="base_link">  
            <visual>  
              <geometry>  
                <box size="0.27 .15 .003"/>  
              </geometry>  
              <material name="white">  
                 <color rgba="1 1 1 .5"/>  
            </material>  
            </visual>  
          </link>  
            
          <link name="tyer_front_left">  
            <visual>  
              <geometry>  
               <cylinder length=".025" radius="0.034"></cylinder>  
              </geometry>  
              <material name="yellow">  
                  <color rgba="1 1 0 1"/>  
              </material>    
            </visual>  
          </link>  
        <link name="tyer_front_right">  
            <visual>  
              <geometry>  
               <cylinder length=".025" radius="0.034"></cylinder>  
              </geometry>  
              <material name="yellow">  
                  <color rgba="1 1 0 1"/>  
              </material>    
            </visual>  
          </link>  
            
    <link name="tyer_back_left">  
            <visual>  
              <geometry>  
               <cylinder length=".025" radius="0.034"></cylinder>  
              </geometry>  
              <material name="yellow">  
                  <color rgba="1 1 0 1"/>  
              </material>    
            </visual>  
          </link>  
    <link name="tyer_back_right">  
            <visual>  
              <geometry>  
               <cylinder length=".025" radius="0.034"></cylinder>  
              </geometry>  
              <material name="yellow">  
                  <color rgba="1 1 0 1"/>  
              </material>    
            </visual>  
          </link>  
    <link name="pillar_front_left">
        <visual>
        <geometry>
        <cylinder length=".03" radius="0.0025"></cylinder>
        </geometry>
        <origin xyz="0 0 0.015"/>
        <material name="silver">
        <color rgba=".86 .86 .86 1"/>
        </material>
        </visual>
    </link>
    <link name="pillar_front_right">  
        <visual>  
          <geometry>  
           <cylinder length=".03" radius="0.0025"></cylinder>  
          </geometry>  
          <origin xyz="0 0 0.015"/>    
          <material name="silver">    
              <color rgba=".86 .86 .86 1"/>    
          </material>  
        </visual>  
      </link>  
      
      <link name="pillar_back_left">  
        <visual>  
          <geometry>  
           <cylinder length=".03" radius="0.0025"></cylinder>  
          </geometry>  
          <origin xyz="0 0 0.015"/>    
          <material name="silver">    
              <color rgba=".86 .86 .86 1"/>    
          </material>  
        </visual>  
      </link>  
      
      <link name="pillar_back_right">  
        <visual>  
          <geometry>  
           <cylinder length=".03" radius="0.0025"></cylinder>  
          </geometry>  
          <origin xyz="0 0 0.015"/>    
          <material name="silver">    
              <color rgba=".86 .86 .86 1"/>    
          </material>  
        </visual>  
      </link>  
        <link name="top_link">  
          <visual>  
            <geometry>  
              <box size="0.27 .15 .003"/>  
            </geometry>  
            <material name="white">  
               <color rgba="1 1 1 .5"/>  
          </material>  
          </visual>  
        </link>  
          
        <joint name="base_to_top" type="fixed">  
          <origin xyz="0  0  0.03"/>  
          <parent link="base_link"/>  
          <child link="top_link"/>  
        </joint>  
          <joint name="base_to_front_left" type="continuous">  
            <origin rpy="1.57075 0 0" xyz="0.06 0.064 -0.011"/>  
            <parent link="base_link"/>  
            <child link="tyer_front_left"/>      
            <axis xyz="0 0 1"/>  
          </joint>  
         <joint name="base_to_front_right" type="continuous">  
            <origin rpy="1.57075 0 0" xyz="0.06 -0.064 -0.011"/>  
            <parent link="base_link"/>  
            <child link="tyer_front_right"/>      
            <axis xyz="0 0 1"/>  
          </joint>
         <joint name="base_to_back_left" type="continuous">  
            <origin rpy="1.57075 0 0" xyz="-0.06 0.064 -0.011"/>  
            <parent link="base_link"/>  
            <child link="tyer_back_left"/>      
            <axis xyz="0 0 1"/>  
          </joint>
         <joint name="base_to_back_right" type="continuous">  
            <origin rpy="1.57075 0 0" xyz="-0.06 -0.064 -0.011"/>  
            <parent link="base_link"/>  
            <child link="tyer_back_right"/>      
            <axis xyz="0 0 1"/>  
          </joint>
        <joint name="base_to_pillar_front_left" type="fixed">
        <origin xyz="0.13  0.07  0.0015"/>  
            <parent link="base_link"/>  
            <child link="pillar_front_left"/> 
        </joint>
    <joint name="base_to_pillar_front_right" type="fixed">  
        <origin xyz="-0.13  0.07  0.0015"/>  
        <parent link="base_link"/>  
        <child link="pillar_front_right"/>  
      </joint>  
      
      <joint name="base_to_pillar_back_left" type="fixed">  
        <origin xyz="0.13  -0.07  0.0015"/>  
        <parent link="base_link"/>  
        <child link="pillar_back_left"/>  
      </joint>  
      
      <joint name="base_to_pillar_back_right" type="fixed">  
        <origin xyz="-0.13  -0.07  0.0015"/>  
        <parent link="base_link"/>  
        <child link="pillar_back_right"/>  
      </joint>  
        </robot>  
    View Code

  • 相关阅读:
    EntityFramework 启用迁移 EnableMigrations 报异常 "No context type was found in the assembly"
    JAVA 访问FTP服务器示例(2)
    NuGet Package Manager 更新错误解决办法
    JAVA 访问FTP服务器示例(1)
    RemoteAttribute 的使用问题
    诡异的 javascript 变量
    javascript apply用法
    Babun 中文乱码
    GSM呼叫过程
    转站博客园
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6786138.html
Copyright © 2011-2022 走看看