ROS系统玩转自主移动机器人(5)-- ROS系统建模

摘要:
好了,我们开始介绍ROS系统中机器人的建模方法。这里你可以参考博主写的双臂机器人(门户)的ROS建模方法。在开始自己建模之前,强烈建议您仔细阅读ROS系统最基本的建模相关语法:Urdf/XML解释(门户)XMLmacrolanguageXacro(门户)在学习了这两篇文章之后,您可以基本掌握ROS系统模型描述文件的基本语法。这个开源平台仍然使用Xacro文件进行建模。

注:本篇博文全部源码下载地址为:Git Repo传送门

1. 下载到本地后解压到当前文件夹然后运行:catkin_make 编译。

2. 源码是在 Ubuntu14.04 + Indigo 环境下编写。

  前面博文已经介绍了机器人平台的机械结构设计、嵌入式硬件平台的搭建等内容,从本片开始介绍本开源机器人平台ROS系统的相关程序,主要有:

  • ROS系统建模;
  • Gazebo仿真;
  • ROS系统机器人SLAM框架;
  • SLAM中Gmapping和地图构建;
  • SLAM中AMCL算法;
  • 机器人正逆运动学;
  • 路径规划;
  • ROS系统与机器人视觉;
  • ROS系统与语音交互;
  • 。。。

  随着本开源项目展开,所有的代码都会公开源码且GitHub托管。需要注明的是:

  1. 这里的开源的代码全部是基于X86平台的Linux开发的;
  2. 代码中很多是和嵌入式平台(小车运控板)交互的内容,小车的嵌入式软件所有的源代码后面也会分几篇博文介绍并全部公开。

  OK,现在开始介绍机器人在ROS系统的建模方法,这里可以参考博主之前写的一篇双臂机器人的ROS建模方法(传送门),在开始动手自己建模之前,强烈推荐先精读ROS系统最基本的建模相关的语法介绍:

  经过这两篇文章的学习,基本可以掌握ROS系统的模型描述文件的基本语法,本开源平台仍然采用Xacro文件进行模型建立。

一、模型描述文件中网格(mesh)文件的生成

  前面的文章已经介绍了本开源机器人平台的机械结构设计(传送门),下面简单讲解一下模型描述文件中的引用三维网格文件的生成。Urdf/Xacro文件中支持两种网格三维文件类型:.STL文件类型和 .DAE文件类型。

  • 生成 .STL文件类型:

  我们利用SolidWorks创建机器人三维模型之后,首先可以直接保存成STL文件类型。

    Tips:SW中从装配体(或零件)保存到STL文件时可以先创建参考坐标系,然后另存为的时候,在选项中选择参考坐标系就可以在模型上自定义坐标系的位置。

  • 生成 .DAE文件类型:

         在上一步生成的STL的基础上,利用三维动画制作软件Blender生成 .DAE文件,很简单,只需要在“文件”下拉菜单中“导入”菜单经文件导入,然后用“导出”菜单选择导出成 .DAE格式的文件即可。

二、 模型描述文件的编写

  本开源机器人建模文件集成在homerobot_description软件包(package)里面,可以在本篇文章开头给出的代码仓下载,该package的文件树结构如图1所示:

ROS系统玩转自主移动机器人(5)-- ROS系统建模第1张

图1  homerobot_description包文件树

  其中模型描述文件名称为:homerobot.xacro,这里截取几个比较重要的片段解释一下。

  1. 开始的一些宏定义和声明就不做解释了,base_footprint相关定义如下

<link name="base_footprint">
        <visual>
            <geometry>
                 <box size="0.001 0.001 0.001"/>
            </geometry>
            <origin rpy="0 0 0" xyz="0 0 0"/>
       </visual>
</link>

<joint name="base_footprint_joint" type="fixed"> 
        <origin xyz="0 0 0.084" />
        <parent link="base_footprint" />
        <child link="base_link" />
