首页 > 编程语言 >编写ROS2(C++语言)软件包的步骤

编写ROS2(C++语言)软件包的步骤

时间:2024-04-17 13:15:48浏览次数:29  
标签:name package -- C++ radar ROS2 软件包 ros2

0 简介

介绍编写ROS2(C++语言)软件包的步骤;

0.1 前置条件

参考x.1,和x.2,安装ROS2和编译工具;

1 创建ROS2软件包

以下的指令,创建一个名为mtuav-sns-radar-ros2的ROS2软件包,使用ament_cmake作为构建系统,许可证类型为Apache-2.0,并包含一个名为radar_node的节点;

mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name radar_node mtuav-sns-radar-ros2

可以通过ros2 pkg create --help,查看初始化ROS2软件包的可用选项:

~$ ros2 pkg create --help
usage: ros2 pkg create [-h] [--package-format {2,3}] [--description DESCRIPTION] [--license LICENSE]
                       [--destination-directory DESTINATION_DIRECTORY] [--build-type {cmake,ament_cmake,ament_python}]
                       [--dependencies DEPENDENCIES [DEPENDENCIES ...]] [--maintainer-email MAINTAINER_EMAIL]
                       [--maintainer-name MAINTAINER_NAME] [--node-name NODE_NAME] [--library-name LIBRARY_NAME]
                       package_name

Create a new ROS 2 package

positional arguments:
  package_name          The package name

options:
  -h, --help            show this help message and exit
  --package-format {2,3}, --package_format {2,3}
                        The package.xml format.
  --description DESCRIPTION
                        The description given in the package.xml
  --license LICENSE     The license attached to this package; this can be an arbitrary string, but a LICENSE file will only be
                        generated if it is one of the supported licenses (pass '?' to get a list)
  --destination-directory DESTINATION_DIRECTORY
                        Directory where to create the package directory
  --build-type {cmake,ament_cmake,ament_python}
                        The build type to process the package with
  --dependencies DEPENDENCIES [DEPENDENCIES ...]
                        list of dependencies
  --maintainer-email MAINTAINER_EMAIL
                        email address of the maintainer of this package
  --maintainer-name MAINTAINER_NAME
                        name of the maintainer of this package
  --node-name NODE_NAME
                        name of the empty executable
  --library-name LIBRARY_NAME
                        name of the empty library

2 编译ROS2软件包

# Release版本
(cd ~/ros2_ws/ && colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release --packages-select mtuav-sns-radar-ros2)

# Debug版本
(cd ~/ros2_ws/ && colcon build --cmake-args -DCMAKE_BUILD_TYPE=Debug --packages-select mtuav-sns-radar-ros2)

3 使用gdb调试debug版本的程序

3.1 启动gdb时传入参数

gdb --args ~/ros2_ws/build/mtuav-sns-radar-ros2/radar_node /dev/ttyUSB0 921600

3.2 启动gdb后设置参数

gdb ~/ros2_ws/build/mtuav-sns-radar-ros2/radar_node
# 之后在gdb中设置参数
set args /dev/ttyUSB0 921600

image

4 添加依赖

4.1 创建ROS2软件包时,指定依赖

如果你在创建ROS2软件包时,已经知道需要的全部或者部分依赖,那么,你可以通过传入--dependencies选项指定依赖:

ros2 pkg create --dependencies rclcpp sensor_msgs message_filters --build-type ament_cmake --license Apache-2.0 --node-name radar_node mtuav-sns-radar-ros2

和不指定依赖相比,文件变动如下:

mtuav-sns-radar-ros2/package.xml

image

mtuav-sns-radar-ros2/CMakeLists.txt

image

4.2 创建ROS2软件包后,添加依赖

参考4.1,以添加pcl_msgs为例;

在package.xml,增加: pcl_msgs

在CMakeLists.txt,增加:

find_package(pcl_msgs REQUIRED)
# ...
# 在定义radar_node之后
ament_target_dependencies(radar_node
  # ...
  "pcl_msgs"
)

这种使用ament_target_dependencies添加第三方依赖的方式,并不局限于ROS2的功能软件包,对于能够使用find_package找到的第三方依赖,都可以尝试使用;

可以认为ament_target_dependencies实现了以下功能:

find_package(PCL REQUIRED common)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

ament_target_dependencies是官方推荐的方式去添加依赖项。它将使依赖项的库、头文件和自身的依赖项被正常找到;

x 参考文档

x.1 Ubuntu (Debian packages) — ROS 2 Documentation: Iron documentation

