URDF broken rendering in RVIZ
I need help understanding why my urdf keeps breaking in Rviz. (I apologise for the length of this question).
The problem I am experiencing is my robot only part renders in Rviz. To make matters worse, I am loading the same urdf from two seperate packages and both result in widely difference output in Rviz.
I've followed and almost finished the ROS URDF tutorial. From that tutorial I have the following xacro:
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="R2D2">
<xacro:property name="bot" value="R2D2"/>
<material name="blue">
<color rgba="0.0 0.0 1.0 1.0"/>
</material>
<material name="white">
<color rgba="1.0 1.0 1.0 1.0"/>
</material>
<material name="green">
<color rgba="0.0 1.0 0.0 1.0"/>
</material>
<material name="red">
<color rgba="1.0 0.0 0.0 1.0"/>
</material>
<material name="black">
<color rgba="0.0 0.0 0.0 1.0"/>
</material>
<!-- Base Link -->
<xacro:property name="base_link_radius" value="0.2"/>
<xacro:property name="base_link_length" value="0.6"/>
<link name="base_link">
<visual name="">
<geometry>
<cylinder radius="${base_link_radius}" length="${base_link_length}"/>
</geometry>
<material name="blue"/>
</visual>
<collision>
<geometry>
<cylinder radius="${base_link_radius}" length="${base_link_length}"/>
</geometry>
</collision>
<inertial>
<mass value="10"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<!-- LEGS -->
<xacro:macro name="leg" params="prefix flip">
<xacro:property name="leg_dimensions" value="0.6 0.1 0.2"/>
<link name="${prefix}_leg_link">
<visual>
<geometry>
<box size="${leg_dimensions}"/>
</geometry>
<origin xyz="0.0 0.0 -0.3" rpy="0.0 1.57075 0.0"/>
<material name="white"/>
</visual>
<collision>
<geometry>
<box size="${leg_dimensions}"/>
</geometry>
<origin xyz="0.0 0.0 -0.3" rpy="0.0 1.57075 0.0"/>
</collision>
<inertial>
<mass value="10"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="base_to_${prefix}_leg" type="fixed">
<parent link="base_link"/>
<child link="${prefix}_leg_link"/>
<origin xyz="0.0 ${flip * -0.22} 0.25" rpy="0.0 0.0 0.0"/>
</joint>
</xacro:macro>
<xacro:leg prefix="right" flip="1" />
<xacro:leg prefix="left" flip="-1"/>
<!-- Leg bases -->
<xacro:macro name="legbase" params="prefix switch">
<xacro:property name="legbase_dimensions" value="0.4 0.1 0.1"/>
<link name="${prefix}_leg_base_link">
<visual name="">
<geometry>
<box size="${legbase_dimensions}"/>
</geometry>
<material name="white"/>
</visual>
<collision>
<geometry>
<box size="${legbase_dimensions}"/>
</geometry>
</collision>
<inertial>
<mass value="10.0"/>
<inertia ixx="0.4" ixy="0.0" ixz="0.0" iyy="0.4" iyz="0.0" izz="0.2"/>
</inertial>
</link>
<joint name="${prefix}leg_to_leftbase" type="fixed">
<parent link="${prefix}_leg_link"/>
<child link="${prefix}_leg_base_link"/>
<origin xyz="0.0 ${switch * -0.0} -0.6" rpy="0.0 0.0 0.0"/>
</joint> -->
</xacro:macro>
<!-- end Leg bases -->
<xacro:legbase prefix="right" switch="1"/>
<xacro:legbase prefix="left" switch="-1"/>
<!-- WHEELS -->
<xacro:macro name="wheel" params="side position flip">
<xacro:property name="wheel_radius" value="0.05"/>
<xacro:property name="wheel_length" value="0.1"/>
<link name="${side}_base_${position}_wheel">
<visual>
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_length}"/>
</geometry>
<material name="black"/>
<origin xyz="0.0 0.0 0.0" rpy="1.57075 0.0 0.0"/>
</visual>
<collision>
<geometry>
<cylinder radius="${wheel_radius}" length="${wheel_length}"/>
</geometry>
</collision>
<inertial>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="${side}_base_${position}_wheel_joint" type="continuous">
<axis xyz="0.0 1.0 0.0"/>
<parent link="${side}_leg_base_link"/>
<child link="${side}_base_${position}_wheel"/>
<limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/>
<origin xyz="${flip * 0.133333333333} 0 -0.1" rpy="0.0 0.0 0.0"/>
</joint>
</xacro:macro>
<xacro:wheel side="left" position="front" flip="1"/>
<xacro:wheel side="left" position="rear" flip="-1"/>
<xacro:wheel side="right" position="front" flip="1"/>
<xacro:wheel side="right" position="rear" flip="-1"/>
<!-- End wheels -->
<!-- Gripper -->
<xacro:property name="gripper_radius" value="0.006"/>
<xacro:property name="gripper_length" value="0.5"/>
<link name="gripper_arm">
<visual>
<geometry>
<cylinder radius="${gripper_radius}" length="${gripper_length}"/>
</geometry>
<origin xyz="0.45 0.0 0.15" rpy="0.0 1.57075 0.0"/>
<material name="white"/>
</visual>
<collision>
<geometry>
<cylinder radius="${gripper_radius}" length="${gripper_length}"/>
</geometry>
</collision>
<inertial>
<mass value="0.05"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="gripper_arm_joint" type="prismatic">
<parent link="base_link"/>
<child link="gripper_arm"/>
<limit effort="1000.0" lower="-0.38" upper="0" velocity="0.5"/>
</joint>
<!-- Gripper Fingers -->
<xacro:macro name="gripper_finger" params="side flip">
<link name="gripper_${side}_finger">
<visual>
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
<geometry>
<mesh filename="package://urdf_tutorial/meshes/l_finger.dae"/>
</geometry>
</visual>
<collision>
<geometry>
<mesh filename="package://urdf_tutorial/meshes/l_finger.dae"/>
</geometry>
</collision>
<inertial>
<mass value="0.05"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="${side}_finger_to_gripper" type="revolute">
<axis xyz="0.0 0.0 1.0"/>
<limit effort="1000.0" lower="0.0" upper="0.548" velocity="0.5"/>
<parent link="gripper_arm"/>
<child link="gripper_${side}_finger"/>
<origin xyz="0.7 0.0 0.15" rpy="${flip * 3.1415} 0.0 0.0"/>
</joint>
</xacro:macro>
<xacro:gripper_finger side="left" flip="1" />
<xacro:gripper_finger side="right" flip="0" />
<!-- End Gripper fingers -->
<!-- Gripper Finger Tips -->
<xacro:macro name="gripper_finger_tips" params="side flip">
<link name="gripper_${side}_finger_tip">
<visual>
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
<geometry>
<mesh filename="package://urdf_tutorial/meshes/l_finger_tip.dae"/>
</geometry>
</visual>
<collision>
<geometry>
<mesh filename="package://urdf_tutorial/meshes/l_finger_tip.dae"/>
</geometry>
</collision>
<inertial>
<mass value="0.05"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="gripper_${side}_finger_tip_to_gripper" type="fixed">
<parent link="gripper_${side}_finger"/>
<child link="gripper_${side}_finger_tip"/>
<origin xyz="0.10 0.0 0.0" rpy="0.0 0.0 0.0"/>
</joint>
</xacro:macro>
<xacro:gripper_finger_tips side="left" flip="1" />
<xacro:gripper_finger_tips side="right" flip="-1" />
<!-- End Gripper Finger Tips -->
<!-- Head -->
<link name="header_link">
<visual>
<geometry>
<sphere radius="0.2"/>
</geometry>
<material name="white"/>
</visual>
<collision>
<geometry>
<sphere radius="0.2"/>
</geometry>
</collision>
<inertial>
<mass value="2"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="header_joint" type="continuous">
<parent link="base_link"/>
<child link="header_link"/>
<limit lower="0.0" upper="0.0" effort="0.0" velocity="0.0"/>
<origin xyz="0.0 0.0 0.3" rpy="0.0 0.0 0.0"/>
<axis xyz="0.0 0.0 1.0"/>
</joint>
<!-- Box set in Head -->
<xacro:property name="headbox_dimensions" value="0.05 0.05 0.05"/>
<link name="headbox">
<visual>
<geometry>
<box size="${headbox_dimensions}"/>
</geometry>
<material name="blue"/>
<origin xyz="0.17 0.0 0.095" rpy="0.0 0.0 0.0"/>
</visual>
<collision>
<geometry>
<box size="${headbox_dimensions}"/>
</geometry>
</collision>
<inertial>
<mass value="1"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>
<joint name="headbox" type="fixed">
<parent link="header_link"/>
<child link="headbox"/>
</joint>
<!-- <gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/r2d2</robotNamespace>
</plugin>
</gazebo>
<transmission name="header_transmitter">
<type>transmission_interface/SimpleTransmission</type>
<actuator name="header_actuator">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
<joint name="header_joint">
<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
</joint>
</transmission> -->
</robot>
The following in the launch file, Rviz output and errors from my siskomiradescription package which is also where the urdf is located:
<launch>
<arg name='model' default=''/>
<!-- <param name='robot_description' textfile="$(find sisko_mira_description)/urdf/$(arg model)"/> -->
<param name='robot_description' textfile="$(find sisko_mira_description)/urdf/r2d2.urdf.xacro"/>
<!-- for sending fake joint values -->
<node name='joint_state_publisher' type='joint_state_publisher_gui' pkg='joint_state_publisher_gui'/>
<!-- for combine joint values -->
<node name='robot_state_publisher' type='robot_state_publisher' pkg='robot_state_publisher'/>
<node name='rviz' pkg='rviz' type='rviz' args='' />
</launch>
Errors reported on the command line:
process[rviz-3]: started with pid [30960]
[ERROR] [1607124718.069546229]: length [${base_link_length}] is not a valid float
[ERROR] [1607124718.070293048]: Could not parse visual element for Link [base_link]
[ERROR] [1607124718.070354783]: length [${gripper_length}] is not a valid float
[ERROR] [1607124718.070370169]: Could not parse visual element for Link [gripper_arm]
[ERROR] [1607124718.070438596]: Unable to parse component [${headbox_dimensions}] to a double (while parsing a vector value)
[ERROR] [1607124718.070454605]: Could not parse visual element for Link [headbox]
[ WARN] [1607124718.070600019]: The root link base_link has an inertia specified in the URDF, but KDL does not support a root link with an inertia. As a workaround, you can add an extra dummy link to your URDF.
[ERROR] [1607124719.106984376]: length [${base_link_length}] is not a valid float
[ERROR] [1607124719.107032985]: Could not parse visual element for Link [base_link]
[ERROR] [1607124719.107106294]: length [${gripper_length}] is not a valid float
[ERROR] [1607124719.107134657]: Could not parse visual element for Link [gripper_arm]
[ERROR] [1607124719.107216769]: Unable to parse component [${headbox_dimensions}] to a double (while parsing a vector value)
[ERROR] [1607124719.107236476]: Could not parse visual element for Link [headbox]
AND, this is the Rviz output from my sisko_world package which calls the urdf from the package above:
<?xml version="1.0"?>
<launch>
<param name="robot_description" command="$(find xacro)/xacro $(find sisko_mira_description)/urdf/r2d2.urdf.xacro"/>
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher">
<remap from="joint_states" to="/r2d2/joint_states"/>
</node>
<node name="joint_state_publisher_gui" pkg="joint_state_publisher_gui" type="joint_state_publisher_gui"/>
<node name="rviz" pkg="rviz" type="rviz" />
<!-- <node name="R2D2" pkg="gazebo_ros" type="spawn_model" args="-param robot_description -model SiskoBoT -urdf"/> -->
</launch>
Just to further compound my confusion, the full robot renders when I uncomment gazebo code in the sisko_world package:
Asked by sisko on 2020-12-04 19:28:37 UTC
Answers
It's likely this is the problem:
<param name='robot_description' textfile="$(find sisko_mira_description)/urdf/r2d2.urdf.xacro"/>
A .xacro
file is not a plain URDF, so it must be parsed by xacro
before uploading it to the parameter server.
Your first .launch
file treats it as a plain text file, so what gets uploaded to the parameter server is the raw contents of your r2d2.urdf.xacro
, which is not a proper URDF.
Hence the complaints by RViz and the partial model (it does the best it can apparently).
Your second .launch
file does this:
<param name="robot_description" command="$(find xacro)/xacro $(find sisko_mira_description)/urdf/r2d2.urdf.xacro"/>
Note how xacro
is used here to parse your .xacro
and then return the result. That result is valid URDF, so now consumers of that URDF will be able to parse it successfully.
As to the rest of what you describe: I don't know right now why RViz complains about missing transforms.
I would suggest you first fix the .launch
file and then proceed with further debugging.
Asked by gvdhoorn on 2020-12-05 01:02:53 UTC
Comments