一.利用xacro理解机器人建模

当我们创建复杂的机器人模型时,URDF的灵活性将会降低,URDF缺少的主要特性是简单的、可重用性,模块化和可编程性。

URDF是一个单独的文件我们不能在它里面包含其他的URDF文件。这降低了代码的模块化特性。所有代码都必须放在一个文件中,这会降低代码的简单性。

使用xacro的机器人模型将满足所有这些条件。xacro的一些主要的特点如下:

*简化URDF : xacro是URDF的高级版本,他在机器人描述中创建宏并重用宏。这可以减少代码长度。此外,它还可以包含来自其他文件的宏,使代码更简单、更易读和更模块化。

*可编程性 : xacro语言在其描述中支持简单的编程语句。有变量、常量、数值表达式、条件语句等使描述更加智能和高效。

我们可以说xacro是URDF的高级版本,在需要的时候,我们可以利用ros工具将xacro定义转换为URDF。

我们可以用xacro创建

  1 <?xml version="1.0"?>
2
3 <robot xmlns:xacro="http://www.ros.org/wiki/xacro"
4 xmlns:sensor="http://playerstage.sourceforge.net/gazebo/xmlschema/#sen sor"
5 xmlns:controller="http://playerstage.sourceforge.net/gazebo/xmlsch ema/#controller"
6 xmlns:interface="http://playerstage.sourceforge.net/gazebo/xmlsche ma/#interface"
7 name="pan_tilt">
8
9
10 <xacro:property name="base_link_length" value="0.01" />
11 <xacro:property name="base_link_radius" value="0.2" />
12
13 <xacro:property name="pan_link_length" value="0.4" />
14 <xacro:property name="pan_link_radius" value="0.04" />
15
16 <xacro:property name="tilt_link_length" value="0.4" />
17 <xacro:property name="tilt_link_radius" value="0.04" />
18
19
20 <xacro:macro name="inertial_matrix" params="mass">
21 <inertial>
22 <mass value="${mass}" />
23 <inertia ixx="0.5" ixy="0.0" ixz="0.0"
24 iyy="0.5" iyz="0.0"
25 izz="0.5" />
26 </inertial>
27 </xacro:macro>
28
29
30
31 <link name="base_link">
32
33 <visual>
34 <geometry>
35 <cylinder length="${base_link_length}" radius="${base_link_radius}"/>
36 </geometry>
37 <origin rpy="0 0 0" xyz="0 0 0"/>
38 <material name="yellow">
39 <color rgba="1 1 0 1"/>
40 </material>
41 </visual>
42
43 <collision>
44 <geometry>
45 <cylinder length="${base_link_length+0.02}" radius="0.2"/>
46 </geometry>
47 <origin rpy="0 0 0" xyz="0 0 0"/>
48 </collision>
49 <xacro:inertial_matrix mass="1"/>
50 </link>
51
52 <joint name="pan_joint" type="revolute">
53 <parent link="base_link"/>
54 <child link="pan_link"/>
55 <origin xyz="0 0 0.1"/>
56 <axis xyz="0 0 1" />
57 <limit effort="300" velocity="0.1" lower="-3.14" upper="3.14"/>
58 <dynamics damping="50" friction="1"/>
59 </joint>
60
61 <link name="pan_link">
62 <visual>
63 <geometry>
64 <cylinder length="${pan_link_length}" radius="${pan_link_radius}"/>
65 </geometry>
66 <origin rpy="0 0 0" xyz="0 0 0.09"/>
67 <material name="red">
68 <color rgba="0 0 1 1"/>
69 </material>
70 </visual>
71 <collision>
72 <geometry>
73 <cylinder length="${pan_link_length}" radius="${pan_link_radius+0.02}" />
74 </geometry>
75 <origin rpy="0 0 0" xyz="0 0 0.09"/>
76 </collision>
77 <xacro:inertial_matrix mass="1"/>
78 </link>
79
80 <joint name="tilt_joint" type="revolute">
81 <parent link="pan_link"/>
82 <child link="tilt_link"/>
83 <origin xyz="0 0 0.2"/>
84 <axis xyz="0 1 0" />
85 <limit effort="300" velocity="0.1" lower="-4.64" upper="-1.5"/>
86 <dynamics damping="50" friction="1"/>
87 </joint>
88
89 <link name="tilt_link">
90 <visual>
91 <geometry>
92 <cylinder length="${tilt_link_length}" radius="${tilt_link_radius}"/>
93 </geometry>
94 <origin rpy="0 1.5 0" xyz="0 0 0"/>
95 <material name="green">
96 <color rgba="1 0 0 1"/>
97 </material>
98 </visual>
99 <collision>
100 <geometry>
101 <cylinder length="${tilt_link_length}" radius="${tilt_link_radius+0.2} "/>
102 </geometry>
103 <origin rpy="0 1.5 0" xyz="0 0 0"/>
104 </collision>
105 <xacro:inertial_matrix mass="1"/>
106 </link>
107
108
109 </robot>

