From a4709f24269753c7189d54377344be3bf154ec15 Mon Sep 17 00:00:00 2001 From: M1chaelM Date: Thu, 22 Jun 2023 16:11:19 -0400 Subject: [PATCH 1/7] working except gz fuel problems --- run_trial.bash | 15 ++++++++++----- vrx_server/build_image.bash | 2 +- vrx_server/vrx-server/gz_utils.sh | 4 ++-- vrx_server/vrx-server/run_vrx_trial.sh | 14 +++++++------- 4 files changed, 20 insertions(+), 15 deletions(-) diff --git a/run_trial.bash b/run_trial.bash index 606a747..1ecdfaa 100755 --- a/run_trial.bash +++ b/run_trial.bash @@ -24,7 +24,8 @@ usage() } # Parse arguments -RUNTIME="runc" +# TODO: nvidia runtime by default; runtime may be obsolete +RUNTIME="nvidia" nvidia_arg="" image_nvidia="" @@ -65,7 +66,8 @@ fi # Constants for containers SERVER_CONTAINER_NAME=vrx-server-system -ROS_DISTRO=noetic +ROS_DISTRO=humble +SERVER_IMG="vrx-server-${ROS_DISTRO}${image_nvidia}:latest" LOG_DIR=/vrx/logs NETWORK=vrx-network NETWORK_SUBNET="172.16.0.10/16" # subnet mask allows communication between IP addresses with 172.16.xx.xx (xx = any) @@ -97,7 +99,7 @@ chmod 777 ${HOST_LOG_DIR} echo -e "${GREEN}Done.${NOCOLOR}\n" # Find wamv urdf and task world files -echo "Looking for generated files" +echo "Looking for WAM-V urdf file (generated)" TEAM_GENERATED_DIR=${DIR}/generated/team_generated/${TEAM_NAME} if [ -f "${TEAM_GENERATED_DIR}/${TEAM_NAME}.urdf" ]; then echo "Successfully found: ${TEAM_GENERATED_DIR}/${TEAM_NAME}.urdf" @@ -106,9 +108,11 @@ else echo -e "${RED}Err: ${TEAM_GENERATED_DIR}/${TEAM_NAME}.urdf not found."; exit 1; fi +echo "Looking for task sdf file (generated/copied)" COMP_GENERATED_DIR=${DIR}/generated/task_generated/${TASK_NAME} if [ -f "${COMP_GENERATED_DIR}/worlds/${TASK_NAME}${TRIAL_NUM}.sdf" ]; then echo "Successfully found: ${COMP_GENERATED_DIR}/worlds/${TASK_NAME}${TRIAL_NUM}.sdf" + echo -e "${GREEN}Done.${NOCOLOR}\n" else echo -e "${RED}Err: ${COMP_GENERATED_DIR}/worlds/${TASK_NAME}${TRIAL_NUM}.sdf not found."; exit 1; fi @@ -142,11 +146,11 @@ echo "---------------------------------" # simulation doesn't start too early, but may have issues if competitior # container waiting for ROS master and has error before server is created. # Run Gazebo simulation server container -SERVER_CMD="/run_vrx_trial.sh /team_generated/${TEAM_NAME}.urdf /task_generated/worlds/${TASK_NAME}${TRIAL_NUM}.world ${LOG_DIR}" -SERVER_IMG="vrx-server-${ROS_DISTRO}${image_nvidia}:latest" +SERVER_CMD="/run_vrx_trial.sh /team_generated/${TEAM_NAME}.urdf /task_generated/worlds/${TASK_NAME}${TRIAL_NUM} ${LOG_DIR}" ${DIR}/vrx_server/run_container.bash $nvidia_arg ${SERVER_CONTAINER_NAME} $SERVER_IMG \ "--net ${NETWORK} \ --ip ${SERVER_ROS_IP} \ + --gpus all \ -v ${TEAM_GENERATED_DIR}:/team_generated \ -v ${COMP_GENERATED_DIR}:/task_generated \ -v ${HOST_LOG_DIR}:${LOG_DIR} \ @@ -172,6 +176,7 @@ docker run \ --env ROS_MASTER_URI=${ROS_MASTER_URI} \ --env ROS_IP=${COMPETITOR_ROS_IP} \ --ip ${COMPETITOR_ROS_IP} \ + --gpus all \ --privileged \ --runtime=$RUNTIME \ ${DOCKERHUB_IMAGE} & diff --git a/vrx_server/build_image.bash b/vrx_server/build_image.bash index b88ef9b..c033aef 100755 --- a/vrx_server/build_image.bash +++ b/vrx_server/build_image.bash @@ -21,7 +21,7 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Parse arguments local_base_name="vrx-local-base" -image_name="vrx-server-jammy" +image_name="vrx-server-humble" DOCKER_ARGS="--build-arg BASEIMG=$local_base_name" # DOCKER_ARGS="$DOCKER_ARGS --no-cache" diff --git a/vrx_server/vrx-server/gz_utils.sh b/vrx_server/vrx-server/gz_utils.sh index 10330f8..83e94d9 100644 --- a/vrx_server/vrx-server/gz_utils.sh +++ b/vrx_server/vrx-server/gz_utils.sh @@ -4,7 +4,7 @@ function is_gzserver_running() { - if pgrep gzserver > /dev/null; then + if pgrep -f "gz sim server" > /dev/null; then true else false @@ -14,7 +14,7 @@ function is_gzserver_running() # Check if gzclient is running function is_gzclient_running() { - if pgrep gzclient > /dev/null; then + if pgrep "gz sim client" > /dev/null; then true else false diff --git a/vrx_server/vrx-server/run_vrx_trial.sh b/vrx_server/vrx-server/run_vrx_trial.sh index 54797d8..27dabce 100755 --- a/vrx_server/vrx-server/run_vrx_trial.sh +++ b/vrx_server/vrx-server/run_vrx_trial.sh @@ -40,7 +40,7 @@ echo "Starting vrx trial..." # Run the trial. # Note: Increase record period to have faster playback. Decrease record period for slower playback RECORD_PERIOD="0.01" -roslaunch vrx_gazebo vrx.launch gui:=false urdf:=$WAMV_URDF world:=$TRIAL_WORLD extra_gazebo_args:="-r --record_period ${RECORD_PERIOD} --record_path $HOME/.gazebo" verbose:=true non_competition_mode:=false > ~/verbose_output.txt 2>&1 & +ros2 launch vrx_gz competition.launch.py gui:=false urdf:=$WAMV_URDF world:=$TRIAL_WORLD extra_gazebo_args:="-r --record_period ${RECORD_PERIOD} --record_path $HOME/.gazebo" verbose:=true non_competition_mode:=false > ~/verbose_output.txt 2>&1 & roslaunch_pid=$! wait_until_gzserver_is_up echo -e "${GREEN}OK${NOCOLOR}\n" @@ -48,21 +48,21 @@ echo -e "${GREEN}OK${NOCOLOR}\n" # Store topics in rosbag # July 24, 2019 only record task info to save space echo "Starting rosbag recording..." -rosbag record -O ~/vrx_rostopics.bag /vrx/task/info & +ros2 bag record -o ~/vrx_rostopics.bag /vrx/task/info & echo -e "${GREEN}OK${NOCOLOR}\n" # Run simulation until shutdown echo "Run simulation until gzserver is shutdown by scoring plugin" wait_until_gzserver_is_down -echo "gzserver shut down" +echo "gz sim server shut down" echo -e "${GREEN}OK${NOCOLOR}\n" # Kill rosnodes -echo "Killing rosnodes" -rosnode kill --all -sleep 1s +#echo "Killing rosnodes" +#rosnode kill --all +#sleep 1s # Kill roslaunch -echo "Killing roslaunch pid: ${roslaunch_pid}" +echo "Killing ros2 launch pid: ${roslaunch_pid}" kill -INT ${roslaunch_pid} echo -e "${GREEN}OK${NOCOLOR}\n" From 841e1d7a18cd9a634246779b87faf3198cb4a923 Mon Sep 17 00:00:00 2001 From: M1chaelM Date: Thu, 22 Jun 2023 18:09:00 -0400 Subject: [PATCH 2/7] update get_trial_score for new /vrx/task/info message --- run_trial.bash | 9 +++++---- utils/get_trial_score.py | 43 +++++++++++++++++++++++++++------------- 2 files changed, 34 insertions(+), 18 deletions(-) diff --git a/run_trial.bash b/run_trial.bash index 1ecdfaa..e406218 100755 --- a/run_trial.bash +++ b/run_trial.bash @@ -66,6 +66,7 @@ fi # Constants for containers SERVER_CONTAINER_NAME=vrx-server-system +SERVER_USER=developer ROS_DISTRO=humble SERVER_IMG="vrx-server-${ROS_DISTRO}${image_nvidia}:latest" LOG_DIR=/vrx/logs @@ -188,10 +189,10 @@ echo "---------------------------------" # Copy the ROS log files from the server's container. echo "Copying ROS log files from server container..." -docker cp --follow-link ${SERVER_CONTAINER_NAME}:/home/$USER/.ros/log/latest $HOST_LOG_DIR/ros-server-latest -docker cp --follow-link ${SERVER_CONTAINER_NAME}:/home/$USER/.gazebo/ $HOST_LOG_DIR/gazebo-server -docker cp --follow-link ${SERVER_CONTAINER_NAME}:/home/$USER/vrx_rostopics.bag $HOST_LOG_DIR/ -docker cp --follow-link ${SERVER_CONTAINER_NAME}:/home/$USER/verbose_output.txt $HOST_LOG_DIR/ +#docker cp --follow-link ${SERVER_CONTAINER_NAME}:/home/$SERVER_USER/.ros/log/latest $HOST_LOG_DIR/ros-server-latest +docker cp --follow-link ${SERVER_CONTAINER_NAME}:/home/$SERVER_USER/.gz/ $HOST_LOG_DIR/gz-server +docker cp --follow-link ${SERVER_CONTAINER_NAME}:/home/$SERVER_USER/vrx_rostopics.bag $HOST_LOG_DIR/ +docker cp --follow-link ${SERVER_CONTAINER_NAME}:/home/$SERVER_USER/verbose_output.txt $HOST_LOG_DIR/ echo -e "${GREEN}OK${NOCOLOR}\n" diff --git a/utils/get_trial_score.py b/utils/get_trial_score.py index 5b9afee..a2782b4 100755 --- a/utils/get_trial_score.py +++ b/utils/get_trial_score.py @@ -1,11 +1,13 @@ -# get_trial_score.py: A Python script that gets the last message of a trial's rosbag file, +# get_trial_score.py: A Python script that gets the last message of a trial's ros2bag file, # then records the final trial score in a text file # # eg. python get_trial_score.py import os -import rosbag +import rosbag2_py import sys +from rclpy.serialization import deserialize_message +from rosidl_runtime_py.utilities import get_message # Get arguments team_name = sys.argv[1] @@ -17,25 +19,38 @@ trial_directory = dir_path + '/../generated/logs/' + team_name + '/' + task_name + '/' + trial_number # Open ros bag -bag_name = trial_directory + '/vrx_rostopics.bag' -bag = rosbag.Bag(bag_name) +bag_path = trial_directory + '/vrx_rostopics.bag/vrx_rostopics.bag_0.db3' +storage_options = rosbag2_py.StorageOptions(uri=bag_path, storage_id='sqlite3') +converter_options = rosbag2_py.ConverterOptions(input_serialization_format='cdr', + output_serialization_format='cdr') + +reader = rosbag2_py.SequentialReader() +reader.open(storage_options, converter_options) + +topic_types = reader.get_all_topics_and_types() + +type_map = {topic_types[i].name: topic_types[i].type for i in range(len(topic_types))} + +storage_filter = rosbag2_py.StorageFilter(topics=['/vrx/task/info']) +reader.set_filter(storage_filter) # Get last message last_topic = None -last_msg = None +last_msg_data = None last_t = None -for topic, msg, t in bag.read_messages(topics=['/vrx/task/info']): - last_topic = topic - last_msg = msg - last_t = t +while reader.has_next(): + (last_topic, last_msg_data, last_t) = reader.read_next() +msg_type = get_message(type_map[last_topic]) +last_msg = deserialize_message(last_msg_data, msg_type) +score = None +for field in last_msg.params: + if field.name == "score": + score = field.value.double_value # Write trial score to file trial_score_name = trial_directory + "/trial_score.txt" -f = open(trial_score_name, 'w+') -f.write("{}".format(last_msg.score)) +with open(trial_score_name, 'w+') as f: + f.write("{}".format(score)) print("Successfully recorded trial score in {}".format(trial_score_name)) -f.close() -bag.close() - From 7e211b2e5566fdab2784ab0c67b23dcfca633b74 Mon Sep 17 00:00:00 2001 From: M1chaelM Date: Thu, 22 Jun 2023 18:51:28 -0400 Subject: [PATCH 3/7] removing obsolete nvidia arguments / variables --- replay_trial.bash | 14 +++----------- run_trial.bash | 34 +++------------------------------- vrx_server/run_container.bash | 24 +----------------------- 3 files changed, 7 insertions(+), 65 deletions(-) diff --git a/replay_trial.bash b/replay_trial.bash index a3b9442..4ca3586 100755 --- a/replay_trial.bash +++ b/replay_trial.bash @@ -20,7 +20,7 @@ NOCOLOR='\033[0m' # Define usage function. usage() { - echo "Usage: $0 [-n --nvidia] [--keep-docker] [--manual-play] [--keep-gz] " + echo "Usage: $0 [--keep-docker] [--manual-play] [--keep-gz] " echo "--keep-docker: Keep Gazebo window open and Docker container running after playback ends." echo " By default, everything is terminated automatically." echo "--manual-play: Do not automatically start playback. Wait for user to click in GUI." @@ -31,8 +31,6 @@ usage() } # Parse arguments -nvidia_arg="" -image_nvidia="" keep_docker=1 # Args to pass to script internal to Docker container @@ -45,12 +43,6 @@ do key="$1" case $key in - -n|--nvidia) - nvidia_arg="-n" - image_nvidia="-nvidia" - shift - ;; - --keep-docker) keep_docker=1 shift @@ -166,8 +158,8 @@ y=$y" > ${HOST_GZ_GUI_CONFIG_DIR}/gui.ini # Run Gazebo simulation server container SERVER_CMD="/play_vrx_log.sh ${LOG_FILE} ${OUTPUT} ${manual_play} ${keep_gz}" -SERVER_IMG="vrx-server-${ROS_DISTRO}${image_nvidia}:latest" -${DIR}/vrx_server/run_container.bash $nvidia_arg ${SERVER_CONTAINER_NAME} $SERVER_IMG \ +SERVER_IMG="vrx-server-${ROS_DISTRO}:latest" +${DIR}/vrx_server/run_container.bash ${SERVER_CONTAINER_NAME} $SERVER_IMG \ "--net ${NETWORK} \ --ip ${SERVER_ROS_IP} \ -v ${HOST_LOG_DIR}:${LOG_DIR} \ diff --git a/run_trial.bash b/run_trial.bash index e406218..bb1cd9d 100755 --- a/run_trial.bash +++ b/run_trial.bash @@ -19,37 +19,10 @@ NOCOLOR='\033[0m' # Define usage function. usage() { - echo "Usage: $0 [-n --nvidia] " + echo "Usage: $0 " exit 1 } -# Parse arguments -# TODO: nvidia runtime by default; runtime may be obsolete -RUNTIME="nvidia" -nvidia_arg="" -image_nvidia="" - -POSITIONAL=() -while [[ $# -gt 0 ]] -do - key="$1" - - case $key in - -n|--nvidia) - RUNTIME="nvidia" - nvidia_arg="-n" - image_nvidia="-nvidia" - shift - ;; - *) # unknown option - POSITIONAL+=("$1") - shift - ;; - esac -done - -set -- "${POSITIONAL[@]}" - # Call usage() function if arguments not supplied. [[ $# -ne 3 ]] && usage @@ -68,7 +41,7 @@ fi SERVER_CONTAINER_NAME=vrx-server-system SERVER_USER=developer ROS_DISTRO=humble -SERVER_IMG="vrx-server-${ROS_DISTRO}${image_nvidia}:latest" +SERVER_IMG="vrx-server-${ROS_DISTRO}:latest" LOG_DIR=/vrx/logs NETWORK=vrx-network NETWORK_SUBNET="172.16.0.10/16" # subnet mask allows communication between IP addresses with 172.16.xx.xx (xx = any) @@ -148,7 +121,7 @@ echo "---------------------------------" # container waiting for ROS master and has error before server is created. # Run Gazebo simulation server container SERVER_CMD="/run_vrx_trial.sh /team_generated/${TEAM_NAME}.urdf /task_generated/worlds/${TASK_NAME}${TRIAL_NUM} ${LOG_DIR}" -${DIR}/vrx_server/run_container.bash $nvidia_arg ${SERVER_CONTAINER_NAME} $SERVER_IMG \ +${DIR}/vrx_server/run_container.bash ${SERVER_CONTAINER_NAME} $SERVER_IMG \ "--net ${NETWORK} \ --ip ${SERVER_ROS_IP} \ --gpus all \ @@ -179,7 +152,6 @@ docker run \ --ip ${COMPETITOR_ROS_IP} \ --gpus all \ --privileged \ - --runtime=$RUNTIME \ ${DOCKERHUB_IMAGE} & # Run competition until server is ended diff --git a/vrx_server/run_container.bash b/vrx_server/run_container.bash index 77b8a66..9a2b8da 100755 --- a/vrx_server/run_container.bash +++ b/vrx_server/run_container.bash @@ -22,32 +22,10 @@ set -x # Parse arguments -RUNTIME="runc" - -POSITIONAL=() -while [[ $# -gt 0 ]] -do - key="$1" - - case $key in - -n|--nvidia) - RUNTIME="nvidia" - shift - ;; - *) # unknown option - POSITIONAL+=("$1") -[ruby $(which gz) sim-1] qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found. - shift - ;; - esac -done - -set -- "${POSITIONAL[@]}" - if [[ $# -lt 2 ]] then [ruby $(which gz) sim-1] qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found. - echo "Usage: $0 [-n --nvidia] [ ]" + echo "Usage: $0 [ ]" exit 1 fi From 846017bb92260222b9a934bc16fe544d87143190 Mon Sep 17 00:00:00 2001 From: M1chaelM Date: Fri, 23 Jun 2023 15:20:08 -0400 Subject: [PATCH 4/7] remove redundant argument --- run_trial.bash | 1 - 1 file changed, 1 deletion(-) diff --git a/run_trial.bash b/run_trial.bash index bb1cd9d..4456694 100755 --- a/run_trial.bash +++ b/run_trial.bash @@ -124,7 +124,6 @@ SERVER_CMD="/run_vrx_trial.sh /team_generated/${TEAM_NAME}.urdf /task_generated/ ${DIR}/vrx_server/run_container.bash ${SERVER_CONTAINER_NAME} $SERVER_IMG \ "--net ${NETWORK} \ --ip ${SERVER_ROS_IP} \ - --gpus all \ -v ${TEAM_GENERATED_DIR}:/team_generated \ -v ${COMP_GENERATED_DIR}:/task_generated \ -v ${HOST_LOG_DIR}:${LOG_DIR} \ From f5b964fbc8a797dd3eecf0945232922586b40b91 Mon Sep 17 00:00:00 2001 From: M1chaelM Date: Fri, 23 Jun 2023 15:33:40 -0400 Subject: [PATCH 5/7] workaround issue 680 in VRX --- run_trial.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_trial.bash b/run_trial.bash index 4456694..7595872 100755 --- a/run_trial.bash +++ b/run_trial.bash @@ -120,7 +120,7 @@ echo "---------------------------------" # simulation doesn't start too early, but may have issues if competitior # container waiting for ROS master and has error before server is created. # Run Gazebo simulation server container -SERVER_CMD="/run_vrx_trial.sh /team_generated/${TEAM_NAME}.urdf /task_generated/worlds/${TASK_NAME}${TRIAL_NUM} ${LOG_DIR}" +SERVER_CMD="/run_vrx_trial.sh /team_generated/${TEAM_NAME}.urdf practice_2023_${TASK_NAME}${TRIAL_NUM}_task ${LOG_DIR}" ${DIR}/vrx_server/run_container.bash ${SERVER_CONTAINER_NAME} $SERVER_IMG \ "--net ${NETWORK} \ --ip ${SERVER_ROS_IP} \ From 62e313fb760eb9ed572a877c93a840acd5f809e7 Mon Sep 17 00:00:00 2001 From: M1chaelM Date: Sun, 25 Jun 2023 13:23:29 -0400 Subject: [PATCH 6/7] remove workaround --- run_trial.bash | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/run_trial.bash b/run_trial.bash index 7595872..4456694 100755 --- a/run_trial.bash +++ b/run_trial.bash @@ -120,7 +120,7 @@ echo "---------------------------------" # simulation doesn't start too early, but may have issues if competitior # container waiting for ROS master and has error before server is created. # Run Gazebo simulation server container -SERVER_CMD="/run_vrx_trial.sh /team_generated/${TEAM_NAME}.urdf practice_2023_${TASK_NAME}${TRIAL_NUM}_task ${LOG_DIR}" +SERVER_CMD="/run_vrx_trial.sh /team_generated/${TEAM_NAME}.urdf /task_generated/worlds/${TASK_NAME}${TRIAL_NUM} ${LOG_DIR}" ${DIR}/vrx_server/run_container.bash ${SERVER_CONTAINER_NAME} $SERVER_IMG \ "--net ${NETWORK} \ --ip ${SERVER_ROS_IP} \ From c29162ccfaf67b37ea7933999c0dcadcbcd7601f Mon Sep 17 00:00:00 2001 From: M1chaelM Date: Mon, 26 Jun 2023 09:09:51 -0400 Subject: [PATCH 7/7] downloading models during image build --- vrx_server/vrx-server/Dockerfile | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/vrx_server/vrx-server/Dockerfile b/vrx_server/vrx-server/Dockerfile index d94b8c9..4ccce99 100644 --- a/vrx_server/vrx-server/Dockerfile +++ b/vrx_server/vrx-server/Dockerfile @@ -19,6 +19,22 @@ RUN /bin/sh -c 'echo ". /opt/ros/${ROSDIST}/setup.bash" >> ~/.bashrc' \ && /bin/sh -c 'echo ". ~/vrx_ws/install/setup.sh" >> ~/.bashrc' ## END OF SECTION BASED ON vrx/docker/Dockerfile +# Cache fuel resources +RUN /bin/bash -c 'gz fuel download -u https://fuel.gazebosim.org/1.0/openrobotics/models/sydney_regatta \ + && gz fuel download -u https://fuel.gazebosim.org/1.0/openrobotics/models/post \ + && gz fuel download -u https://fuel.gazebosim.org/1.0/openrobotics/models/ground_station \ + && gz fuel download -u https://fuel.gazebosim.org/1.0/openrobotics/models/antenna \ + && gz fuel download -u https://fuel.gazebosim.org/1.0/openrobotics/models/mb_marker_buoy_red \ + && gz fuel download -u https://fuel.gazebosim.org/1.0/openrobotics/models/mb_marker_buoy_black \ + && gz fuel download -u https://fuel.gazebosim.org/1.0/openrobotics/models/mb_marker_buoy_green \ + && gz fuel download -u https://fuel.gazebosim.org/1.0/openrobotics/models/mb_marker_buoy_white \ + && gz fuel download -u https://fuel.gazebosim.org/1.0/openrobotics/models/mb_round_buoy_orange \ + && gz fuel download -u https://fuel.gazebosim.org/1.0/openrobotics/models/mb_round_buoy_black \ + && gz fuel download -u https://fuel.gazebosim.org/1.0/openrobotics/models/platypus \ + && gz fuel download -u https://fuel.gazebosim.org/1.0/openrobotics/models/crocodile \ + && gz fuel download -u https://fuel.gazebosim.org/1.0/openrobotics/models/turtle \ + && gz fuel download -u https://fuel.gazebosim.org/1.0/openrobotics/models/wam-v' + # Expose port used to communiate with gzserver EXPOSE 11345