</joint>

  这个坐标系(base_footprint)不是必须的,而是习惯性的写法,它是人为定义出来的一个可以称作为“影子”的坐标系,它和base_link唯一的不同点就是Z坐标上的值不同。这里我们先绘制了一个非常小的正方体(geometry)作为连杆(link),然后规定了关节(joint)的属性,即base_link和base_footprint的连接关系。

  2. 关于base_link的定义

  <link name="base_link">
      <visual>
          <origin xyz="0.0 0.0 0.0" rpy="0 0 0" /> 
            <geometry>
                <mesh filename="package://homerobot_description/meshes/base_link.dae"/>
            </geometry>
            <material name="green" />
      </visual>
      <collision>
            <origin xyz="0.0 0.0 0.0" rpy="0 0 0" /> 
            <geometry>
                  <mesh filename="package://homerobot_description/meshes/base_link.dae"/>
            </geometry>
      </collision>
    <xacro:inertial_matrix mass="5"/>
  </link>

  这里就涉及到引用.dae文件的语法了:

<mesh filename="package://homerobot_description/meshes/base_link.dae"/>

  由于我们的三维网格文件base_link.dae提前就生成好了,所以这里直接引用就可以了,后面我们会通过可视化工具看到,这里link和joint的语法参考文章前面给出的详解文档,此外,这里有一个宏定义的引用语句:

<xacro:inertial_matrix mass="5"/>

  这里引用开头定义的宏:转动惯量矩阵计算,然后将质量参数(mass="5")传入宏就指明了base_link的惯量矩阵。<collision>语句指出了base_link的碰撞检测范围,这里可以引用本体,也可以人为扩大一个范围。

  3. 主动轮的定义

<joint name="L_Wheel_joint" type="continuous">  
    <parent link="base_link"/>
    <child link="L_Wheel_link"/>
    <origin xyz="-0.075 0.1885 -0.034" rpy="1.5707963 0 0" />
    <axis xyz="0 0 -1" />
    <limit effort="100" velocity="100"/>
    <!-- velocity: m/s for prismatic, rad/s for revolute -->
    <!-- <dynamics damping="50" friction="1"/> -->
    <dynamics damping="0.1" friction="0.5"/>
    <!-- friction: N for prismatic joints, N.m for revolute joints -->
</joint>

<link name="L_Wheel_link">
      <visual>
          <origin xyz="0.0 0.0 0.0" rpy="0 0 0" /> 
          <geometry>
                <mesh filename="package://homerobot_description/meshes/L_wheel.dae"/>
          </geometry>
          <material name="Black" />
      </visual>

      <collision>
            <origin xyz="0.0 0.0 0.0" rpy="0 0 0" /> 
            <geometry>
                  <mesh filename="package://homerobot_description/meshes/L_wheel.dae"/>
            </geometry>
    </collision>
    <xacro:inertial_matrix mass="1"/>
</link>

这里有几个参数值得注意:

<axis xyz="0 0 -1" />

指定了转轴为Z轴;

<limit effort="100" velocity="100"/>

最大的驱动力矩和最大转速均设定为100,这里可以根据不同平台修改,其中,速度单位对于移动副来说是m/s,对于转动副来说是rad/s,这里joint的类型type是continuous,即连续转动,因此这里单位是后者。

4. Xacro文件的include用法

  在Xacro文件中同样可以引用外部的一些设置文件,在这里有一句:

<xacro:include filename="$(find homerobot_description)/urdf/homerobot.gazebo" />

  这里引用了homerobot_description包下面的homerobot.gazebo文件,这个文件是对机器人在gazebo仿真环境下的一些仿真参数设置,后面分一篇博文详细讲讲ROS系统与Gazebo仿真环境。

三、ROS系统和Rviz可视化工具

  ROS系统非常好的集成了Rviz这一可视化调试工具,大大方便了机器人开发调试的工作(除了偶尔会crash,这个工具真的非常赞)。这里我们当然要用可视化工具看看上面编写完成的机器人模型描述文件,编写launch文件,名称为:description.launch,内容如下:

<launch>
    <arg name="model" />

    <!-- Parsing xacro and setting robot_description parameter -->
    <param name="robot_description" textfile="$(find homerobot_description)/urdf/homerobot.xacro"/>

    <!-- Setting gui parameter to true for display joint slider -->
    <param name="use_gui" value="true"/>

    <!-- Starting Joint state publisher node which will publish the joint values -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"/>

    <!-- Starting robot state publish which will publish tf -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher"/>

    <!-- Launch visualization in rviz -->
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find homerobot_description)/launch/urdf.rviz" required="true"/>
</launch>

  关于如何理解launch文件,请参考官方文档(传送门)。如果一切正常的话就会看到下面的图示效果。

ROS系统玩转自主移动机器人(5)-- ROS系统建模第2张

图2 机器人平台在Rviz中

四、ROS系统的tf tree(空间坐标变换树)

  这里tf应该是transform的缩写,是指空间中两个三维坐标系的转换关系,这种转换关系一般可以分为:平移和旋转。表征这些转换关系的方法也有很多,比较常用的就是:

  • 齐次转换矩阵
  • 欧拉角(RPY)
  • 四元数

  其实他们这件是可以相互转化的。

  前面有一篇博文:ROS系统MoveIt玩转双臂机器人系列(五)--浅议机器人运动学与D-H建模(传送门)中有简单介绍了空间坐标系的基础知识。

       具体到ROS系统中,它提出了tf tree的概念,也就是在建模的时候你就已经指定了一个机器人一共有几个坐标系,各个坐标系之间的转换关系是如何的(上面xacro文件中的link和joint定义的时候就已经说明了各个零部件之间的位置关系和运动关系),如果有信息缺失则tf tree一定是有缺失的。ROS系统提供了tf查看工具,在命令行运行:

rosrun rqt_tf_tree rqt_tf_tree

  就可以得到下图所示的效果,我们可以直观的看出各个link之间的转换关系。

ROS系统玩转自主移动机器人(5)-- ROS系统建模第3张

图3 tf树截图

 <-- 本篇完 --> 

欢迎留言、私信、邮箱、微信等任何形式的技术交流。

作者信息:

名称:Shawn

邮箱:zhanggx0102@163.com

免责声明:文章转载自《ROS系统玩转自主移动机器人(5)-- ROS系统建模》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇css中width和height默认值Python学习笔记控制流之恼人的死循环和跳出死循环(break语句)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ROS知识(5)----消息与服务的示例

ROS中已经定义了较多的标准类型的消息,你可以用在这些标准类型的消息上再自定义自己的消息类型。这个在复杂数据传输很有用,例如节点和服务器进行交互时,就可能用到传输多个参数到服务器,并返回相应的结果。为了保证例子的完整,将详述每一步。 基本思路和创建talker和listener的例子类似,步骤如下: 建立工作空间workspace(类似于vs下的解决方案,...

ROS机器人开发实践学习笔记3

摘要: 刚刚开始学习ROS,打算入机器人的坑了,参考教材是《ROS及其人开发实践》胡春旭编著 机械工业出版社 华章科技出品。本来以为可以按照书上的步骤一步步来,但是,too young to simple啊,程序员的苦逼日子开始了,特地记录如下。 今天居然发现,不是linux没有安装成功,只是没有办法找到boot/efi下的引导文件,充分利用Manjaro...

[转载] 第三篇:数据仓库系统的实现与使用(含OLAP重点讲解)

阅读目录 前言 创建数据仓库 ETL:抽取、转换、加载 OLAP/BI工具 数据立方体(Data Cube) OLAP的架构模式 小结 回到顶部 前言         上一篇重点讲解了数据仓库建模,它是数据仓库开发中最核心的部分。然而完整的数据仓库系统还会涉及其他一些组件的开发,其中最主要的是ETL工程,在线分析处理工具(OLAP)和商务智能(...

数据挖掘的几种经典方法论

 目录 CRISP-DM方法 SEMMA方法 DMAIC方法 AOSP-SM模型 5A模型 数据挖掘与分析的“七步法” 一、CRISP-DM方法(最流行) CRISP-DM - Data Science Project Managementhttps://www.datascience-pm.com/crisp-dm-2/ 在老外的这个网站中,我们可以了可...

钉钉开发系列(十二)机器人

钉钉的每个群都可以建若干个机器人,有默认的比如github,也可以自定义。我们使用自定义,建立自己的机器人,然后得到一串的URL,只要向这个URL进行POST请求后,就能将消息通知到对应的群中。机器人的创建可以参照官方的文档。 发送通知的代码如下 private string WEB_HOOK = "https://oapi.dingtalk.com/...

如何在ROS中使用PCL—数据格式(1)

在ROS中点云的数据类型 在ROS中表示点云的数据结构有: sensor_msgs::PointCloud      sensor_msgs::PointCloud2     pcl::PointCloud<T> 关于PCL在ros的数据的结构,具体的介绍可查 看            wiki.ros.org/pcl/Overview 关于s...