1. 程式人生 > >ROS官方教程[翻譯]---xacro的介紹與使用

ROS官方教程[翻譯]---xacro的介紹與使用

ROS官方教程[翻譯]—xacro的介紹與使用

本教程基於ROS官方xacro教程中jade版本ROS翻譯

功能包綜述

Xacro(XML Macros)Xacro是一種XML巨集語言。 使用xacro,您可以通過使用巨集命令構建更精悍短小但又具有更高可讀性的XML檔案,這種巨集命令可以擴充套件達到更大的XML表達範圍。
- 維護狀態:正在開發中
- 維護方:Morgan Quigley
- 作者:Stuart Glaser, William Woodall, Robert Haschke
- 許可證:BSD
- 漏洞和特徵彙報連結:https://github.com/ros/xacro/issues


- 源:git https://github.com/ros/xacro.git (branch: jade-devel)

目錄

  • 1.案例
  • 2.屬性和屬性塊
  • 3.數學表示式
  • 4.條件塊
  • 5.Rospack命令
  • 6.巨集命令
    • 6.1預設引數
    • 6.2區域性屬性
  • 7.包含其他xacro檔案
  • 8.YAML語言支援
  • 9.用CMakeLists.txt進行構建
  • 10.元素和屬性
  • 11.處理訂單
  • 12.已棄用的語法

此包在處理大型XML文件(如機器人說明)時最為有用。 它在如urdf的包中大量使用。 通過看下面的例子,本教程教您如何使用xacro來簡化urdf檔案。

1.案例

參考以下的Xacro XML片段:

<xacro:macro name="pr2_arm" params="suffix parent reflect">
  <pr2_upperarm suffix="${suffix}" reflect="${reflect}" parent="${parent}" />
  <pr2_forearm suffix="${suffix}" reflect="${reflect}" parent="elbow_flex_${suffix}" />
</xacro:macro>

<xacro:pr2_arm suffix="left"
reflect="1" parent="torso" /> <xacro:pr2_arm suffix="right" reflect="-1" parent="torso" />

上面的片段擴充套件成為下面的樣子:

<pr2_upperarm suffix="left" reflect="1" parent="torso" />
<pr2_forearm suffix="left" reflect="1" parent="elbow_flex_left" />
<pr2_upperarm suffix="right" reflect="-1" parent="torso" />
<pr2_forearm suffix="right" reflect="-1" parent="elbow_flex_right" />

如果我們還定義了pr2_upperarm和pr2_forearm的巨集,那麼這個片段可以擴充套件以描述整個機器人臂。
本頁的其餘部分描述了xacro的功能。

2.屬性和屬性塊

屬性是可以插入到XML文件中的任何位置的值。 屬性塊是XML的名稱片段,可以插入允許XML的任何位置。 兩者都使用屬性標籤來定義值。屬性標記不能在xacro:巨集中宣告。以下示例將顯示如何宣告和使用屬性:

<xacro:property name="the_radius" value="2.1" />
<xacro:property name="the_length" value="4.5" />

<geometry type="cylinder" radius="${the_radius}" length="${the_length}" />

