Browse Source

Upload files to ''

allen 2 months ago
parent
commit
e32486d8ba
1 changed files with 177 additions and 0 deletions
  1. 177 0
      sitl_run.sh

+ 177 - 0
sitl_run.sh

@@ -0,0 +1,177 @@
+#!/usr/bin/env bash
+set -e
+
+if [ "$#" -lt 6 ]; then
+	echo usage: sitl_run.sh sitl_bin debugger model world src_path build_path
+	exit 1
+fi
+
+if [[ -n "$DONT_RUN" ]]; then
+	echo "Not running simulation (DONT_RUN is set)."
+	exit 0
+fi
+
+sitl_bin="$1"
+debugger="$2"
+model="$3"
+world="$4"
+src_path="$5"
+build_path="$6"
+
+echo SITL ARGS
+
+echo sitl_bin: $sitl_bin
+echo debugger: $debugger
+echo model: $model
+echo world: $world
+echo src_path: $src_path
+echo build_path: $build_path
+
+rootfs="$build_path/rootfs" # this is the working directory
+mkdir -p "$rootfs"
+
+# To disable user input
+if [[ -n "$NO_PXH" ]]; then
+	no_pxh=-d
+else
+	no_pxh=""
+fi
+
+# To disable user input
+if [[ -n "$VERBOSE_SIM" ]]; then
+	verbose="--verbose"
+else
+	verbose=""
+fi
+
+# Disable follow mode
+if [[ "$PX4_NO_FOLLOW_MODE" != "1" ]]; then
+    follow_mode="--gui-client-plugin libgazebo_user_camera_plugin.so"
+else
+    follow_mode=""
+fi
+
+# To use gazebo_ros ROS2 plugins
+if [[ -n "$ROS_VERSION" ]] && [ "$ROS_VERSION" == "2" ]; then
+	ros_args="-s libgazebo_ros_init.so -s libgazebo_ros_factory.so"
+else
+	ros_args="-s libgazebo_ros_api_plugin.so"
+fi
+
+if [ "$model" == "" ] || [ "$model" == "none" ]; then
+	echo "empty model, setting iris as default"
+	model="iris"
+fi
+
+# kill process names that might stil
+# be running from last time
+pkill -x gazebo || true
+
+export PX4_SIM_MODEL=gazebo-classic_${model}
+export PX4_SIM_WORLD=${world}
+
+SIM_PID=0
+
+if [ -x "$(command -v gazebo)" ]; then
+	# Get the model name
+	model_name="${model}"
+
+	# Set the plugin path so Gazebo finds our model and sim
+	source "$src_path/Tools/simulation/gazebo-classic/setup_gazebo.bash" "${src_path}" "${build_path}"
+	export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:${src_path}
+	export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:${src_path}/Tools/simulation/gazebo-classic/sitl_gazebo-classic
+	echo "ll:$ROS_PACKAGE_PATH"
+	if [ -z $PX4_SITL_WORLD ]; then
+		#Spawn predefined world
+		if [ "$world" == "none" ]; then
+			if [ -f ${src_path}/Tools/simulation/gazebo-classic/sitl_gazebo-classic/worlds/${model}.world ]; then
+				echo "empty world, default world ${model}.world for model found"
+				world_path="${src_path}/Tools/simulation/gazebo-classic/sitl_gazebo-classic/worlds/${model}.world"
+			else
+				echo "empty world, setting empty.world as default"
+				world_path="${src_path}/Tools/simulation/gazebo-classic/sitl_gazebo-classic/worlds/test.world"
+			fi
+		else
+			#Spawn empty world if world with model name doesn't exist
+			world_path="${src_path}/Tools/simulation/gazebo-classic/sitl_gazebo-classic/worlds/${world}.world"
+		fi
+	else
+		if [ -f ${src_path}/Tools/simulation/gazebo-classic/sitl_gazebo-classic/worlds/${PX4_SITL_WORLD}.world ]; then
+			# Spawn world by name if exists in the worlds directory from environment variable
+			world_path="${src_path}/Tools/simulation/gazebo-classic/sitl_gazebo-classic/worlds/${PX4_SITL_WORLD}.world"
+		else
+			# Spawn world from environment variable with absolute path
+			world_path="$PX4_SITL_WORLD"
+		fi
+	fi
+	gzserver $verbose $world_path $ros_args &
+	SIM_PID=$!
+
+	# Check all paths in ${GAZEBO_MODEL_PATH} for specified model
+	IFS_bak=$IFS
+	IFS=":"
+	for possible_model_path in ${GAZEBO_MODEL_PATH}; do
+		if [ -z $possible_model_path ]; then
+			continue
+		fi
+		# trim \r from path
+		possible_model_path=$(echo $possible_model_path | tr -d '\r')
+		if test -f "${possible_model_path}/${model}/${model}.sdf" ; then
+			modelpath=$possible_model_path
+			break
+		fi
+	done
+	IFS=$IFS_bak
+	if [ -z $modelpath ]; then
+		echo "Model ${model} not found in model path: ${GAZEBO_MODEL_PATH}"
+		exit 1
+	else
+		echo "Using: ${modelpath}/${model}/${model}.sdf"
+	fi
+	while gz model --verbose --spawn-file="${modelpath}/${model}/${model_name}.sdf" --model-name=${model} -x 300 -y -400 -z 0 -R 0 -P 0 -Y 1.57 2>&1 | grep -q "An instance of Gazebo is not running."; do
+		echo "gzserver not ready yet, trying again!"
+		sleep 1
+	done
+
+	if [[ -n "$HEADLESS" ]]; then
+		echo "not running gazebo gui"
+	else
+		# gzserver needs to be running to avoid a race. Since the launch
+		# is putting it into the background we need to avoid it by backing off
+		sleep 3
+		nice -n 20 gzclient --verbose $follow_mode &
+		GUI_PID=$!
+	fi
+else
+	echo "You need to have gazebo simulator installed!"
+	exit 1
+fi
+
+pushd "$rootfs" >/dev/null
+
+# Do not exit on failure now from here on because we want the complete cleanup
+set +e
+
+sitl_command="\"$sitl_bin\" $no_pxh \"$build_path\"/etc"
+
+echo SITL COMMAND: $sitl_command
+
+if [ "$debugger" == "lldb" ]; then
+	eval lldb -- $sitl_command
+elif [ "$debugger" == "gdb" ]; then
+	eval gdb --args $sitl_command
+elif [ "$debugger" == "valgrind" ]; then
+	eval valgrind --track-origins=yes --leak-check=full -v $sitl_command
+elif [ "$debugger" == "callgrind" ]; then
+	eval valgrind --tool=callgrind -v $sitl_command
+else
+	eval $sitl_command
+fi
+
+popd >/dev/null
+
+
+kill -9 $SIM_PID
+if [[ ! -n "$HEADLESS" ]]; then
+	kill -9 $GUI_PID
+fi