-
Notifications
You must be signed in to change notification settings - Fork 86
/
start_ursim.sh
executable file
·223 lines (200 loc) · 7.07 KB
/
start_ursim.sh
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
#!/bin/bash
# copyright 2022 Universal Robots A/S
#
# 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.
PERSISTENT_BASE="${HOME}/.ursim"
URCAP_VERSION="1.0.5"
help()
{
# Display Help
echo "Starts URSim inside a docker container"
echo
echo "Syntax: `basename "$0"` [-m|s|h]"
echo "options:"
echo " -m <model> Robot model. One of [ur3, ur3e, ur5, ur5e, ur10, ur10e, ur16e, ur20, ur30]. Defaults to ur5e."
echo " -v <version> URSim version that should be used.
See https://hub.docker.com/r/universalrobots/ursim_e-series/tags
for available versions. Defaults to 'latest'"
echo " -p <folder> Location from which programs are read / to which programs are written.
If not specified, will fallback to ${PERSISTENT_BASE}/${ROBOT_SERIES}/${ROBOT_MODEL}/programs"
echo " -u <folder> Location from which URCaps are read / to which URCaps are written.
If not specified, will fallback to ${PERSISTENT_BASE}/${ROBOT_SERIES}/urcaps"
echo " -d Detached mode - start in backgound"
echo " -h Print this Help."
echo
}
ROBOT_MODEL=ur5e
ROBOT_SERIES=e-series
URSIM_VERSION=latest
DETACHED=false
validate_model()
{
case $ROBOT_MODEL in
ur3|ur5|ur10)
ROBOT_MODEL=${ROBOT_MODEL^^}
ROBOT_SERIES=cb3
;;
ur3e|ur5e|ur10e|ur16e)
ROBOT_MODEL=${ROBOT_MODEL^^}
ROBOT_MODEL=$(echo ${ROBOT_MODEL:0:$((${#ROBOT_MODEL}-1))})
ROBOT_SERIES=e-series
;;
ur20|ur30)
ROBOT_MODEL=${ROBOT_MODEL^^}
ROBOT_SERIES=e-series
;;
*)
echo "Not a valid robot model: $ROBOT_MODEL"
exit
;;
esac
URCAP_STORAGE="${PERSISTENT_BASE}/${ROBOT_SERIES}/urcaps"
PROGRAM_STORAGE="${PERSISTENT_BASE}/${ROBOT_SERIES}/${ROBOT_MODEL}/programs"
}
verlte()
{
[ "$1" = $(printf "$1\n$2" | sort -V | head -n1) ]
}
validate_ursim_version()
{
local IMAGE_URSIM_VERSION
# Inspect the image's URSim version if the image is locally available. This is especially
# important when we use the "latest" tag, as we don't know the version hiding behind this and it
# could be potentially older.
IMAGE_URSIM_VERSION=$(docker image inspect universalrobots/ursim_"${ROBOT_SERIES}":"$URSIM_VERSION" 2>/dev/null | grep -Po '"build_version": "URSim Version: \K[^"]*') || true
if [ -z "$IMAGE_URSIM_VERSION" ]; then
IMAGE_URSIM_VERSION="$URSIM_VERSION"
fi
[ "$IMAGE_URSIM_VERSION" == "latest" ] && return 0
local MIN_CB3="3.14.3"
local MIN_E_SERIES="5.9.4"
local MIN_UR20="5.14.0"
local MIN_UR30="5.15.0"
local MIN_VERSION="0.0"
case $ROBOT_SERIES in
cb3)
verlte "4.0.0" "$IMAGE_URSIM_VERSION" && echo "$IMAGE_URSIM_VERSION is no valid CB3 version!" && exit
verlte "$MIN_CB3" "$IMAGE_URSIM_VERSION" && return 0
MIN_VERSION=$MIN_CB3
;;
e-series)
if [[ $ROBOT_MODEL == "UR20" ]]; then
verlte "$MIN_UR20" "$IMAGE_URSIM_VERSION" && return 0
MIN_VERSION=$MIN_UR20
elif [[ $ROBOT_MODEL == "UR30" ]]; then
verlte "$MIN_UR30" "$IMAGE_URSIM_VERSION" && return 0
MIN_VERSION=$MIN_UR30
else
verlte "$MIN_E_SERIES" "$URSIM_VERSION" && return 0
MIN_VERSION=$MIN_E_SERIES
fi
;;
esac
echo "Illegal version given. For $ROBOT_SERIES $ROBOT_MODEL the software version must be greater or equal to $MIN_VERSION. Given version: $IMAGE_URSIM_VERSION."
exit
}
while getopts ":hm:v:p:u:d" option; do
case $option in
h) # display Help
help
exit;;
m) # robot model
ROBOT_MODEL=${OPTARG}
;;
v) # ursim_version
URSIM_VERSION=${OPTARG}
;;
p) # program_folder
PROGRAM_STORAGE_ARG=${OPTARG}
;;
u) # urcaps_folder
URCAP_STORAGE_ARG=${OPTARG}
;;
d) # detached mode
DETACHED=true
;;
\?) # invalid option
echo "Error: Invalid option"
help
exit;;
esac
done
validate_model
validate_ursim_version
if [ -n "$PROGRAM_STORAGE_ARG" ]; then
PROGRAM_STORAGE="$PROGRAM_STORAGE_ARG"
fi
if [ -n "$URCAP_STORAGE_ARG" ]; then
URCAP_STORAGE="$URCAP_STORAGE_ARG"
fi
# Create local storage for programs and URCaps
mkdir -p "${URCAP_STORAGE}"
mkdir -p "${PROGRAM_STORAGE}"
URCAP_STORAGE=$(realpath "$URCAP_STORAGE")
PROGRAM_STORAGE=$(realpath "$PROGRAM_STORAGE")
# Download external_control URCap
if [[ ! -f "${URCAP_STORAGE}/externalcontrol-${URCAP_VERSION}.jar" ]]; then
curl -L -o "${URCAP_STORAGE}/externalcontrol-${URCAP_VERSION}.jar" \
"https://github.com/UniversalRobots/Universal_Robots_ExternalControl_URCap/releases/download/v${URCAP_VERSION}/externalcontrol-${URCAP_VERSION}.jar"
fi
# Check whether network already exists
docker network inspect ursim_net > /dev/null
if [ $? -eq 0 ]; then
echo "ursim_net already exists"
else
echo "Creating ursim_net"
docker network create --subnet=192.168.56.0/24 ursim_net
fi
# run docker contain
docker run --rm -d --net ursim_net --ip 192.168.56.101\
-v "${URCAP_STORAGE}":/urcaps \
-v "${PROGRAM_STORAGE}":/ursim/programs \
-e ROBOT_MODEL="${ROBOT_MODEL}" \
-p 30001-30004:30001-30004 \
-p 29999:29999 \
--name ursim \
universalrobots/ursim_${ROBOT_SERIES}:$URSIM_VERSION || exit
# Stop container when interrupted
TRAP_CMD="
echo \"killing ursim\";
docker container kill ursim >> /dev/null;
docker container wait ursim >> /dev/null;
echo \"done\";
exit
"
trap "$TRAP_CMD" SIGINT SIGTERM
echo "Docker URSim is running"
printf "\nTo access Polyscope, open the following URL in a web browser.\n\thttp://192.168.56.101:6080/vnc.html\n\n"
if [ "$DETACHED" = false ]; then
echo "To exit, press CTRL+C"
while :
do
sleep 1
done
else
echo "To kill it, please execute 'docker stop ursim'"
fi