ROS (Robot Operating System) is an open-source, meta-operating system for robots. It provides the services you would expect from an operating system. It also provides tools and libraries for obtaining, building, writing, and running code across multiple computers.
Catkin is a low-level build system macros and infrastructure for ROS. Catkin Command Line Tools.
Rosbridge provides a JSON interface to ROS, allowing any client to send JSON to publish or subscribe to ROS topics, call ROS services, and more. Rosbridge supports a variety of transport layers, including WebSockets and TCP.
Roslibjs is the core JavaScript library for interacting with ROS from the browser. It uses WebSockets to connect with rosbridge.
Rosbridge and roslibjs are released as part of the Robot Web Tools effort.
Turtlesim is a tool made for teaching ROS and ROS packages.
Docker is a tool that allows developers, sys-admins etc. to easily deploy their applications in a sandbox (called containers) to run on the host operating system i.e. Linux.
You can create ROS programs mainly in two programming languages: Python and C++. I will prefer Python in this tutorial, but pull requests are welcome for cpp.
OS: Ubuntu 18.04.3 LTS
ROS: melodic
Docker version: 19.03
Create a project directory:
cd ~
mkdir turtlesimCreate a Docker network:
docker network create turtlesimStart a ROS master:
docker container run -dit \
--net turtlesim \
--name ros-turtlesim-master \
ros:melodic-ros-base \
roscoreCreate a Catkin workspace on host computer in the project directory:
mkdir catkin_wsStart a container for Catkin:
docker run -it \
--net turtlesim \
--env ROS_HOSTNAME=ros-turtlesim-catkin \
--env ROS_MASTER_URI=http://ros-turtlesim-master:11311 \
-v ~/turtlesim/catkin_ws:/root/turtlesim/catkin_ws \
--name ros-turtlesim-catkin \
ros:melodic-ros-core \
/bin/bashCatkin setup in the container:
# Environment setup
source /opt/ros/melodic/setup.bash
# Build Catkin
cd /root/turtlesim/catkin_ws
mkdir src
catkin_make
# Devel environment setup
source devel/setup.bash
# Create package with rospy and std_msg
cd src/
catkin_create_pkg turtlesim rospy std_msgs
cd ..
# Rebuild Catkin
catkin_makeCreate node py file on the host computer in the project directory:
cd ~/turtlesim/catkin_ws/src
# TODO - set up proper user rights
sudo chmod -R 777 turtlesim
mkdir scripts
cd scripts
vim turtlesim-ros-node-client.pyEdit: turtlesim-ros-node-client.py
Note: In ROS, nodes are uniquely named. If two nodes with the same name are launched, the previous one is kicked off. The anonymous=True flag means that rospy will choose a unique name for our node so that multiple node can run simultaneously. E.g.:
rospy.init_node('name_of_the_node', anonymous=True)and the name will bename_of_the_node_<random_numbers>.
Start a container for Client node:
docker container run -it \
--net turtlesim \
--env ROS_HOSTNAME=ros-turtlesim-client \
--env ROS_MASTER_URI=http://ros-turtlesim-master:11311 \
-v ~/turtlesim/catkin_ws:/root/turtlesim/catkin_ws \
--name ros-turtlesim-client \
ros:melodic-ros-base \
/bin/bashStart the Client node:
cd /root/turtlesim/catkin_ws/src/turtlesim/scripts
python turtlesim-ros-node-client.py# Node list
# /turtlesim_client
rosnode list
# Node info
rosnode info /turtlesim_client
# List active topics
# /turtlesim_commands
rostopic list
# Echo publisher messages
# TODO - Commands from STDIN
rostopic echo /turtlesim_commandsCreate node py file on the host computer in the project directory:
cd ~/turtlesim/catkin_ws/src/turtlesim/scripts
vim turtlesim-ros-node-listener.pyEdit: turtlesim-ros-node-listener.py
Start a container for Listener node:
docker container run -it \
--net turtlesim \
--env ROS_HOSTNAME=ros-turtlesim-listener \
--env ROS_MASTER_URI=http://ros-turtlesim-master:11311 \
-v ~/turtlesim/catkin_ws:/root/turtlesim/catkin_ws \
--name ros-turtlesim-listener \
ros:melodic-ros-base \
/bin/bashStart the Listener node:
cd /root/turtlesim/catkin_ws/src/turtlesim/scripts
python turtlesim-ros-node-listener.py# List nodes
rosnode list
# List topics
rostopic list
# Show topic info
rostopic info /turtlesim_commandsIf you want check your subscriber node without a publisher, can publish manually:
# Olny one message will be published
rostopic pub -1 /turtlesim_commands std_msgs/String "data: 'Command test'"
# Publish messages continuously (5 Hz) - rate mode
rostopic pub -r 5 /turtlesim_commands std_msgs/String "data: 'Command test'"Create a ROS Melodic Bridge Docker image:
# Change directory into the repo
cd /path/to/repo/turtlesim-ros-docker-js/ros-melodic-bridge
# Build image from Dockerfile
docker build -t ros-melodic-bridge .
# List images
docker imagesStart a container for Bridge node:
docker container run -it \
--net turtlesim \
-p 9094:9090 \
--env ROS_HOSTNAME=ros-turtlesim-bridge \
--env ROS_MASTER_URI=http://ros-turtlesim-master:11311 \
-v ~/turtlesim/catkin_ws:/root/turtlesim/catkin_ws \
--name ros-turtlesim-bridge \
ros-melodic-bridge \
/bin/bashRun rosbridge:
rosrun rosbridge_server rosbridge_websocketCopy the source code of web application into the project direcctory:
cd ~/turtlesim
cp -a /path/to/repo/turtlesim-ros-docker-js/webserver .Or create symbolic link:
ln -s /path/to/repo/turtlesim-ros-docker-js/webserver .Start a container for Webserver:
docker container run -d \
--net turtlesim \
-p 8084:80 \
-v ~/turtlesim/webserver:/usr/share/nginx/html:ro \
--name turtlesim-nginx \
nginxCheck the webserver: http://<host_ip>:8084.
List all container IP addresses:
docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'Install ping and telnet command inside a container:
apt-get update
apt-get install -y iputils-ping telnet
