使用ROS中的urdf构建机器人小车的3D模型

本文介绍如何在ROS中使用urdf创建机器人3D模型。

准备工作

  1. 操作环境:AutolaborOS 下载安装教程
  2. 机器人3D模型:Autolabor 2.5 stl 文件 下载

移动机器人小车3D模型的构建

  1. 介绍
  2. 创建硬件描述包
  3. 绘制机器人小车模型
  4. 建立urdf文件
  5. 建立launch文件命令
  6. 效果展示

1. 介绍

机器人的3D模型在ROS中是通过URDF文件实现,URDF(Unified Robot Description Format)就是描述机器人硬件尺寸布局的模型语言。它是同ROS通信的渠道,通过机器人的物理尺寸来配置机器人模型,ROS就可以有效的进行自主导航(Navagation)和碰撞检测(collision detect)了。

2. 创建硬件描述包

在ROS中,所有的ROS软件(包括我们创建的软件)都被组织成软件包的形式。因此,在工作空间catkin_ws/src/目录下通过catkin_create_pkg来创建硬件描述包:

$ catkin_create_pkg autolabor_description urdf

通过catkin_create_pkg创建了一个autolabor_description的包,该命令的最后一个参数是引入urdf库。

ROS中创建包详情请参考:http://wiki.ros.org/ROS/Tutorials/CreatingPackage

在新建的包中创建 urdf 和 launch 文件夹用于存储 *.urdf 和 *.launch 文件。可以在catkin_ws/src/目录下看到:

3. 绘制机器人小车的3D模型

(当然,这一步并不是必要的,你也可以通过配置urdf文件来得到小车的模型,详情参考第四步)
通过机器人小车的物理参数,使用3D制图软件绘制机器人小车的3D模型

在autolabor_description包的目录下,新建meshes文件夹,将绘制的3D模型复制到在路径下

4. 建立urdf文件

在urdf文件夹下创建文件 autolabor_description.urdf文件,并将下列代码放在 autolabor_description.urdf文件中

如果绘制了3D模型,建立urdf文件

 <robot name="autolabor_description"> 
    <link name="base_link">
    <inertial>
      <origin
        xyz="0. 0. 0."
        rpy="0. 0. 0." />
      <mass
        value="0.251988675650349" />
      <inertia
        ixx="0.000595579869264794"
        ixy="5.99238175321912E-08"
        ixz="-1.98242615307314E-08"
        iyy="0.00102462329604677"
        iyz="-1.73115625503396E-05"
        izz="0.00060561972360446" />
    </inertial>
    <visual>
      <origin
        xyz="0. 0. 0.05"
        rpy="1.57 0. 1.57" />
      <geometry>
        <mesh
          filename="package://autolabor_description/meshes/base_link.stl" />
      </geometry>
      <material
        name="">
        <color
          rgba="0.792156862745098 0.819607843137255 0.933333333333333 1" />
      </material>
    </visual>
   </link>
   </robot>

如果未绘制3D模型,通过配置urdf来得到模型,这里仅展示一个简单的example

<?xml version="1.0"?>
<robot name="smartcar">
  <link name="base_link">
    <visual>
      <geometry>
        <box size="0.25 .16 .05"/>
    </geometry>
    <origin rpy="0 0 1.57075" xyz="0 0 0"/>
    <material name="blue">
        <color rgba="0 0 .8 1"/>
    </material>
    </visual>
 </link>

 <link name="right_front_wheel">
    <visual>
      <geometry>
        <cylinder length=".02" radius="0.025"/>
      </geometry>
      <material name="black">
        <color rgba="0 0 0 1"/>
      </material>
    </visual>
  </link>

  <joint name="right_front_wheel_joint" type="continuous">
    <axis xyz="0 0 1"/>
    <parent link="base_link"/>
    <child link="right_front_wheel"/>
    <origin rpy="0 1.57075 0" xyz="0.08 0.1 -0.03"/>
    <limit effort="100" velocity="100"/>
    <joint_properties damping="0.0" friction="0.0"/>
  </joint>

  <link name="right_back_wheel">
    <visual>
      <geometry>
        <cylinder length=".02" radius="0.025"/>
      </geometry>
      <material name="black">
        <color rgba="0 0 0 1"/>
      </material>
    </visual>
  </link>

  <joint name="right_back_wheel_joint" type="continuous">
    <axis xyz="0 0 1"/>
    <parent link="base_link"/>
    <child link="right_back_wheel"/>
    <origin rpy="0 1.57075 0" xyz="0.08 -0.1 -0.03"/>
    <limit effort="100" velocity="100"/>
    <joint_properties damping="0.0" friction="0.0"/>
 </joint>

 <link name="left_front_wheel">
    <visual>
      <geometry>
        <cylinder length=".02" radius="0.025"/>
      </geometry>
      <material name="black">
        <color rgba="0 0 0 1"/>
      </material>
    </visual>
  </link>

  <joint name="left_front_wheel_joint" type="continuous">
    <axis xyz="0 0 1"/>
    <parent link="base_link"/>
    <child link="left_front_wheel"/>
    <origin rpy="0 1.57075 0" xyz="-0.08 0.1 -0.03"/>
    <limit effort="100" velocity="100"/>
    <joint_properties damping="0.0" friction="0.0"/>
  </joint>

  <link name="left_back_wheel">
    <visual>
      <geometry>
        <cylinder length=".02" radius="0.025"/>
      </geometry>
      <material name="black">
        <color rgba="0 0 0 1"/>
      </material>
    </visual>
  </link>

  <joint name="left_back_wheel_joint" type="continuous">
    <axis xyz="0 0 1"/>
    <parent link="base_link"/>
    <child link="left_back_wheel"/>
    <origin rpy="0 1.57075 0" xyz="-0.08 -0.1 -0.03"/>
    <limit effort="100" velocity="100"/>
    <joint_properties damping="0.0" friction="0.0"/>
  </joint>

  <link name="head">
    <visual>
      <geometry>
        <box size=".02 .03 .03"/>
      </geometry>
      <material name="white">
          <color rgba="1 1 1 1"/>
      </material>
    </visual>
  </link>

  <joint name="tobox" type="fixed">
    <parent link="base_link"/>
    <child link="head"/>
    <origin xyz="0 0.08 0.025"/>
  </joint>
</robot>

其中配置解释如下:

<link>对应模型的一个模块,可以通过标签joint让子模块与base_link进行关联;

<visual>描述一个link的外观,大小,颜色,材质纹理等;

<geometry>定义该link的几何模型,包含该几何模型的尺寸,单位:米;

<box> 矩形,定义属性:size(包含长宽高,数据用空格隔开);

<cylinder>  圆柱体,定义属性:length,radius;

<sphere>  球体,定义属性:radius;

<material> 定义颜色和透明度(RGBA),取值区间 [0,1] ;

<collision> 描述碰撞检测属性;

<origin> 用来描述模块的位置;

<inertial> 定义惯性;

5.创建launch命令文件

*.launch文件的作用是:同时启动多个节点,使用roslaunch命令运行.launch文件中指定的节点。在launch文件夹中创建文件display.launch,并编辑,代码如下:

<launch>
  <arg name="model" />
  <arg name="gui" default="false" />

  <param name="robot_description" textfile="$(find autolabor_description)/urdf/autolabor_description.urdf" />
  <param name="use_gui" value="$(arg gui)" />

  <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find autolabor_description)/urdf.rviz" />
</launch>

第一个输入参数 model 就是要启动的urdf文件路径。
第二个输入参数 gui 指定是否启用关节转动控制面板窗口。
两个参数表示:分别描述要启动的模型描述文件(urdf)和关节转到控制窗口(gui,对应各个joint)。
三个节点:分别用于发送joint的信息,robot的控制信息,和rviz的启动。至此,模型搭建完毕,启动模型进行测试。

6.效果展示

进入工作空间目录下,编译文件,使用roslaunch命令来启动它:

$ cd ~/catkin_ws/
$ source devel/setup.bash
$ catkin_make

$ roslaunch autolabor_description display.launch

在启动rviz后,需要将上面标记的topic的参数改成上述图中,否则是无法观测到的,到此,就建立并启动了自己的机器人小车了

autolabor_urdf下载
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容