This project is the final project of the Udacity Robotics Software Engineer Nanodegree. For the project, I created several ROS packages supported by ROS libraries to simulate a home service robot performing pick up and drop off operations in a home-style environment.
The project was developed on Ubuntu 16.04 LTS with ROS Kinetic, Gazebo and catkin installed. Other dependencies can be installed through rosdep after the supporting packages have been cloned from Github.
First, there are four supporting packages to install for the project.
rosdep DependenciesAfter cloning the supporting package in catkin_ws/src, run rosdep on each of the package names to install their dependencies.
rosdep -i install gmapping
rosdep -i install turtlebot
If these commands do not work, or the project cannot be compiled afterwards, try to use apt-get to install these packages: ros-kinetic-turtlebot ros-kinetic-openslam-gmapping.
Use catkin to build the packages from source. From catkin_ws, run:
catkin_make; source devel/setup.bash
to build the workspace packages and add them to the paths of ROS.
After the above steps, you should be able to run each of the shell scripts in the ShellScripts directory.
The project repository contains source code of a catkin workspace and some map and world files for the simulation of the home service robot. Besides the supporting ROS packages described in the previous section, there are also three packages with custom ROS node in the src directory:
wall_follower uses a modified script provided by Udacity to instruct the robot to traverse around the room while following the walls using laser scan data.pick_objects is a node that publish static goals to the goal topic and thus directs the robot through the navigation packages.add_markers contains two nodes that publishes markers in RViz. The add_constant_markers_node publishes markers at the goal positions with constant time intervals, while the add_markers_node publishes the markers in response to the robot’s movements in the environment. Note how the second node uses the MarkerAdder class that inherits from the CustomMarkerAdder class used in the first node!Besides the packages, the repository also contains supporting files:
RVizConfig contains the config file for RViz that extends the RViz launcher’s config file from turtlebot_interactions to include markers.World includes a house model built in Gazebo’s Building Editor, and a map produced from the robot performing SLAM in the house.ShellScripts contains all the composite scripts to run each task of the project, and also supporting XML launch files amcl_demo.launch, gmapping_demo.launch and view_navigation.launch with customized parameters.The robot can perform a few tasks with the shell scripts.
The test_slam.sh script simply launches Gazebo with the home environment, places a turtlebot in it and launches the slam_gmapping nodes. The user can move the robot in the environment using keyboard as in turtlebot_teleop. Run this script to verify that the packages and dependencies have been installed correctly.
The wall_follower.sh script differs from the test_slam.sh script in that the robot would be able to move autonomously around the room without and user input using the wall_follower node.
Map produced by performing SLAM while following walls:
The tesst_navigation.sh script builds on top of the test_slam.sh script and enables the robot to reach a goal pose designated by the user in RViz through the amcl package.
Robot planning to reach the goal in RViz:
The pick_objects.sh script assigns two goal poses to the robot consecutively as the robot traverses through the environment to simulate picking up objects from a location and dropping them off to another location.
Robot reaching the dropoff location:
The add_marker.sh script adds markers to the goal positions at constant times programmatically as the robot moves through the environment.
The final script home_service.sh adds goal markers only when the robot is reaching the pick up and drop off locations by listening to the odometry topic.
Robot reaching the dropoff location while showing the marker:
