diff --git a/canadarm2/README.md b/canadarm2/README.md index 7c98c4d4..d1f3416b 100644 --- a/canadarm2/README.md +++ b/canadarm2/README.md @@ -1,4 +1,4 @@ -# Curiosity Rover - Demo +# SSRMS CanadArm2 - Demo This is a simple demo of controlling the canadarm using spaceROS. diff --git a/curiosity_rover/Makefile b/curiosity_rover/Makefile deleted file mode 100644 index a9648612..00000000 --- a/curiosity_rover/Makefile +++ /dev/null @@ -1,60 +0,0 @@ -# Define variables -DOCKER_IMAGE = osrf/space-ros:curiosity_demo -WORKSPACE = ${HOME}/curiosity_ws -LOCAL_WORKSPACE = $(shell pwd) -SHELL := /bin/bash -XTERM_CONFIG = -bg black -fg white -fa 'Monospace' -fs 11 - -# Help target to describe each target -.PHONY: help -help: - @echo "Curiosity Rover Makefile" - @echo " make build - Build the Docker image and the Gazebo workspace locally" - @echo " make build-docker - Build the Docker image" - @echo " make build-gazebo - Build the Gazebo workspace locally" - @echo " make run-gazebo - Run the Curiosity Gazebo simulation locally" - @echo " make run-demo - Run the Curiosity demo within Docker" - @echo " make clean - Clean the local workspace" - @echo " make all - Build and run everything" - -# Build all -.PHONY: build -build: build-docker build-gazebo - -# Build the Docker image -.PHONY: build-docker -build-docker: - docker build -t $(DOCKER_IMAGE) . - -# Run the Curiosity Gazebo simulation locally -.PHONY: run-gazebo -run-gazebo: - xterm $(XTERM_CONFIG) -T 'Curiosity Gazebo' -e 'source /opt/ros/${ROS_DISTRO}/setup.bash \ - && source $(LOCAL_WORKSPACE)/install/setup.bash \ - && ros2 launch curiosity_gazebo curiosity_gazebo.launch.py' & - -# Build the Gazebo workspace locally -.PHONY: build-gazebo -build-gazebo: - @source /opt/ros/${ROS_DISTRO}/setup.bash && \ - rosdep install --from-paths curiosity_gazebo --ignore-src -r -y && \ - rosdep install --from-paths curiosity_description --ignore-src -r -y && \ - colcon build --symlink-install --base-paths $(LOCAL_WORKSPACE) --install-base $(LOCAL_WORKSPACE)/install \ - --cmake-args -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ - --packages-select curiosity_description curiosity_gazebo - -# Run the Curiosity demo within Docker -.PHONY: run-docker -run-docker: - xterm $(XTERM_CONFIG) -T 'Curiosity Demo' -e "docker run -it --rm \ - -e RMW_IMPLEMENTATION=rmw_cyclonedds_cpp \ - $(DOCKER_IMAGE) \ - bash -c 'source ~/.bashrc && ros2 launch curiosity_rover_demo mars_rover.launch.py'" & - -.PHONY: clean -clean: - rm -rf $(LOCAL_WORKSPACE)/install $(LOCAL_WORKSPACE)/log $(LOCAL_WORKSPACE)/build - -# Build and run everything -.PHONY: run -run: build run-gazebo run-docker diff --git a/curiosity_rover/README.md b/curiosity_rover/README.md index 97c13dee..59e51054 100644 --- a/curiosity_rover/README.md +++ b/curiosity_rover/README.md @@ -24,13 +24,33 @@ To start the demo, there are few dependencies that need to be installed. The fol ```bash cd curiosity_rover ``` -3. To build and run the demo, we use `Makefile`. Run the following command to build the docker image and run the container. +3. To build and run the demo, we use `./build.sh`. There are different subcommands to build and run the demo. You can see the list of available commands using the following command. ```bash # To see the list of available commands - make help + ./build.sh help + ``` +4. To list the avaiable demos for the canadarm2, you can use the following command. + ```bash + # To list the available demos + ./build.sh list - # To build and run the demo - make run + # Available demos: + # - control-demo + # Available subcommands: + # - build, clean, run + ``` +5. To build the demo, you can use the following command. + ```bash + # To build all the demos for the canadarm2 + ./build.sh build + + # To build a selected demo, for example control-demo + ./build.sh build control-demo + ``` +6. To run the demo, you can use the following command. + ```bash + # To run the demo + ./build.sh run control-demo ``` This will start the demo in one terminal and gazebo in another terminal. To control the rover, we provide ros2 services for the demo. You can control the rover using the following services. diff --git a/curiosity_rover/build.sh b/curiosity_rover/build.sh new file mode 100755 index 00000000..afe28c3c --- /dev/null +++ b/curiosity_rover/build.sh @@ -0,0 +1,160 @@ +#!/bin/bash + +set -e + +# Define variables +DOCKER_IMAGE="osrf/space-ros:curiosity_demo" +LOCAL_WORKSPACE=$(pwd) +SHELL="/bin/bash" +# shellcheck disable=SC2089 +XTERM_CONFIG="-bg black -fg white -fa 'Monospace' -fs 11" + +# Define packages +SIM_PACKAGES="curiosity_description curiosity_gazebo" +CONTROL_PACKAGE="curiosity_rover_demo" +DEMO_PACKAGES="$CONTROL_PACKAGE" +AVAIABLE_DEMOS="control-demo" + +#################################################################################################### +# High-level functions +#################################################################################################### +# Help function to describe each target +help() { + echo "Curiosity Rover Bash Script" + echo " ./build.sh list - List all available demos" + echo " ./build.sh build - Build all the demo components. This will include all supported demos and the Docker image" + echo " ./build.sh clean - Clean the local workspace" + echo " ./build.sh build control-demo - Build the control demo" + echo " ./build.sh run control-demo - Build and run the Curiosity Rover demo" + exit 0 +} + +# Build all +build() { + build-control-demo +} + +# Clean the local workspace +clean() { + rm -rf "$LOCAL_WORKSPACE"/install "$LOCAL_WORKSPACE"/log "$LOCAL_WORKSPACE"/build +} + +check_docker() { + if ! command -v docker &>/dev/null; then + echo "Docker is not installed. Please install Docker to continue." + exit 1 + fi +} + +check_xterm() { + if ! command -v xterm &>/dev/null; then + echo "xterm is not installed. Please install xterm to continue." + echo "On Ubuntu, you can install xterm with 'sudo apt install xterm'." + exit 1 + fi +} + +check_ros2() { + if ! command -v ros2 &>/dev/null; then + echo "ROS 2 is not installed. Please install ROS 2 to continue." + exit 1 + fi +} + +#################################################################################################### +# Low-level functions +#################################################################################################### +# Build the Docker image +build-docker() { + docker build -t "$DOCKER_IMAGE" . +} + +# Build the Gazebo workspace locally +build-gazebo() { + # shellcheck source=/opt/ros/${ROS_DISTRO}/setup.bash + # shellcheck disable=SC1091 + source /opt/ros/"${ROS_DISTRO}"/setup.bash && + rosdep install --from-paths . -r -y --skip-keys "$DEMO_PACKAGES" && + colcon build --symlink-install --base-paths "$LOCAL_WORKSPACE" --install-base "$LOCAL_WORKSPACE"/install \ + --cmake-args -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \ + --packages-select $SIM_PACKAGES +} + +# Run the CanadArm Gazebo simulation locally +run-gazebo() { + # shellcheck disable=SC2090 + # shellcheck disable=SC2086 + xterm $XTERM_CONFIG -T 'Curiosity Rover Gazebo' -e "source /opt/ros/\${ROS_DISTRO}/setup.bash \ + && source $LOCAL_WORKSPACE/install/setup.bash \ + && ros2 launch curiosity_gazebo curiosity_gazebo.launch.py" & +} + +#################################################################################################### +# Curiosity Rover Control Demo +####################################################################################################n +# Build the control demo +build-control-demo() { + build-docker + build-gazebo +} + +# Run the control demo +run-control-demo() { + # shellcheck disable=SC2090 + # shellcheck disable=SC2086 + xterm $XTERM_CONFIG -T 'Curiosity Rover Control Demo' -e "docker run -it --rm -e RMW_IMPLEMENTATION=rmw_cyclonedds_cpp $DOCKER_IMAGE \ + bash -c 'source ~/.bashrc && ros2 launch curiosity_rover_demo mars_rover.launch.py'" & +} + +#################################################################################################### +# Main script logic to call the appropriate function +#################################################################################################### +case "$1" in +help) + help + ;; +list) + echo "Available demos:" + for demo in $AVAIABLE_DEMOS; do + echo " - $demo" + done + echo "Available subcommands:" + echo " - build, clean, run" + exit 0 + ;; +clean) + clean + ;; +build) + check_ros2 + check_docker + case "$2" in + control-demo) + build-control-demo + ;; + *) + build + ;; + esac + ;; +run) + check_xterm + check_ros2 + check_docker + + run-gazebo + case "$2" in + control-demo) + run-control-demo + ;; + *) + echo "Invalid target. 'run" "$2" "' is not a valid demo. Try './build.sh list' to see available demos." + exit 1 + ;; + esac + ;; +*) + echo "Invalid target. Use './build.sh help' to see available subcommands." + exit 1 + ;; +esac