Skip to content

Commit

Permalink
Replace Makefile with shell scripts for curiosity rover demo
Browse files Browse the repository at this point in the history
Related to space-ros/space-ros#178
 - Revert the purpose of makefiles
 - Add a new shell script for building and running the demos
 - Update README.md for shell script usage
  • Loading branch information
franklinselva committed Aug 28, 2024
1 parent bd5e472 commit 95acc36
Show file tree
Hide file tree
Showing 4 changed files with 185 additions and 65 deletions.
2 changes: 1 addition & 1 deletion canadarm2/README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# Curiosity Rover - Demo
# SSRMS CanadArm2 - Demo

This is a simple demo of controlling the canadarm using spaceROS.

Expand Down
60 changes: 0 additions & 60 deletions curiosity_rover/Makefile

This file was deleted.

28 changes: 24 additions & 4 deletions curiosity_rover/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
160 changes: 160 additions & 0 deletions curiosity_rover/build.sh
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 95acc36

Please sign in to comment.