This example shows you how to generate C++ code from a Simulink® model to deploy as a standalone ROS 2 node. The code is generated on your computer and must be manually transferred to the target ROS device. No connection to the hardware is necessary for generated the code. For an automated deployment of a ROS 2 node, see Generate a Standalone ROS 2 Node from Simulink®.
This example requires Simulink Coder™ and Embedded Coder™ .
If this is your first time deploying a ROS node, check the ROS System Requirements.
A Ubuntu Linux system with ROS is necessary for building and running the generated C++ code. You can use your own Ubuntu ROS system, or you can use the Linux virtual machine used for ROS Toolbox™ examples. See Get Started with Gazebo and a Simulated TurtleBot for instructions on setting up a simulated robot.
Review the Feedback Control of a ROS-enabled Robot over ROS 2 example, which details the Simulink model that the code is being generated from.
Configure a model to generate C++ code for a standalone ROS 2 node. The model is the proportional controller introduced in the Feedback Control of a ROS-enabled Robot over ROS 2 example.
Open the robot feedback control model configured for ROS 2.
Under Robot tab, click Hardware settings. In the Hardware implementation pane, Hardware board settings section contains settings specific to the generated ROS 2 package, such as information to be included in the
package.xml file. Change Maintainer name to
ROS 2 Example User,
The model requires variable-sized arrays. To enable this option, check variable-size signals under Code Generation > Interface > Software environment.
In the Solver pane, ensure that the solver Type is set to
Fixed-step, and set Fixed-step size to
0.05. In generated code, the Fixed-step size defines the actual time step, in seconds, that is used for the model update loop (see Execution of Code Generated from a Model (Simulink Coder) (Simulink Coder)). It can be made smaller (e.g., 0.001 or 0.0001) but for current purposes 0.05 is sufficient.
After configuring the model, you must specify the build options for the target hardware and set the folder or building the generated code.
Open the Configuration Parameters dialog. Under the Modeling tab, click Model Settings.
In the Hardware Implementation tab, under Target hardware resources, click the Build options group. Set the Build action to
Build. This setting ensures that code generated for the ROS 2 node without building it on an external ROS 2 device.
In this task, you generate source code for ROS 2 node, manually deploy to Ubuntu Linux system, and build it on the Linux system.
In MATLAB®, change the current folder to a location where you have write permission.
Under the Simulation tab, in Prepare, select ROS Toolbox > ROS Network.
Set the Domain ID (ROS 2) of ROS 2 network. This example uses Domain ID as 25.
In Robot tab, from the Deploy section, click Build Model. If you get any errors about bus type mismatch, close the model, clear all variables from the base MATLAB workspace, and re-open the model. Click on the View Diagnostics link at the bottom of the model toolbar to see the output of the build process.
Once the build completes, a
src folder which contains the package source code will be written to your folder.
src folder to a tar file by executing the following command in MATLAB Command Window:
After generating the tar file, manually transfer it to the target machine. This example assumes you are using the virtual machine from Get Started with Gazebo and a Simulated TurtleBot. The virtual machine is configured to accept SSH and SCP connections. If you are using your own Linux system, consult your system administrator for a secure way to transfer files.
Ensure your host system (the system with your
src.tar file) has an SCP client. For Windows® systems, the next step assumes that PuTTY SCP client (
pcsp.exe) is installed.
Use SCP to transfer the files to the user home director on the Linux virtual machine. Username is
user and password is
<virtual_machine_ip> with your virtual machines IP address.
Windows host systems:
pscp.exe src.tar user@<virtual_machine_ip>:
Linux or macOS host systems:
scp src.tar user@<virtual_machine_ip>:
On the Linux system, execute the following commands to create a Catkin workspace and decompress the source code. You may use an existing Catkin workspace.
mkdir ~/ros2_ws_simulink tar -C ~/ros2_ws_simulink/ -xvf ~/src.tar
Build the ROS 2 node using the following command in Linux. Replace
<path_to_catkin_ws> with the path to your catkin workspace. In this example, the
<path_to_catkin_ws> would be
~/ros2_ws_simulink. (Note: There might be some warnings such as unused parameters during the build process. These parameters are needed only for Simulink environment, it would not affect the build process.)
cd <path_to_catkin_ws> source /opt/ros/dashing/local_setup.sh colcon build
Verify that the node executable was created using:
If the executable was created successfully, the command lists information about the file. The model is now ready to be run as a standalone ROS 2 node on your device.
(Optional) You can then run the node using these commands. Replace
<path_to_catkin_ws> with the path to your catkin workspace.
Double click Gazebo Empty and ROS Bridge on virtual machine desktop to set up the Gazebo environment. Setup environment variables and run the ROS 2 node using:
export ROS_DOMAIN_ID=25 source /opt/ros/dashing/local_setup.sh ~/<path_to_catkin_ws>/install/robotfeedbackcontrollerros2/lib/robotfeedbackcontrollerros2/robotFeedbackControllerROS2
Note: It is possible that the robot spins at an unexpected location, this is because the pose and world is offset in Gazebo. Restart virtual machine and rerun Gazebo and the node.
You can also use
ros2 node to list all running nodes in the ROS 2 network.
robotFeedbackControllerROS2 should be in the displayed list of nodes.
Verify that this ROS 2 node publishes data on the ROS 2 topic,
/cmd_vel, to control the motion of simulated robot.
If you cannot see the expected node and topic, try to set
ROS_DOMAIN_ID using the
setenv command in MATLAB Command Window.