ROS URDF:在处理文件时重新定义全局符号:pi

ROS URDF: redefining global symbol: pi when processing file

在 ros urdf.xacro 文件上 运行ning xacro 时,出现错误“重新定义全局符号:pi”。 重现步骤如下。

 <?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">

  <!-- transmission -->
  <xacro:include filename="$(find tm_grasp_description)/urdf/tm.transmission.xacro" />

  <!-- Mass parameters -->
  <xacro:property name="pi" value="3.14159265" />

  <xacro:macro name="tm700_robot" params="prefix joint_limited">

    <!-- transmission prefix -->
    <xacro:tm_arm_transmission prefix="${prefix}" />

    <joint name="${prefix}shoulder_1_joint" type="revolute">
      <parent link="${prefix}base_link" />
      <child link = "${prefix}shoulder_1_link" />
      <origin xyz="0.0 0.0 ${shoulder_height}" rpy="${-0.5 * pi} 0.0 0.0" />
      <axis xyz="0 -1 0" />
      <xacro:unless value="${joint_limited}">
        <limit lower="${-2.0 * pi}" upper="${2.0 * pi}" effort="150.0" velocity="3.15"/>
      </xacro:unless>
      <xacro:if value="${joint_limited}">
        <limit lower="${-pi}" upper="${pi}" effort="150.0" velocity="3.15"/>
      </xacro:if>
      <dynamics damping="0.0" friction="0.0"/>
    </joint>

    ...
  </xacro:macro>
</robot>

我正在尝试将机器人添加到 xacro 文件

<?xml version="1.0" ?>
<robot name="hrwros" xmlns:xacro="http://www.ros.org/wiki/xacro">

<!-- world --> 
<link name="world" />

<!-- workcell -->
<xacro:include filename="$(find hrwros_support)/urdf/workcell/workcell.urdf.xacro"/>
<xacro:workcell_urdf workcell_parent="world_interface"/>

<!-- Robot1 Pedestal -->
<xacro:include filename="$(find hrwros_support)/urdf/robot_pedestal/robot_pedestal.urdf.xacro"/>
    <xacro:robot_pedestal_urdf pedestal_prefix="robot1_" pedestal_parent="world_interface" pedestal_height="0.95">
    <origin xyz="0.5 1.8 0.0" rpy="0 0 0"/>
</xacro:robot_pedestal_urdf>

<!-- Robot1 -->
<xacro:include filename="$(find tm_grasp_description)/urdf/tm700.urdf.xacro"/>
<xacro:tm700_robot prefix="robot1_" joint_limited="true"/>

<!-- bins -->
<xacro:include filename="$(find hrwros_support)/urdf/bin/bin.urdf.xacro"/>
<xacro:bin_urdf prefix="bin_1_"/>

<!-- logical camera 1 collision model -->
<xacro:include filename="$(find hrwros_support)/urdf/logical_camera/logical_camera.urdf.xacro"/>
<xacro:logical_camera_urdf prefix="logical_camera1_" logical_camera_parent="world_interface">
  <origin xyz="1.2 1.8 2.0" rpy="0 1.5708 0"/>
</xacro:logical_camera_urdf>

<!-- logical camera 2 collision model -->
<xacro:include filename="$(find hrwros_support)/urdf/logical_camera/logical_camera.urdf.xacro"/>
<xacro:logical_camera_urdf prefix="logical_camera2_" logical_camera_parent="world_interface">
    <origin xyz="-8.3 -1.23 1.8" rpy="0 1.5708 0"/>
</xacro:logical_camera_urdf>

<!-- break beam -->
<xacro:include filename="$(find hrwros_support)/urdf/break_beam/break_beam.urdf.xacro"/>
<xacro:break_beam_urdf prefix="break_beam_"/>

但是当我尝试 运行

    rosrun xacro xacro --inorder hrwros.xacro > hrwros.urdf

它显示以下错误,说明重新定义符号 pi。我要添加的机器人是 techman 机器人。

    xacro: in-order processing became default in ROS Melodic. You can drop the option.
    redefining global symbol: pi
    when processing file: /home/akash/project/src/techman_robot_ros-master/tm_grasp_description/urdf/tm700.urdf.xacro
    included from: hrwros.xacro

因此,当您在全局范围内定义了相同的 xacro 属性 时,另一个同名的 xacro 会重新定义它。

查看错误报告,您首先在顶层文件中定义了它,可能还有其他地方。在数学运算中,pi is defined already,因为数学运算使用 python 并且在那里定义了 pi。 如果删除全局 pi 定义,它现在应该可以工作了。