Skip to content

Building ROS2 packages

Setup

Setting up the ROS2 Package Workspace

first create the folder for the package usual it is called packagename_wswhere _ws stands for then you enter the directory and create another directory called src then run the colcon build command.

colcon build
next go into the install folder and add the setup.bash source command to your ~/.bashrc
echo "source /home/username/package_ws/install/setup.bash" >> ~/.bashrc

Creating a Python Packages

Setting Up

Go to the workspace folder that was created in the last step and open the src folder. In this folder run this command.

ros2 pkg create {package_name} --build-type ament_python --dependencies rclpy

add your code in to the folder with the __init__.py. This is usually in the folder src/{package_name}/{package_name}

Programming

create a python file for your first node.

my_first_node.py
#!/usr/bin/env python
import rclpy
from rclpy.node import Node


class MyNode(Node):

    def __init__(self):
        super().__init__('first_node')
        self.get_logger().info('Hello from ROS2')


def main (args=None):
    rclpy.init(args=args)
    node = MyNode()
    rclpy.spin(node)
    rclpy.shutdown()

if __name__ == '__main__':
    main()

Now add it to the setup.py file in the entry_points section.

it is setup with the name of the ROS2 command first then the equals followed by the package name, python file name that is in the same folder as the __init__.py, and finally the function name to call, usual main.

    entry_points={
        'console_scripts': [
            "test_node = husky_test.my_first_node:main"
        ],
    },

The final step is building the script and testing it.

Building

go the the {package_name}_ws folder with the src and install folder in it. Then run the colcon build command.

colcon build

next run the source ~/.bashrc command to reload the workspace source file and the other source files.

To help improve the build speed we can also use --packages-select to only build a specific package.

colcon build --packages-select {package_name}

Simplifying Build (specific to python)

since we are using python and it is interpreted we can simplify the build process when working buy using the symlink command to avoid building.

colcon build --symlink-install

then just like before run the source ~/.bashrc command to refresh everything and after that you will never have to worry about building or refreshing again.

Creating a C++ Packages

Go to the workspace folder that was created in the last step and open the src folder. In this folder run this command.

ros2 pkg create {package_name} --build-type ament_cmake --dependencies rclcpp

next create a file in {package_name}/srcand call it node_name.cpp

node_name.cpp
#include "rclcpp/rclcpp.hpp"  

class MyNode : public rclcpp::Node  
{  
public:  
   MyNode() : Node("cpp_test"), counter_(0)  
   {  
       RCLCPP_INFO(this->get_logger(), "Hello Cpp Node");  

       timer_ = this->create_wall_timer(std::chrono::milliseconds(500),  
                                        std::bind(&MyNode::timerCallback, this));  
   }  

private:  
   void timerCallback()  
   {  
       counter_++;  
       RCLCPP_INFO(this->get_logger(), "Hello %d", counter_);  
   }  

   rclcpp::TimerBase::SharedPtr timer_;  
   int counter_;  
};  

int main(int argc, char **argv)  
{  
   rclcpp::init(argc, argv);  
   auto node = std::make_shared<MyNode>();  
   rclcpp::spin(node);  
   rclcpp::shutdown();  
   return 0;  
}

Next open the program menu on VSCode using CTRL + SHIFT + P. Select the C/C++: Edit Configurations (JSON). Make Sure the c_cpp_properties.json file has the "/opt/ros/humble/include/**" include

{
    "configurations": [
        {
            "browse": {
                "databaseFilename": "${default}",
                "limitSymbolsToIncludedHeaders": false
            },
            "includePath": [
                "/opt/ros/humble/include/**",
                "/usr/include/**"
            ],
            "name": "ROS",
            "intelliSenseMode": "gcc-x64",
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu11",
            "cppStandard": "c++14"
        }
    ],
    "version": 4
}