通過將名稱放在dollared-braces( {”,你應該將其轉義為“$$ {”。
下面是使用屬性塊的示例:

<xacro:property name="front_left_origin">
  <origin xyz="0.3 0 0" rpy="0 0 0" />
</xacro:property>

<pr2_wheel name="front_left_wheel">
  <xacro:insert_block name="front_left_origin" />
</pr2_wheel>

3.數學表示式

在dollared-braces($ {})中,您還可以編寫簡單的數學表示式。 目前,該結構支援基本算術和變數替換。 下面是一個例子:

<xacro:property name="pi" value="3.1415926535897931" />
<circle circumference="${2.5 * pi}" />

Jade版本的ROS中更新的地方:

自ROS Jade以來,Xacro使用python來評估包含在dollared-braces($ {})中的表示式。 這允許使用者使用更復雜的算術表示式。 此外,一些基本常數,例如 pi,已經被預定義過了:

<xacro:property name="R" value="2" />
<xacro:property name="alpha" value="${30/180*pi}" />
<circle circumference="${2 * pi * R}" pos="${sin(alpha)} ${cos(alpha)}" />

4.條件塊

Hydro版本的ROS中更新的地方:

自從ROS Hydro以來,Xacro有類似於roslaunch的條件塊。 這對於可配置的機器人或載入不同的Gazebo外掛等事情很有用。 它遵循以下語法:

<xacro:if value="<expression>">
  <... some xml code here ...>
</xacro:if>
<xacro:unless value="<expression>">
  <... some xml code here ...>
</xacro:unless>

表示式需要計算結果為“0”,“1”,“true”或“false”,否則將丟擲錯誤。

Jade版本的ROS中更新的地方:

ROS Jade中更強大的評估功能允許使用更復雜的表示式。 幾乎任何python表示式的計算結果都是可行的:

<xacro:property name="var" value="useit"/>
<xacro:if value="${var == 'useit'}"/>
<xacro:if value="${var.startswith('use') and var.endswith('it')}"/>

<xacro:property name="allowed" value="[1,2,3]"/>
<xacro:if value="${1 in allowed}"/>

5.Rospack命令

Xacro允許你使用某些rospack命令和dollared括號($())。

<foo value="$(find xacro)" />
<foo value="$(arg myvar)" />

Xacro目前支援roslaunch使用替換args支援的所有rospack命令。 引數需要在命令列中使用myvar:= true語法指定。

Indigo版本的ROS中更新的地方:

自從ROS Indigo,它也可以定義預設值如下:

<xacro:arg name="myvar" default="false"/>

使用上面的定義語句,你可以像下面這樣執行xacro:

<param name="robot_description" command="$(find xacro)/xacro.py $(arg model) myvar:=true" />

6.巨集命令

xacro的主要特性是它對巨集的支援。 使用巨集標籤定義巨集,並指定巨集名稱和引數列表。 引數列表應以空格分隔。 它們變成巨集觀本地屬性。

<xacro:macro name="pr2_caster" params="suffix *origin **content **anothercontent">
  <joint name="caster_${suffix}_joint">
    <axis xyz="0 0 1" />
  </joint>
  <link name="caster_${suffix}">
    <xacro:insert_block name="origin" />
    <xacro:insert_block name="content" />
    <xacro:insert_block name="anothercontent" />
  </link>
</xacro:macro>

<xacro:pr2_caster suffix="front_left">
  <pose xyz="0 1 0" rpy="0 0 0" />
  <container>
    <color name="yellow"/>
    <mass>0.1</mass>
  </container>
  <another>
    <inertial>
      <origin xyz="0 0 0.5" rpy="0 0 0"/>
      <mass value="1"/>
      <inertia ixx="100"  ixy="0"  ixz="0" iyy="100" iyz="0" izz="100" />
    </inertial>
  </another>
</xacro:pr2_caster>

該示例聲明瞭一個巨集“pr2_caster”,它有兩個引數:suffix和origin。 請注意,“origin”已加星標。 這表明origin是一個塊引數,而不是一個簡單的文字引數。 向前看pr2_caster的使用。 字尾屬性在pr2_caster標記中定義為屬性,但沒有定義origin屬性。 相反,origin指的是第一個元素(在這種情況下是“pose”塊)。 雙星號版本(“content”,“anothercontent”)允許插入在隨後可用的元素(在上面的示例中分別是“container”,“another”)中傳遞的任意數量的元素。 此示例擴充套件為以下內容:

<joint name="caster_front_left_joint">
  <axis xyz="0 0 1" />
</joint>
<link name="caster_front_left">
  <pose xyz="0 1 0" rpy="0 0 0" />
  <color name="yellow" />
  <mass>0.1</mass>
  <inertial>
    <origin xyz="0 0 0.5" rpy="0 0 0"/>
    <mass value="1"/>
    <inertia ixx="100"  ixy="0"  ixz="0" iyy="100" iyz="0" izz="100" />
  </inertial>
</link>

將按指定的順序處理多個塊引數:

<xacro:macro name="reorder" params="*first *second">
  <xacro:insert_block name="second"/>
  <xacro:insert_block name="first"/>
</xacro:macro>
<reorder>
  <first/>
  <second/>
</reorder>

巨集可能包含其他巨集。 外部巨集將首先展開,然後內部巨集將展開。 例如:

<a>
  <xacro:macro name="foo" params="x">
    <in_foo the_x="${x}" />
  </xacro:macro>

  <xacro:macro name="bar" params="y">
    <in_bar>
      <xacro:foo x="${y}" />
    </in_bar>
  </xacro:macro>

  <xacro:bar y="12" />
</a>

變成:

<a>
  <in_bar>
    <in_foo the_x="12.0"/>
  </in_bar>
</a>

6.1預設引數

Indigo中更新

巨集引數可以有預設值:

<xacro:macro name="foo" params="x:=${x} y:=${2*y} z:=0"/>

如果預設值包含評估表示式,則將在例項化時評估它們。

Jade中更新

通常,您需要將外部變數傳遞到本地巨集引數(如上面的x)。 要簡化此任務,可以使用^語法:

<xacro:macro name="foo" params="p1 p2:=expr_a p3:=^ p4:=^|expr_b">

插入符號^表示使用外部scope屬性(具有相同名稱)。 管| 表示如果屬性未在外部範圍中定義,則使用給定的回退。

6.2區域性屬性

Jade中更新

在巨集中定義的屬性和巨集在此巨集的本地,即在外部不可見。 使用可選屬性scope =“parent | global”,屬性定義可以匯出到巨集的父作用域(或全域性作用域)。

7.包含其他xacro檔案

您可以使用xacro:include標記來包含其他xacro檔案:

<xacro:include filename="$(find package)/other_file.xacro" />
<xacro:include filename="other_file.xacro" />
<xacro:include filename="$(cwd)/other_file.xacro" />

檔案“other_file.xacro”將被xacro包含和擴充套件。 Jade中的新功能:相對檔名相對於當前處理的檔案進行解釋。 注意:當在巨集中包含檔案時,不是巨集定義,而是巨集呼叫檔案是處理包含! $(cwd)顯式允許訪問當前工作目錄中的檔案。
為了避免各種包含檔案的屬性和巨集之間的名稱衝突,可以為包含的檔案指定名稱空間 - 提供屬性ns:

<xacro:include filename="other_file.xacro" ns="namespace"/>

訪問名稱空間巨集和屬性是通過預先名稱空間來實現的,用點分隔:

${namespace.property}

8.YAML語言支

Jade中的新功能

屬性可以是用python語法過度宣告的字典或列表,如下所示:

<xacro:property name="props" value="${dict(a=1, b=2, c=3)}"/>
<xacro:property name="numbers" value="${[1,2,3,4]}"/>

或者從YAML檔案中載入,如下:

<xacro:property name="props" value="${load_yaml('props.yaml')}"/

注意,評估括號$ {}區分評價和純文字定義。 校準資料是從YAML載入的理想候選。

9.用CMakeLists.txt進行構建

以下程式碼段顯示如何在程式包的申明期間使用xacro:

# Generate .world files from .world.xacro files
find_package(xacro REQUIRED)
# You can also add xacro to the list of catkin packages:
#   find_package(catkin REQUIRED COMPONENTS ... xacro)

# Xacro files
file(GLOB xacro_files ${CMAKE_CURRENT_SOURCE_DIR}/worlds/*.world.xacro)

foreach(it ${xacro_files})
  # remove .xacro extension
  string(REGEX MATCH "(.*)[.]xacro$" unused ${it})
  set(output_filename ${CMAKE_MATCH_1})

  # create a rule to generate ${output_filename} from {it}
  xacro_add_xacro_file(${it} ${output_filename})

  list(APPEND world_files ${output_filename})
endforeach(it)

# add an abstract target to actually trigger the builds
add_custom_target(media_files ALL DEPENDS ${world_files})

Jade中的新功能:

雖然這個cmake程式碼提供了對目標名稱和構建順序的完全控制,但還有一個easyilities巨集:

file(GLOB xacro_files worlds/*.world.xacro)
xacro_add_files(${xacro_files} TARGET media_files)

10.元素與屬性

Jade中的新功能:

要使用動態定義的名稱新增元素或屬性,可以使用特殊的xacro標記

<xacro:element xacro:name="${element_name}" [other attributes]>
 [content]
</xacro:element>
<xacro:attribute name="${attribute_name}" value="${attribute_value}"/>

11.處理訂單

Classicly Xacro首先載入所有包含項,然後處理所有屬性和巨集定義,最後例項化巨集並評估表示式。 因此,後期定義的屬性或巨集定義將覆蓋先前的定義。 此外,條件標籤和對巨集或屬性定義以及包含其他檔案沒有影響。

Jade中的新功能:

自ROS Jade以來,Xacro提供了命令列選項–inorder,允許以讀取順序處理整個文件。 因此,將使用目前為止看到的屬性或巨集的最新定義。 這是一個更直觀的評估過程,提供了一些不錯的新功能:

  • 如果標籤分別放置在巨集內或條件標籤中,則可以推遲或完全禁止包含檔案。
  • 包含檔名可以通過屬性或巨集引數指定。
  • 通過更改全域性範圍的屬性,如果在巨集中使用這些屬性,則巨集的例項化可以產生不同的結果。
  • 屬性定義可以是有條件的。
  • 巨集可以在本地範圍內定義屬性,而不會影響外部。

因為 - 順序處理更強大,在未來Jade以後的版本,新的處理風格將成為預設風格,所以你應該檢查你的xacro檔案的相容性。 通常,兩種加工方式應該給出相同的結果。 你可以很容易地像下面這樣檢查:

rosrun xacro xacro file.xacro > /tmp/old.xml
rosrun xacro xacro --inorder file.xacro > /tmp/new.xml
diff /tmp/old.xml /tmp/new.xml

如果結果顯示出任何差異,你應檢查並調整您的xacro檔案。 常見的原因是校準資料後期進行了載入(作為屬性)。 在這種情況下,只需將載入行為向前移動,即在使用之前進行校準資料的載入。 為了方便搜尋錯誤放置的屬性定義,可以使用選項–check-order執行xacro。 如果有任何有問題的屬性,它們將在stderr上列出:

Document is incompatible to --inorder processing.
The following properties were redefined after usage:
foo redefined in issues.xacro

使用命令列選項-vv或-vvv,可以增加詳細程度級別以記錄屬性的所有定義。

12.已棄用的語法

Jade中的新功能:

雖然在以前的版本中,沒有名稱空間字首的xacro標籤能夠被接受並使用,但是這種草率的語法是我們應當強烈反對的,因為它阻止在最終的XML中使用這些標籤。 從Jade開始,這種語法已被棄用,你應該相應地更新你的檔案。 以下指令碼將為您更新檔案:

find . -iname "*.xacro" | xargs sed -i 's#<\([/]\?\)\(if\|unless\|include\|arg\|property\|macro\|insert_block\)#<\1xacro:\2#g'

相關推薦

ROS官方教程[翻譯]---xacro介紹使用

ROS官方教程[翻譯]—xacro的介紹與使用 本教程基於ROS官方xacro教程中jade版本ROS翻譯 功能包綜述 Xacro(XML Macros)Xacro是一種XML巨集語言。 使用xacro,您可以通過使用巨集命令構建更精悍短小但又具有更高

Gensim官方教程翻譯(二)——語料庫向量空間(Corpora and Vector Spaces)

====================正==========文==================== 如果你想記錄日誌,請不要忘記設定: >>> import logging >>> logging.basicConfig(for

【每天積累一點點】Data Binding Library官方教程翻譯

Data Binding Library This document explains how to use the Data Binding Library to writedeclarative layouts and minimize the glue code necessary to

Dapper官方教程翻譯3:Dapper方法之Query

Query方法描述   Query方法也是一個擴充套件方法,可以被IDbConnection物件呼叫,可以執行查詢語句,並且對映到結果。 可以對映的型別: Anonymous(匿名型別 var) Strongly Typed(強型別) Multi-Mapp

Dapper官方教程翻譯2:Dapper方法之Execute

Execute方法描述:   Execute是Dapper對資料庫操作的一個擴充套件,可以由IDbConnection物件呼叫。它可以執行一條命令一或多次,返回型別是受影響的行數。這個方法通常用於執行: Stored Procedure (儲存過程) INSERT

Dapper官方教程翻譯1:Dapper是什麼?

什麼是Dapper? Dapper是.NET的一個簡單的物件對映器,在速度上擁有微ORM之王的頭銜,並且幾乎與使用原始ADO.NET資料讀取器的速度一樣快。ORM是一個物件關係對映器,它負責資料庫和程式語言之間的對映。Dapper通過提供有用的擴充套件方法來查詢資料庫,從而擴充套件IDbConn

matterport Mask_RCNN官方教程翻譯

matterport/Mask_RCNN官方教程 這是一個基於python3,keras和tensorflow的mask rcnn模型。這個模型對影象中的每一個目標例項產生候選框和分割掩膜。這個模型基於特徵金字塔網路(Feature Pyramid Network, FPN

Gensim官方教程翻譯(五)——英文維基百科的實驗

僅供個人學習之用,如有錯誤,敬請指正。原文地址 為了測試gensim的效能,我們在維基百科英文版上運行了一些實驗。 這個頁面描述了獲取與處理維基百科的過程,以便任何人都能再現這個結果。本教程要求已經正確安裝了gensim。 譯者注:維基百科的內容

Unity3D Shader官方教程翻譯(十八)----Shader語法 另外一些命令(分類)

Category 分類 Category is a logical grouping of any commands below it. This is mostly used to "inherit" rendering state. For example, your shader might hav

Android官方教程翻譯(6)——新增ActionBar

The action bar allows you to add buttons for the most important action items relating to the app's current context. Those that appear di

翻譯自HVR官方手冊】HVR資料複製軟體介紹術語解釋

【翻譯自HVR官方手冊】HVR資料複製軟體介紹與術語解釋 HVR資料複製軟體是荷蘭HVR公司推出的一款資料複製軟體,用於db到db,db到file,file到db,file到file的實時複製。 整個過程分為如下四個步驟: 第一步:配置Location 第二步:配置Channel 第三步

WPF入門教程系列六——布局介紹Canvas(一)

mouse 建議 geo 自動調整 範圍 添加 ges ans colors 從這篇文章開始是對WPF中的界面如何布局做一個較簡單的介紹,大家都知道:UI是做好一個軟件很重要的因素,如果沒有一個漂亮的UI,功能做的再好也無法吸引很多用戶使用,而且沒有漂亮的界面,那麽普通用

最全 Docker 介紹教程,一文全掌握

Java 架構 程序員 Docker 最全 Docker 介紹與教程,一文全掌握2013年發布至今, Docker 一直廣受矚目,被認為可能會改變軟件行業。 但是,許多人並不清楚 Docker 到底是什麽,要解決什麽問題,好處又在哪裏?本文就來詳細解釋,幫助大家理解它,還帶有簡單易懂的實例,教

Python爬蟲教程-08-post介紹(百度翻譯)(下)

enc 需求 爬蟲 https 構造 單純 滿足 keyword st2 Python爬蟲教程-08-post介紹(下) 為了更多的設置請求信息,單純的通過urlopen已經不太能滿足需求,此時需要使用request.Request類 構造Request 實例 req =

16個國際頂尖計算機期刊介紹作者教程【附寫作模板】

https://mp.weixin.qq.com/s?__biz=MzU2OTA0NzE2NA==&mid=2247501526&idx=2&sn=2d7b0f8b3af472693346ea2b8bff79ba&chksm=fc8627c5cbf1aed3ff14a

16個國際頂尖計算機期刊介紹作者教程【附寫作模板】 (轉)

轉自: https://yq.aliyun.com/news/294479   摘要: 影響因子:2.http://mchelp.manuscriptcentral.IEEETransactionsonEvolutionaryComputation是由IEEE計算智慧學會出版的雙月同行評審科學

學習Go 系列教程 —— 1. 介紹安裝

這是我們 Golang 系列教程的第一個教程。 Golang 是什麼 Go 亦稱為 Golang(譯註:按照 Rob Pike 說法,語言叫做 Go,Golang 只是官方網站的網址),是由谷歌開發的一個開源的編譯型的靜態語言。 Golang 的主要關注點是使得

Quartz2教程(一)——quatz的介紹基本概念

很久沒有記錄一下新的東西了,最近看了一下java平臺上的quartz框架,並計劃把它使用在目前的專案中,去解決一些問題,如定時計算使用者的收益,定時提醒使用者預訂的資源需要被使用等等。 一、quart

Storm Kafka Integration (0.10.x+)官方文件翻譯:stormkafka整合

Storm Kafka Integration (0.10.x+) 相容性 Apache Kafka版本0.10以上 向kafka寫資料作為拓撲的一部分 你可以建立一個org.apache.storm.kafka.bolt.KafkaBolt的例項,

熊大UWB系列教程四:UWB超寬頻三基站定位系統原理介紹效果展示

對超寬頻感興趣的朋友,請關注熊大的微信公眾號,熊大將在上面釋出超寬頻教程,行業資訊,技術應用。幫助你更好的瞭解、學習、使用超寬頻技術。          購買熊大超寬頻系統,會提供微控制器原始碼,上位機原始碼還有技術支援。 熊大最近忙於開發超寬頻多基站多標籤定