前面两行代码指定了解析xacro文件所需的所有xacro文件的命名空间。在指定命名空间后,我们需要添加xacro文件名称。

1.使用属性

使用xacro,我们可以在xacro文件中声明常量和属性,即以名称表示的值,这些常量或属性可以在代码中的任何地方使用。常量的主要用途是,避免在连杆和关节上提供硬编码的值,而是保持一些常量,

这样就更容易更改这些值了,而不是查找并替换这些硬编码的值。

这里给出一个使用属性的例子。我们声明了基座连杆和平移连杆的长度和半径。因此,在这里很容易改变尺寸而不是改变每个尺寸的值。

<xacro:property name="base_link_length" value="0.01" />

<xacro:property name="base_link_radius" value="0.2" />

<xacro:property name="pan_link_length" value="0.4" />
 <xacro:property name="pan_link_radius" value="0.04" />

我们可以通过下面的定义,使用变量的值来替换硬编码的值。

<cylinder length= "${pan_link_length}"

radius="${pan_link_radius}"/>

在这里,旧值0.4被替换为{pan_link_length},  0.04被替换为{pan_link_radius}.

2.使用数学表达式

我们可以使用基本操作(如+、-、*、/、一元求负运算和括号)在${}中构建数学表达式。目前还不支持指数和模数。下面是一个代码中使用简单的数学表达式的例子

<cylinder length="${pan_link_length}"

radius="${pan_link_radius+0.02}"/>

3.使用宏

xacro的一个主要特性就是它支持宏(macro).我们可以使用宏来减少复杂定义的长度。

这是一个我们在惯性代码中使用的宏定义:

<xacro:macro name="inertial_matrix" params="mass">
           <inertial>
                    <mass value="${mass}" />
                      <inertia ixx="0.5" ixy="0.0" ixz="0.0"
                           iyy="0.5" iyz="0.0"izz="0.5" />
             </inertial>
 </xacro:macro>
这里宏被命名为inertial_matrix,他的参数是mass。mass参数可以在惯性定义中使用${mass}。我们可以用一行命令来替换每一个惯性码,如下所示:

<xacro : inertial_matrix mass="1"/>

与URDF相比,xacro定义提高了代码可读性并减少了行数。接下来,我们将学习如何将xacro转换为URDF文件。

二.将xacro转换为URDF

设计完成xacro文件后,我们可以使用以下命令将其转换为URDF文件:

$ rosrun xacro xacro pan_tilt.xacro --inorder > pan_tilt_generated.urdf

我们还可以在ROS启动文件中使用下面的命令将xacro转换为URDF,并将其作为robot_description的参数:

<param name="robot_descriptipn" command="${find xacro)/xacro --inorder

${find mastering_ros_robot_description_pkg)/urdf/pan_tilt.xacro"

我们可以通过启动文件来查看pan_tilt的xacro文件,并使用以下命令来启动它:

$ roslaunch mastering_ros_robot_description_pkg view_pan_tilt_xacro.launch