x.2 Using colcon to build packages — ROS 2 Documentation: Iron documentation

x.3 Creating a package — ROS 2 Documentation: Iron documentation

x.4 ROS 2编写包并用colcon编译_ros2 cmakelists 规则-CSDN博客

x.5 详细分析一个ROS2 CMakeLists.txt文件 | 首飞的博客

x.6 How do I run a program with commandline arguments using GDB within a Bash script? - Stack Overflow

x.7 io features related to pcap will be disabled · Issue #2651 · PointCloudLibrary/pcl

标签:name,package,--,C++,radar,ROS2,软件包,ros2
From: https://www.cnblogs.com/xiaochou/p/18140351

相关文章

  • 深度解读《深度探索C++对象模型》之拷贝构造函数
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,自动获得推文。写作不易,请有心人到我的公众号上点点赞支持一下,增加一下热度,也好让更多的人能看到,公众号里有完整的文章列表可供阅读。有以下三种情况,一个类对象的初始......
  • C++的介绍及与C语言的对比
    目录一.C语言与C++二.面向过程和面向对象三.C++的应用领域四.Cpp的运行和标准1.编译型语言和解释型语言2.C++的运行过程及相关文件解释一.C语言与C++C语言C语言是为开发Unix系统而创建的语言,它是一种面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发。它贴近硬件,运行......
  • ROS2笔记1--简介及开发环境搭建
    一、ROS2简介1.1、ROS2概述ROS2是第二代的RobotOperatingSystem,ROS1的升级版本,解决了ROS1存在的一些问题。与ROS1相比,Linux版本与ROS2版本的选择也有关系,对应关系如下:ROS2版本Ubuntu版本FoxyUbuntu20.04GalacticUbuntu20.04HumbleUbuntu......
  • 结对编程-c++四则运算
    题目:小学老师要每周给同学出300道四则运算练习题。–这个程序有很多种实现方式:C/C++C#/VB.net/JavaExcelUnixShellEmacs/Powershell/VbscriptPerlPython–两个运算符,100以内的数字,不需要写答案。–需要检查答案是否正确,并且保证答案在0..100之间–尽可能地多设置......
  • 结对编程-C++四则运算
    小学老师要每周给同学出300道四则运算练习题。–这个程序有很多种实现方式:C/C++C#/VB.net/JavaExcelUnixShellEmacs/Powershell/VbscriptPerlPython–两个运算符,100以内的数字,不需要写答案。–需要检查答案是否正确,并且保证答案在0..100之间–尽可能地多设置一......
  • C++ 递归与面向对象编程基础
    C++递归递归是一种使函数调用自身的技术。这种技术提供了一种将复杂问题分解为简单问题的方法,从而更容易解决问题。递归可能有点难以理解。理解其工作原理的最佳方法是通过实验来尝试。递归示例将两个数字相加很容易做到,但将一系列数字相加就更复杂了。在下面的示例中,通过将......
  • 【编译原理】正则式转NFA转DFA 代码实现(C/C++)
    直接上代码:#include<bits/stdc++.h>usingnamespacestd;//nfa结构定义structnst{vector<int>a[26],e;//接收a-z会到达的状态,接收eps会到达的状态boolf=0;//=0为可接受态};vector<nst>nfa;set<char>alp;stringstr;set<int>accepted;struc......
  • C++定义,继承和虚函数
    类定义方式一般有两种Baseb和Baseb(3);一种不带参数,一种带参数,这两种实例定义会在范围结束自动释放。Base*c=newBase;和Base*c=newBase(5);没有参数可不加括号。通过new申请的类,需要手动delete释放,否则需要关闭程序才会释放(说的内存泄漏是指程序一直运行期间不断产生......
  • C++ list erase
    原文:https://www.cnblogs.com/yelongsan/p/4050404.htmlSTL中的容器按存储方式分为两类,一类是按以数组形式存储的容器(如:vector、deque);另一类是以不连续的节点形式存储的容器(如:list、set、map)。在使用erase方法来删除元素时,需要注意一些问题。      在使用list、set或m......
  • 深度解读《深度探索C++对象模型》之默认构造函数
    接下来我将持续更新“深度解读《深度探索C++对象模型》”系列,敬请期待,欢迎关注!也可以关注公众号:iShare爱分享,主动获得推文。提到默认构造函数,很多文章和书籍里提到:“在需要的时候编译器会自动生成一个默认构造函数”。那么关键的问题来了,到底是什么时候需要?是谁需要?比如下面的......