Benjamin Perseghetti
4 years ago
committed by
Julian Kent
1 changed files with 200 additions and 0 deletions
@ -0,0 +1,200 @@ |
|||||||
|
#!/bin/bash |
||||||
|
#Author: Benjamin Perseghetti |
||||||
|
#Email: bperseghetti@rudislabs.com |
||||||
|
# This script unifies running gazebo simulation for HITL and SITL |
||||||
|
# You can run multiple instances of the 'px4' binary, with the gazebo SITL simulation |
||||||
|
# This script assumes px4 is already built, with 'make px4_sitl_default gazebo' |
||||||
|
# You can also run HITL with -h flag |
||||||
|
# Generate world and/or model files with editable json -j [m (model), w (world), mw (model and world), or wm (world and model)] |
||||||
|
|
||||||
|
# The simulator in SITL is expected to send to TCP port 4560+i for i in [0, N-1] |
||||||
|
# For example gazebo can be run like this for multiple SITL: |
||||||
|
# ./Tools/gz_sim.sh -n 10 -m iris |
||||||
|
# Or gazebo can be run like this for HITL: |
||||||
|
# ./Tools/gz_sim.sh -h 1 -m standard_vtol |
||||||
|
|
||||||
|
function cleanup() { |
||||||
|
echo "running the cleanup" |
||||||
|
pkill -x px4 |
||||||
|
pkill gazebo |
||||||
|
pkill gzclient |
||||||
|
pkill gzserver |
||||||
|
} |
||||||
|
|
||||||
|
trap "cleanup" INT SIGINT SIGTERM EXIT |
||||||
|
|
||||||
|
function spawn_model() { |
||||||
|
MODEL=$1 |
||||||
|
N=$2 #Instance Number |
||||||
|
WORLD_FILE=$3 |
||||||
|
MJ=$4 |
||||||
|
SITL_MODEL_NAME="${MODEL}_${N}" |
||||||
|
sitl_path=${SCRIPT_DIR}/sitl_gazebo |
||||||
|
jinja_model_script=${sitl_path}/scripts/jinja_model_gen.py |
||||||
|
base_model="--base_model ${MODEL}" |
||||||
|
model_json="--json_gen ${MJ}" |
||||||
|
|
||||||
|
if [ $hitl == true ]; then |
||||||
|
python3 ${src_path}/Tools/boot_now.py "/dev/ttyACM0" |
||||||
|
hil_mode="--hil_mode 1" |
||||||
|
model_name="--model_name ${MODEL}" |
||||||
|
hitl_launch_command="${model_json} ${base_model} ${hil_mode} ${model_name}" |
||||||
|
echo "Generating: ${jinja_model_script} ${hitl_launch_command}" |
||||||
|
python3 ${jinja_model_script} ${hitl_launch_command} |
||||||
|
sleep 1 |
||||||
|
source ${src_path}/Tools/setup_gazebo.bash ${src_path} ${src_path}/build/${target} |
||||||
|
sleep 2 |
||||||
|
gazebo ${sitl_path}/worlds/temp_${WORLD_FILE}.world --verbose |
||||||
|
|
||||||
|
else |
||||||
|
mavlink_tcp="--mavlink_tcp_port $((4560+${N}))" |
||||||
|
mavlink_udp="--mavlink_udp_port $((14560+${N}))" |
||||||
|
model_name="--model_name ${SITL_MODEL_NAME}" |
||||||
|
output_path="--output_path /tmp" |
||||||
|
working_dir="$build_path/instance_$n" |
||||||
|
sitl_launch_command="${model_json} ${base_model} ${mavlink_tcp} ${mavlink_udp} ${model_name} ${output_path}" |
||||||
|
[ ! -d "$working_dir" ] && mkdir -p "$working_dir" |
||||||
|
pushd "$working_dir" &>/dev/null |
||||||
|
echo "starting instance $N in $(pwd)" |
||||||
|
../bin/px4 -i $N -d "$build_path/etc" -w sitl_${SITL_MODEL_NAME} -s etc/init.d-posix/rcS >out.log 2>err.log & |
||||||
|
python3 ${jinja_model_script} ${sitl_launch_command} |
||||||
|
echo "Generating: ${jinja_model_script} ${sitl_launch_command}" |
||||||
|
echo "Spawning ${SITL_MODEL_NAME}" |
||||||
|
gz model --spawn-file=/tmp/${SITL_MODEL_NAME}.sdf --model-name=${SITL_MODEL_NAME} -x 0.0 -y $((3*${N})) -z 0.2 |
||||||
|
popd &>/dev/null |
||||||
|
fi |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
if [ "$1" == "--help" ]; then |
||||||
|
echo "Usage: $0 [-n <num_vehicles>] [-m <vehicle_model>] [-h <run_hitl>] [-w <world>] [-s <script>] [-t <num_threads>] [-j <json_params>]" |
||||||
|
echo "-s flag is used to script spawning vehicles e.g. $0 -s iris:3,plane:2" |
||||||
|
echo "-h flag is used to launch a single vehicle in HITL mode" |
||||||
|
echo "-t flag is used to set the number of ODE threads for the world" |
||||||
|
echo "-j flag is used to enable json parameters from gen_params.json for the world (w), model (m), or both (wm or mw)" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
while getopts n:m:h:w:s:t:j:p option |
||||||
|
do |
||||||
|
case "${option}" |
||||||
|
in |
||||||
|
n) NUM_VEHICLES=${OPTARG};; |
||||||
|
m) VEHICLE_MODEL=${OPTARG};; |
||||||
|
h) HITL=${OPTARG};; |
||||||
|
w) WORLD=${OPTARG};; |
||||||
|
s) SCRIPT=${OPTARG};; |
||||||
|
t) THREADS=${OPTARG};; |
||||||
|
j) JSON=${OPTARG};; |
||||||
|
p) TARGET=${OPTARG};; |
||||||
|
esac |
||||||
|
done |
||||||
|
|
||||||
|
num_vehicles=${NUM_VEHICLES:=1} |
||||||
|
world=${WORLD:=empty} |
||||||
|
hitl=${HITL:=false} |
||||||
|
threads=${THREADS:=1} |
||||||
|
json_opts=${JSON:=0} |
||||||
|
target=${TARGET:=px4_sitl_default} |
||||||
|
system_threads=`grep -Pc '^processor\t' /proc/cpuinfo` |
||||||
|
echo "Number of requested ODE threads: $((threads))" |
||||||
|
echo "Max number of possilbe threads: $((system_threads))" |
||||||
|
if [ $((threads)) -gt $((system_threads)) ]; then |
||||||
|
threads=$system_threads |
||||||
|
echo "Requested ODE thread count too high, set to system max of $threads threads." |
||||||
|
elif [ $(( ${threads} )) -lt 1 ]; then |
||||||
|
threads=1 |
||||||
|
echo "Requested ODE thread count too low, set to $threads thread." |
||||||
|
else |
||||||
|
echo "Using $threads threads for ODE." |
||||||
|
fi |
||||||
|
|
||||||
|
if [ "$json_opts" == "mw" ] || [ "$json_opts" == "wm" ]; then |
||||||
|
echo "JSON used for both world and model generation" |
||||||
|
wjson="1" |
||||||
|
mjson="1" |
||||||
|
elif [ "$json_opts" == "w" ]; then |
||||||
|
echo "JSON used for world generation" |
||||||
|
wjson="1" |
||||||
|
mjson="0" |
||||||
|
elif [ "$json_opts" == "m" ]; then |
||||||
|
echo "JSON used for model generation" |
||||||
|
mjson="1" |
||||||
|
wjson="0" |
||||||
|
else |
||||||
|
wjson="0" |
||||||
|
mjson="0" |
||||||
|
fi |
||||||
|
|
||||||
|
if [ "$hitl" == "True" ] || [ "$hitl" == "1" ] || [ "$hitl" == "true" ]; then |
||||||
|
hitl=true |
||||||
|
else |
||||||
|
hitl=false |
||||||
|
fi |
||||||
|
|
||||||
|
export PX4_SIM_MODEL=${VEHICLE_MODEL:=iris} |
||||||
|
|
||||||
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" |
||||||
|
src_path="$SCRIPT_DIR/.." |
||||||
|
echo ${SCRIPT} |
||||||
|
build_path=${src_path}/build/${target} |
||||||
|
source ${src_path}/Tools/setup_gazebo.bash ${src_path} ${src_path}/build/${target} |
||||||
|
sleep 1 |
||||||
|
|
||||||
|
sitl_path=${SCRIPT_DIR}/sitl_gazebo |
||||||
|
world_name="--world_name ${world}" |
||||||
|
jinja_world_script=${sitl_path}/scripts/jinja_world_gen.py |
||||||
|
sitl_ode_threads="--ode_threads ${threads}" |
||||||
|
world_json="--json_gen ${wjson}" |
||||||
|
|
||||||
|
if [ $hitl == true ]; then |
||||||
|
hitl_model_name="--model_name ${PX4_SIM_MODEL}" |
||||||
|
echo "HITL mode is currently turned on, disabling multiple vehicle spawn and script spawn." |
||||||
|
echo "RUNNING: python3 $jinja_world_script $world_name $hitl_model_name $world_json" |
||||||
|
python3 $jinja_world_script $world_name $hitl_model_name $world_json |
||||||
|
echo "Generated temp_${world}.world" |
||||||
|
spawn_model ${PX4_SIM_MODEL} 0 ${world} ${mjson} |
||||||
|
|
||||||
|
else |
||||||
|
echo "killing running instances" |
||||||
|
pkill -x px4 || true |
||||||
|
echo "HITL mode is currently turned off." |
||||||
|
echo "RUNNING: python3 $jinja_world_script $world_name $sitl_ode_threads $world_json" |
||||||
|
python3 $jinja_world_script $world_name $sitl_ode_threads $world_json |
||||||
|
echo "Generated temp_${world}.world" |
||||||
|
echo "Starting gazebo: gzserver ${sitl_path}/worlds/temp_${world}.world --verbose" |
||||||
|
gzserver ${sitl_path}/worlds/temp_${world}.world --verbose & |
||||||
|
sleep 5 |
||||||
|
|
||||||
|
n=0 |
||||||
|
if [ -z ${SCRIPT} ]; then |
||||||
|
if [ $num_vehicles -gt 255 ]; then |
||||||
|
echo "Tried spawning $num_vehicles vehicles. The maximum number of supported vehicles is 255" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
while [ $n -lt $num_vehicles ]; do |
||||||
|
spawn_model ${PX4_SIM_MODEL} $n ${world} ${mjson} |
||||||
|
n=$(($n + 1)) |
||||||
|
done |
||||||
|
else |
||||||
|
for target in ${SCRIPT}; do |
||||||
|
target="$(echo "$target" | tr -d ' ')" #Remove spaces |
||||||
|
target_vehicle="${target%:*}" |
||||||
|
target_number="${target#*:}" |
||||||
|
|
||||||
|
if [ $n -gt 255 ]; then |
||||||
|
echo "Tried spawning $n vehicles. The maximum number of supported vehicles is 255" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
|
||||||
|
m=0 |
||||||
|
while [ $m -lt ${target_number} ]; do |
||||||
|
spawn_model ${PX4_SIM_MODEL} $n ${world} ${mjson} |
||||||
|
m=$(($m + 1)) |
||||||
|
n=$(($n + 1)) |
||||||
|
done |
||||||
|
done |
||||||
|
fi |
||||||
|
echo "Starting gazebo client" |
||||||
|
gzclient |
||||||
|
fi |
Loading…
Reference in new issue