DDS and the ROS_DOMAIN_ID are important when you have more than one robot using the same WiFi network. In this tutorial, I cover these two fundamental concepts.
If you prefer learning through video rather than text, check out the YouTube video below where I walk you through the entire tutorial step by step. Otherwise, keep reading.
How DDS Works?
When you’re working with robots, you need a way for all the different parts of the robot to talk to each other. That’s where something called DDS comes in. DDS stands for Data Distribution Service, and it’s like a super-advanced messaging system for robots and computers.
Think of it like this: imagine you have a bunch of robots in a factory, and they all need to work together to build cars. Each robot has a specific job, like welding doors or painting bumpers. To do their jobs, they need to be able to send messages to each other, like “I’ve finished welding this door” or “I need more paint over here!”
DDS is what makes this communication possible. It is a set of rules that all the robots agree to follow so they can send messages quickly and reliably. It is kind of like a big chat room where robots can post and read messages, but instead of just being for fun, these messages contain important information that the robots need to do their jobs.
ROS 2 uses DDS under the hood to help all the different parts of a robot communicate. You can think of DDS as the glue that holds everything together in a ROS 2 system.
What is the ROS_DOMAIN_ID?
Now, here’s where something called the ROS_DOMAIN_ID comes in. In a DDS system, you can have multiple “chat rooms,” each with its own ID number. These “chat rooms” are called domains in DDS language. The ROS_DOMAIN_ID is just a number that tells ROS which domain to use.
By default, ROS uses 0 for the ROS_DOMAIN_ID. It is fine if we keep the default since we are working in simulation. However, in the real world, you might have a facility with multiple robots, all running ROS 2. If all these robots use the default settings, they’ll all be talking in the same “chat room” – domain 0.
This is fine if you want all your robots to be able to communicate with each other. But let’s say you have two different teams of robots in your factory, and you don’t want them to get confused by hearing each other’s messages. You could put one team in domain 1 and the other team in domain 2. They’re all still using DDS to communicate, but the two teams can’t hear each other because they’re in different domains.
The easiest way to choose a ROS_DOMAIN_ID is to pick a number between 0 and 101, or between 215 and 232. These numbers are less likely to conflict with other programs that might be using DDS.
In my tutorials, we’ll be sticking with the default ROS_DOMAIN_ID of 0. This means all our robots will be able to communicate with each other. But if you ever need to work with multiple groups of robots that shouldn’t be talking to each other, remember that you can use different ROS_DOMAIN_IDs to keep their conversations separate.
If you did want to change the ROS_DOMAIN_ID, you can do it by typing this command:
export ROS_DOMAIN_ID=<your_chosen_number>
Replace <your_chosen_number> with the ROS_DOMAIN_ID you want to use. For example, if you want to use a ROS_DOMAIN_ID of 42, you would add in the terminal window before the commands you want to run:
export ROS_DOMAIN_ID=42
Remember, if you have multiple robots on the same WiFi network and you want them to be able to talk to each other, they should all have the same ROS_DOMAIN_ID. But if you have groups of robots that shouldn’t be communicating, give each group its own ROS_DOMAIN_ID.
Example
Let’s look at an example:
Open a new terminal, and type this:
ros2 run demo_nodes_cpp talker
This “talker” program publishes messages to the ROS 2 system.
Open another terminal window, and type:
ros2 run demo_nodes_py listener
You can see both programs are able to talk to each other freely because they have the same ROS_DOMAIN_IDs.
Now close both nodes by pressing CTRL+C in both terminal windows.
Now in a the first terminal window, type this:
export ROS_DOMAIN_ID=8
In that same terminal window, type:
ros2 run demo_nodes_cpp talker
Now in your second terminal window, type:
ros2 run demo_nodes_py listener
You can see this node can’t receive messages from the other node.
You can now close this listener using CTRL + C.
Now set the ROS_DOMAIN_ID to match our publisher node.
export ROS_DOMAIN_ID=8
ros2 run demo_nodes_py listener
You can see now that, since these nodes have the same ROS_DOMAIN_ID, they can now communicate with each other.
That’s it. I’ll see you in the next tutorial. Keep building!
By the end of this tutorial, you will be running your first ROS 2 programs.
If you prefer learning through video rather than text, check out the YouTube video below where I walk you through the entire process step by step. Otherwise, keep reading.
You Will Need
In order to complete this tutorial, you will need:
A computer or virtual machine running Ubuntu 24.04. If you followed my previous tutorial, you already have that setup.
Set the Locale
The official steps for installing ROS are at this link at ROS.org, but let’s go through this entire process together.
Follow along with me click by click, keystroke by keystroke.
We will begin by installing ROS 2 Jazzy via Debian Packages. Debian packages are software files used to install programs and applications on Ubuntu.
Open a new terminal window.
Type this command inside a terminal window.
locale
A locale is a set of variables that define the language, country, and character encoding settings. These settings are used by applications to determine how to display text, dates, times, and other information.
Now type the following command:
sudo apt update && sudo apt install locales
“sudo apt update” updates the package index list. This list is a database of all the software packages available for your version of Ubuntu.
“sudo apt install locales” installs the locales package, which provides support for different languages and regions.
Now type the following commands into the terminal window to generate locale definition files. After each command, press Enter on your keyboard:
In this case, these commands are generating locale definition files for the English (United States) locale and the English (United States) UTF-8 locale. The UTF-8 locale is a special locale that supports the UTF-8 character encoding, which is the standard encoding for most languages.
Now we need to verify the settings by typing:
locale
Here is what you should see:
Enable the Required Repositories
Let’s add the ROS 2 apt repository to our system. APT stands for “Advanced Package Repository”. This repository provides a convenient way to install and manage ROS 2 packages without having to clone packages to your computer from GitHub and build them from that source code.
Open a terminal window, and type the following two commands:
sudo apt install software-properties-common
sudo add-apt-repository universe
Press Enter.
The software-properties-common package provides a number of tools for managing software sources on Ubuntu and Debian systems.
The universe repository is a software repository that contains a wide variety of software packages, including many that are not included in the default Ubuntu and Debian repositories.
Now we need to add the ROS 2 GPG key with apt. The ROS 2 GPG key makes sure the software packages you are installing are from a trusted source.
Type the following command to install ROS 2 development tools.
sudo apt update && sudo apt install ros-dev-tools
Upgrade the packages on your system to make sure you have the newest versions.
sudo apt upgrade -y
Install ROS 2
Now for the fun part. Here is where we get to install ROS 2 Jazzy.
Open a terminal window, and type this command:
sudo apt install ros-jazzy-desktop
Set Up the Environment Variables
Once jazzy has finished installing, you need to set up the important environment variables. Environment variables are settings that tell your computer how to find and use ROS 2 commands and packages.
When you run this command, it appends the line source /opt/ros/jazzy/setup.bash to your ~/.bashrc file.
What does this do? Each time you open a new terminal window, you are starting what is called a bash session. The bash session needs to know what version of ROS 2 you are using.
By adding this line (echo “source /opt/ros/jazzy/setup.bash”) to your ~/.bashrc file, you ensure the necessary environment variables and paths for ROS 2 Jazzy are properly set up each time you open a new terminal window, allowing you to use ROS 2 commands and tools without having to manually run the setup.bash script every time.
For the changes to take effect, you now need to open a new terminal window, or you can type this command in the current terminal:
source ~/.bashrc
You can verify that line was added by typing:
sudo apt-get install gedit -y
gedit ~/.bashrc
Close the gedit window.
Check Your ROS 2 Version
Now let’s see what ROS 2 version we are using using:
printenv ROS_DISTRO
You should see “jazzy”.
You can also type:
env | grep ROS
Finally, you can also type:
echo $ROS_DISTRO
Set up the system to manage ROS package dependencies.
sudo rosdep init
rosdep update
Install Gazebo and Other Useful Packages
Let’s install some other useful packages like pip (the Python package manager), Gazebo, a simulation software for robotics, and NumPy, a scientific computing library for Python.
sudo apt-get install python3 python3-pip -y
sudo apt-get install ros-${ROS_DISTRO}-ros-gz -y
sudo apt-get install python3-numpy
Test Your Gazebo Installation
If you want to run an example Gazebo simulation world now, open a new terminal window, and type:
These environment variables here “LIBGL_ALWAYS_SOFTWARE=1 QT_QPA_PLATFORM=xcb” help you avoid the following nasty error which happens by default when you try to launch Gazebo from a fresh ROS 2 Jazzy installation:
[GUI] [Err] [Ogre2RenderEngine.cc:1301] Unable to create the rendering window: OGRE EXCEPTION(3:RenderingAPIException): currentGLContext was specified with no current GL context in GLXWindow::create at ./.obj-x86_64-linux-gnu/gz_ogre_next_vendor-prefix/src/gz_ogre_next_vendor/RenderSystems/GL3Plus/src/windowing/GLX/OgreGLXWindow.cpp (line 165)
Now close Gazebo by going to the terminal window, and typing CTRL + C on your keyboard.
You can see the error, if you open a new terminal window, and type:
gz sim -v 4 shapes.sdf
Let’s make these environment variables permanent. Open a terminal window, and type these commands, one after the other:
Now test your Gazebo installation again by typing the following command:
gz sim
You should see this screen.
Click on the NAO Joint Control simulation, and click Run.
Close the simulation by typing CTRL + C in the terminal window.
Now try the Panda Joint Control World.
gz sim
Click on the Panda Joint Control World simulation, and click Run. It might take up to 60 seconds to load. Just be patient and don’t quit Gazebo if asked.
Close the simulation by typing CTRL + C in the terminal window.
Now run another example:
gz sim shapes.sdf -v 4
Close the simulation by typing CTRL + C in the terminal window.
Close the simulation by typing CTRL + C in the terminal window.
Test Your ROS 2 Installation
Now that we have tested Gazebo, let’s test our ROS 2 installation by running some sample programs.
Open a terminal window, and type:
ros2 run demo_nodes_cpp talker
This command runs a pre-built program called “talker” that comes with ROS 2. The “talker” program publishes messages to the ROS 2 system in string format.
Open another terminal window, and type:
ros2 run demo_nodes_py listener
If your output looks similar to the images above, you have installed ROS 2 successfully.
To close these programs, press CTRL + C on your keyboard in both terminal windows.
So what did we just do here, and what do these two hello world programs we just ran have to do with real robots?
So imagine you’re building a robot that needs to navigate through a room. The “talker” program is like a sensor on the robot (e.g., a depth camera for example) that constantly sends out information about what it sees.
The “listener” program, on the other hand, receives the information that was published by the talker program. This listener program, in a real robot, could do something with that data like stop the wheels if an obstacle is detected by the camera.
The talker program is what we call in ROS 2, a publisher. The listener program is called a subscriber. Remember those two terms. Those are the two most important terms in all of ROS 2.
A ROS 2 publisher sends data, and a subscriber receives data.
In future tutorials, we will create our own publishers and subscribers for actual robots.
Publishers and subscribers are the main way programs exchange information with each other inside a robot.
So, again, just remember this…publishers are programs that send data to other programs, and subscribers are programs that receive data from other programs. All these programs are usually written in either Python or C++.
Collectively, publishers and subscribers in ROS 2 are called nodes. You just saw how to run a publisher node named talker and a subscriber node named listener.
The term node is the third most important term in all of ROS 2. So remember it because you will be using that term again and again over the course of your work with ROS 2.
To close out this tutorial, let me show you a cool program that enables you to show multiple terminal windows in a single window.
The program is called terminator.
Open a terminal window, and type:
sudo apt-get install terminator -y
Now type:
terminator
Right-click on the screen, and click “Split Horizontally”.
On the top panel, type:
ros2 run demo_nodes_cpp talker
On the bottom panel, type:
ros2 run demo_nodes_py listener
Now, press Enter in both terminals.
Here is what you should get:
Press CTRL + C in both terminal windows to close everything.
That’s it! Keep building! I’ll see you in the next tutorial.
In this tutorial, you will install Ubuntu and Virtual Box on your personal computer. Whether you have a computer using Windows or a Mac, by the end of this tutorial, you will have Ubuntu all setup and ready to go.
If you prefer learning through video rather than text, check out the YouTube video below where I walk you through the entire process step by step. Otherwise, keep reading.
What is Ubuntu?
Ubuntu is an operating system for your computer, just like Windows or macOS, but it is based on Linux – a free, open-source system that serves as the foundation for many computer programs.
Ubuntu provides a user-friendly desktop environment see in the lead image for this blog post.
Why use Ubuntu to program robots when we could use Windows or macOS?
Three reasons:
It is free to use.
It is open source, which means the code is publicly available for you to modify and distribute without paying thousands of dollars in license fees.
It is fully supported by ROS 2, the most popular framework in the world for writing robotics software.
What is VirtualBox?
VirtualBox is a program that lets you run a different operating system inside your current one. It is like having a computer within your computer.
VirtualBox creates a safe, isolated space where you can experiment with other operating system environments without changing anything on your main Mac or Windows-based computer.
What About a Real-World Robotics Project?
On a real-world robotics project, you will use a small computer instead of your desktop PC. Examples include the Intel NUC, Raspberry Pi, or NVIDIA Jetson boards.
These small computers serve as your robot’s “brain,” taking care of all the decisions on what actions the robot should take based on data from sensors like cameras, LIDAR, wheel encoders, and GPS.
We’ll be harnessing the power of Ubuntu on a desktop computer, creating a robust virtual environment for our robotics journey. This setup is not just a convenient starting point for beginners—it is actually the ideal platform for any robotics project, regardless of experience level.
Why Simulation Matters in Professional Robotics
It is worth mentioning that even in professional robotics jobs, a significant amount of work is done in simulation environments similar to what we’re setting up. There are three reasons for this: Speed, Spend, and Safety. I call it the three S’s:
Speed: You can rapidly prototype new ideas in a simulated environment before committing to physical builds.
Spend: Developing and testing in a virtual environment is much cheaper than building and testing physical prototypes for every iteration.
Safety: You can test potentially dangerous scenarios without damaging expensive hardware or running into people:
An example would be testing a cliff sensor for a mobile robot that is designed to keep the robot from falling down stairs.
You wouldn’t want to test that logic on a real robot without doing it in simulation first!
By starting with this virtual Ubuntu setup, you’re not only learning the basics but also preparing yourself for practices used in real-world robotics development. This approach bridges the gap between beginner-friendly learning and professional-grade tools and methodologies.
Download the Ubuntu Image
Now let’s download Ubuntu.
First, go to the Ubuntu Releases page (https://releases.ubuntu.com/) on the Ubuntu website to find the latest version of Ubuntu that has long term support (LTS).
As of the date of this writing, the latest version is Ubuntu 24.04 LTS (Noble Numbat).
Click on “Ubuntu 24.04 LTS (Noble Numbat)”.
Click on the 64-bit PC (AMD64) desktop image.
This .iso file is large. It will take a while to download. Just go do something else and come back to it when it is finished.
When the download finishes, you can either keep the file in the default download location, which for me is my Desktop. Or, you can move the file to another directory on your computer.
Select the version that is compatible with your computer. I will click “Windows hosts” since I am using a Windows-based computer.
Click on the executable file that you just downloaded.
Follow the prompts to install it on your machine.
Accept all the defaults by clicking either Next, Yes, Install, or Finish through all the prompts.
You can find detailed installation instructions for all operating systems (Windows, Mac OS, and Linux) in the instruction manual if you encounter problems.
When you are finished downloading and installing VirtualBox, you can delete the original executable file that you used to install the program. You don’t need it anymore.
Create a Virtual Machine
Now that VirtualBox is installed, we need to create a new virtual machine using the Ubuntu image we downloaded earlier.
Open Virtual Box.
Click the New button in the toolbar.
Name and Operating System
First, let’s complete the “Name and Operating System” section.
On the “Name” line, type in a descriptive name for your operating system. I will call mine “Ubuntu24.04”.
On the “Folder” line, you can keep the default Folder path. This folder is where your virtual machines will be stored.
On the “ISO Image” line, select the path to the Ubuntu .iso file you downloaded earlier.
On the “Type” line, select Linux.
On the “Subtype” line, select Ubuntu.
On the “Version” line, select Ubuntu (64-bit).
Select “Skip Unattended Installation”. By selecting this option, we will manually go through the entire installation process of the operating system.
Hardware
Click on the arrow next to “Hardware” to expand the menu options.
On the “Base Memory” line, move the slider to 16384 MB (megabytes). This memory size will be enough for us to run our robotics simulator, Gazebo, which requires a lot of memory.
On the “Processors” line, select 8 CPUs. If your computer supports it, you can set a higher number. I like to make sure my slider stays within the safe, green color to avoid problems.
Click on the arrow next to “Hard Disk” to expand the menu options.
Click on the slider bar to set 50.00 GB for the storage space.
Click “Finish”.
Highlight Ubuntu24.04, and click Settings.
Click Display.
Change Video Memory to 128 MB (megabytes).
Click OK.
Install Ubuntu
Highlight Ubuntu24.04, and click Start on the top menu.
A startup window will appear.
Select “Try or Install Ubuntu” by PressingEnter.
Choose your language. I will select “English”.
Click Next.
On the “Accessibility in Ubuntu” panel, click Next.
On the “Keyboard layout” panel, select your desired keyboard layout, and click Next.
On the “Connect to the internet” panel, select “Use wired connection”, and click Next.
If you get prompted to update the Ubuntu installer, do that now.
Then click the “Install Ubuntu 24.04.1 LTS” icon on the Ubuntu desktop to continue the installation.
On the “What do you want to do with Ubuntu?” panel, select “Install Ubuntu”, and then click Next.
On the “How would you like to install Ubuntu?” panel, select “Interactive installation”, and then click Next.
On the “What apps would you like to install to start with?” panel, select the “Default selection”, and then click Next.
On the “Install recommended proprietary software?” panel, select both checkboxes, and then click Next.
On the “How do you want to install Ubuntu?” panel, select “Erase disk and install Ubuntu”.
Click Next.
On the “Create your account” panel, fill in your information with your desired name (e.g. “ubuntu”). Also fill in your password.
Deselect “Require my password to log in”.
Click Next.
Select your time zone, and then click Next.
On the “Review your choices” panel, click Install.
Sit back and relax while Ubuntu installs.
Click “Restart now” when the installation finishes.
When you see a message that says “Please remove the installation medium, then press Enter”, press Enter on your keyboard.
Configure Ubuntu
You will now see a welcome screen.
Click Next.
On the “Enable Ubuntu Pro” panel, select “Skip for now”, and click Next.
I will select “No, don’t share system data”, and click Next.
On the “Get started with more applications” panel, click Finish.
On the bottom left side of the screen, click the ring icon.
Right-click the terminal icon, and click “Pin to Dash”.
Click the ring icon again to return to the Desktop.
Now let’s make sure your user has sudo privileges. Sudo privileges allow a user to execute commands with superuser (administrative) rights, enabling them to perform tasks that require higher levels of access on the system.
Click the terminal icon on the left side of the screen.
Type the following command inside the terminal window, and press Enter.
whoami
This is your username.
Now type:
sudo adduser <username> sudo
Replace <username> with your username.
Now shutdown the virtual machine by typing the following command and pressing Enter on the keyboard.
sudo shutdown -h now
Install VirtualBox Guest Additions
Now we need to install VirtualBox Guest Additions.
VirtualBox Guest Additions are a set of applications that improve the performance and usability of virtual machines.
Highlight Ubuntu24.04, and click Start on the top menu to launch the Desktop environment.
Open a terminal window, and type the following commands to upgrade the operating system software packages:
sudo apt-get update -y
When prompted for the password, type in your password and press Enter.
sudo apt-get upgrade -y
Clear out all the logs in the terminal by typing the following command, and pressing Enter:
clear
Now reboot the machine.
reboot
When you get back to the Desktop, open a terminal window, and type the following command.
Next, go to the menu bar at the top of the Virtual Machine.
Click “Devices”.
Click “Insert Guest Additions CD image” to mount the Guest Additions ISO file inside your virtual machine.
Click the Files icon on the left side of the screen.
Click VBox_GAs on the left panel.
Right click on autorun.sh and select “Run as program”. (you can also click Run Software at the top)
Enter your password when the Authentication Required pop-up window appears.
Click “Authenticate.”
Once all the logs stop, press Enter to close the installation window.
Shutdown your system with the following command inside a terminal window:
sudo shutdown -h now
Highlight Ubuntu24.04 on the left panel.
Click Machine -> Settings in the dropdown menu at the top of Virtual Box.
Go to General -> Advanced on the Settings menu.
Enable “Bidirectional” for both “Shared Clipboard” and “Drag’n’Drop”.
Click OK.
Highlight Ubuntu24.04 on the left panel.
Click Start to launch the Desktop environment again.
If the environment doesn’t launch after a minute or so, click File -> Close, and power everything down, and try launching it again by pressing the Start button on the home menu.
Change the Screen Resolution
You may notice some annoying flickering that happens on your screen. This flickering happens either at random times or when I try to move windows with the virtual machine. The issue is due to the screen resolution.
Do the following steps to make this go away:
Go to the View menu at the top of the window.
To set a specific fixed resolution, go to View -> Virtual Screen 1, and select your desired resolution (e.g. 1920 x 1080).
Congratulations, you have finished installing and setting up Ubuntu.