-
Notifications
You must be signed in to change notification settings - Fork 87
/
test_ur_urdf_xacro.py
119 lines (104 loc) · 4.37 KB
/
test_ur_urdf_xacro.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# Copyright (c) 2022 FZI Forschungszentrum Informatik
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# * Neither the name of the {copyright_holder} nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
#
# Author: Lukas Sackewitz
import os
import shutil
import subprocess
import tempfile
import pytest
from ament_index_python.packages import get_package_share_directory
@pytest.mark.parametrize(
"ur_type", ["ur3", "ur3e", "ur5", "ur5e", "ur10", "ur10e", "ur16e", "ur20"]
)
@pytest.mark.parametrize("description_file", ["ur.urdf.xacro", "ur_mocked.urdf.xacro"])
@pytest.mark.parametrize("prefix", ["", "my_ur_"])
def test_ur_urdf_xacro(ur_type, description_file, prefix):
# Initialize Arguments
safety_limits = "true"
safety_pos_margin = "0.15"
safety_k_position = "20"
# General Arguments
description_package = "ur_description"
joint_limit_params = os.path.join(
get_package_share_directory(description_package), "config", ur_type, "joint_limits.yaml"
)
kinematics_params = os.path.join(
get_package_share_directory(description_package),
"config",
ur_type,
"default_kinematics.yaml",
)
physical_params = os.path.join(
get_package_share_directory(description_package),
"config",
ur_type,
"physical_parameters.yaml",
)
visual_params = os.path.join(
get_package_share_directory(description_package),
"config",
ur_type,
"visual_parameters.yaml",
)
description_file_path = os.path.join(
get_package_share_directory(description_package), "urdf", description_file
)
(_, tmp_urdf_output_file) = tempfile.mkstemp(suffix=".urdf")
# Compose `xacro` and `check_urdf` command
xacro_command = (
f"{shutil.which('xacro')}"
f" {description_file_path}"
f" joint_limit_params:={joint_limit_params}"
f" kinematics_params:={kinematics_params}"
f" physical_params:={physical_params}"
f" visual_params:={visual_params}"
f" safety_limits:={safety_limits}"
f" safety_pos_margin:={safety_pos_margin}"
f" safety_k_position:={safety_k_position}"
f" name:={ur_type}"
f" prefix:={prefix}"
f" > {tmp_urdf_output_file}"
)
check_urdf_command = f"{shutil.which('check_urdf')} {tmp_urdf_output_file}"
# Try to call processes but finally remove the temp file
try:
xacro_process = subprocess.run(
xacro_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True
)
assert xacro_process.returncode == 0, " --- XACRO command failed ---"
check_urdf_process = subprocess.run(
check_urdf_command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True
)
assert (
check_urdf_process.returncode == 0
), "\n --- URDF check failed! --- \nYour xacro does not unfold into a proper urdf robot description. Please check your xacro file."
finally:
os.remove(tmp_urdf_output_file)
if __name__ == "__main__":
test_ur_urdf_xacro()