During this lab, you should learn how to use the Singularity, the tmux, the terminal commands of Robot Operating System (ROS), and how to program a simple python subscriber/publisher node.
The Singularity is software for virtualization via containers that allows you to program and test ARO homeworks and semestral work without installing all ROS dependencies on your computer.
git clone https://gitlab.fel.cvut.cz/robolab/deploy.git ./deploy/scripts/install_singularity ./deploy/scripts/download_singularity_image ./deploy/scripts/start_singularity_aro
The start_singularity_aro script not only starts the singularity, but also creates appropriate ROS workspace, clones the student packages to the workspace, builds the workspace, and sources the workspace. Details of this process are described here.
After starting the singularity container, try to run the simulation which will be part of your first homework using command:
roslaunch aro_reactive_control hw01_sim.launch
singularity, so we keep using the term Singularity when refering to this virtualization technology.
You will need to be able to use terminal in Linux. Here are a few tips for what you will need:
cd dir - changes current directory
pwd - prints current directory
mkdir dir - creates directory dir in current directory
chmod +x file.py - make file.py executable
./file.py - execute (run) file.py using the program mentioned on the first line of the file (the shebang)
file.py will not work!
htop - view list of running processes (use F9 to terminate selected process)
sudo - this is a program that gives you administrator (root) permission. If you are not eligible, you will not get them! sudo does not work inside Singularity containers.
terminal. It will launch a terminal app like gnome-terminal, konsole, xterm or similar.
nano, emacs or vim are console text editors.
<Tab> (one or two presses) shows you autocompletion options (filenames, packages, topics…)
Tmux allows you to switch easily between several windows in one terminal., detach them (they keep running in the background) and reattach them to a different terminal. To start Tmux use:
tmux - starts a new tmux session
tmux a - attaches to an existing session
Inside tmux session, press $prefix (ctrl+b) followed by any of the keys below to control the session:
+ d - detach from the session while it keeps running
+ c - create new window
+ w - list windows with option to select one to see
+ n - next window
+ p - previous window
+ , - name window
+ % - split vertically
+ “ split horizontally
Robot Operating System (ROS) https://www.ros.org/ is a set of software libraries that allows you to build a complex robotic system. It is not an operating system but rather a very convenient middleware for sharing data (messages) between different parts of the robot's software (nodes). When using ROS you can leverage the work of others and use an already very large code base of implemented packages for, e.g., mapping, localization, control, planning, and sensor interfacing.
Key aspects/buzzwords to know are:
roscore and needs to be always started first before other nodes. Its address is stored in the environment variable $ROS_MASTER_URI.
The code for your projects with ROS is stored in a workspace.
In case you would like to create your own workspace in some folder, you can do it by running the following commands in the started singularity image:
cd <where_you_want_the_workspace> mkdir -p catkin_ws/src cd catkin_ws catkin init catkin config --extend /opt/ros/aro catkin build source devel/setup.bashThis code initializes your workspace as an extension of the default ARO workspace. Then it calls the catkin tool to build the workspace. Finally, it sources the workspace to load information about all built packages. Now you can place any of your packages into the src folder and after repeating catkin build and sourcing parts you can use them.
Please note that even when you are using Python, which normally does not require a build step, ROS requires you to re-build and re-source the workspace in some cases - most notably when you add a new package.
ROS has many handy command line programs that you can learn.
roscore - starts the ros master
rosnode list/info <node_name>/ping <node_name>/kill <node_name> - list shows all running nodes, info gives you information about a specified node, ping checks if you can contact the node, kill terminates the node
rostopic list/info <topic_name>/hz <topic_name>/echo <topic_name>/type <topic_name>/pub <topic_name> <topic_type> <data> - list shows all currently available topic names, info shows information about a given topic, hz shows frequency of messages published on a topic, echo prints all messages on a given topic, type shows message type of the topic, pub publishes a message to a topic
rosmsg list/show <message_type>/package - list shows all available messages, show displays the definition of a given message type, package lists messages of a certain package
roslaunch <package_name> <launch_filename> - launches the <launch_filename> of a given <package_name>
rosbag record/play/info - record a rosbag, play existing rosbag, info gives you information what is inside a rosbag
roscd <package_name> - goes into directory of a given package
rosrun <package_name> <node_name> - starts node <node_name> from package <package_name>
catkin build/clean/init/config - build workspace you are in, clean workspace you are in, init creates a new workspace in current folder, config - shows configuration of a workspace you are in
Test the following individual commands. Use the tab for suggestions of node names, topic names, message types, etc.
roscore.
rosnode commands on default /rosout node.
rostopic pub /new std_msgs/String "data: 'whaaat'" -r 10. Test other rostopic commands on this topic in new tmux window.
rosmsg list and find out what messages are in std_msgs package. Show the definition of one of the message type.
In ROS noetic we will use python 3. The most important library that enables interfacing with ROS is rospy.
The typical content of a package folder in, e.g., workspace/src/my_package/ is:
Always make sure the python node is a runnable script chmod u+x <filename>.py, otherwise you can not start it with rosrun or roslaunch. It also has to start with the 'shebang' line #!/usr/bin/env python or #!/usr/bin/env python3.
Always make sure to source devel/setup.bash in your workspace after you build your workspace with catkin build. You need to build the workspace if you have new package, if you change c++ code or, e.g., message definitions. Changing python code does not require rebuilding.
At the beginning of a python script you need to initialize the node such that it is registered within the ROS with rospy.init_node('my_node') command.
Afterwards you can initialize all your subscribers, publishers, threaded workers, etc.
Finally you need to run rospy.spin() which internally runs the messaging system of the node (especially important for subscribers to run callbacks for new messages).
You can print messages within your package with different severity levels using:
rospy.loginfo('your message')
rospy.logwarn('your warning message')
rospy.logerr('your error message')
Messages are data structures used to send data over topics.
They are composed of either simple or complex data types.
Simple types are, e.g.: bool, int<N>, uint<N>, float<N> (with N being {8, 16, 32, 64}), String, Time, Duration (see standard messages rosmsg package std_msgs).
Complex data types are composed of simple ones or their arrays (see, e.g., rosmsg info std_msgs/Header ).
Custom messages can be defined in message files, and their respective c++ headers and python objects are generated during build.
All released message definitions can be found in the list on index.ros.org.
Publisher is an object assigned to a specific topic and message type that you can use to send messages from your node to other nodes.
You can create publisher object using:
publisher = rospy.Publisher('message', String, queue_size=10).
Then every time you want to send a message you create a new message object
msg = String()
, then fill it with your data (msg.data="ahoj") and publish it to ROS using
publisher.publish(msg).
Subscriber is an object that basically assigns a callback function to received messages of a given topic name and message type.
You can create the subscriber using:
subscriber = rospy.Subscriber('message', String , callback)
,where the callback is a custom function (def callback(msg):) that handles the received message.
Implement a simple publisher and subscriber nodes as specified below. You can get inspiration on how to write such python nodes in the following ROS tutorial. Both can be placed inside the aro_reactive_control/scripts of the student-packages.
publisher.py that publish String message from std_msgs package on topic “message” every one second.
subscriber.py that receives the messages and prints them in the terminal.
Follow the assignment of the homework HW01 which requires only some additional work compared to the lab task above.