ROS中的3D建模机器人(三)的更多相关文章

  1. 3D建模与处理软件简介

    [前言]自半年前笔者发表博客“什么是计算机图形学”以来,时常有人来向笔者询问3D模型的构建方法与工具.笔者的研究方向是以3D技术为主,具体包括3D建模,3D处理及3D打印三个方面,在3D建模与处理方面 ...

  2. ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse

    ROS机器人程序设计(原书第2版)补充资料 (柒) 第七章 3D建模与仿真 urdf Gazebo V-Rep Webots Morse 书中,大部分出现hydro的地方,直接替换为indigo或ja ...

  3. ROS_Kinetic_07 ROS中机器人三维物理引擎高保真仿真利器gazebo 7.0

    ROS_Kinetic_07 ROS中机器人三维物理引擎高保真仿真利器gazebo 7.0 ROS kinetic中的gazebo版本是7.0,有很多新的特性. 首先,启动gazebo: ~$ gaz ...

  4. ROS中发布激光扫描消息

    激光雷达工作时会先在当前位置发出激光并接收反射光束,解析得到距离信息,而后激光发射器会转过一个角度分辨率对应的角度再次重复这个过程.限于物理及机械方面的限制,激光雷达通常会有一部分“盲区”.使用激光雷 ...

  5. ROS学习笔记十二:使用gazebo在ROS中仿真

    想要在ROS系统中对我们的机器人进行仿真,需要使用gazebo. gazebo是一种适用于复杂室内多机器人和室外环境的仿真环境.它能够在三维环境中对多个机器人.传感器及物体进行仿真,产生实际传感器反馈 ...

  6. 3D建模软件的选择(UG,Solidworks,ProE)

    转自:3D建模软件的选择(UG,Solidworks,ProE) 自述 咱是一个码农,和web.软件.控制台打交道太多了,很想玩玩炫的东西,于是学了点点PS,结果发现完全没有美术细胞TT.最近有碰到对 ...

  7. ROS中利用V-rep进行地图构建仿真

    V-rep中显示激光扫描点  在VREP自带的场景中找到practicalPathPlanningDemo.ttt文件,删除场景中多余的物体只保留静态的地图.然后在Model browser→comp ...

  8. 对比几种在ROS中常用的几种SLAM算法

    在此因为要总结写一个文档,所以查阅资料,将总结的内容记录下来,欢迎大家指正! 文章将介绍使用的基于机器人操作系统(ROS)框架工作的SLAM算法. 在ROS中提供的五种基于2D激光的SLAM算法分别是 ...

  9. TIAGo ROS模拟教程2 - 自主机器人导航

    TIAGo ROS Simulation Tutorial 2 – Autonomous robot navigation TIAGo ROS模拟教程2 - 自主机器人导航 发表于 12月 23,20 ...

随机推荐

  1. $NOIp$普及组做题记录

    \([NOIp2014]\) 螺旋矩阵 \(Sol\) 直接模拟,一次走一整行或者一整列.复杂度\(O(n)\). \(Code\) #include<bits/stdc++.h> #de ...

  2. 「Poj1845」Sumdiv 解题报告

    题面戳这里 啥都别看,只是求 \(a^b\)所有的因数的和 思路: 真没想到! 其实我们可以先将\(a^b\)分解成质因数的 因为\(a^b\)的因数肯定是\(a^b\)的质因数在一定的条件下相乘而成 ...

  3. Java工作流引擎节点接收人设置20种规则讲解一

    关键字: 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 开发者表单  拖拽式表单 工作流系统CCBPM节点访问规则接收人规则 适配数据库: o ...

  4. Flutter 不能热加载,热重载按钮灰色,无法点击,flutter doctor 显示NO_PROXY is not set

    一.现象: Flutter 不能热加载 热重载按钮灰色,无法点击. 二.分析原因: 终端 flutter doctor 显示 NO_PROXY is not set 没有设置无代理的端口 终端:flu ...

  5. 单用户登陆demo-后者挤到前者,类似QQ

    单用户登陆demo ,采用的是Tp5. 流程是,当用户首次登陆是验证用户帐号密码,成功的,用当前时间戳加上用户id和ip 拼接成一个标识,暂且sign ,然后存入cookie ,时间戳存入缓存redi ...

  6. HashMap 源码赏析 JDK8

    一.简介 HashMap源码看过无数遍了,但是总是忘,好记性不如烂笔头. 本文HashMap源码基于JDK8. 文章将全面介绍HashMap的源码及HashMap存在的诸多问题. 开局一张图,先来看看 ...

  7. Netty快速入门(02)Java I/O(BIO)介绍

    BIO简介 Java I/O,也叫Blocking I/O,也就是阻塞式I/O. BIO的流程比较简单,在服务端创立一个ServerSocket去监听,等待连接.客户端创建一个Socket连接过来,服 ...

  8. 如何获取scrimba内部(内联框架)中网页地址?

    看图:  将其在新窗口打开  方法一:按下F12 键 (打开 开发者工具) ,再照图中箭头用鼠标点击所示, 图中粗红下划线为该页面的URL 地址, 复制在新窗口打开即可 方法二:利用JS代码手动获取 ...

  9. c++ 贪心讲解大礼包

    贪心是什么? 它其实类似一种思想 就是总问题可以分成许多的子问题 子问题的最优解可以直接推出整个问题 它和动态规划有一定的不同之处 动态规划不能由子问题的最优解推出整个问题的最优解 所以你看都要有一个 ...

  10. kafka模式对比

    Receiver是使用Kafka的高层次Consumer API来实现的.receiver从Kafka中获取的数据都是存储在Spark Executor的内存中的,然后Spark Streaming启 ...