首页 > 编程语言 >ROS2创建简单的C++功能包

ROS2创建简单的C++功能包

时间:2024-07-01 18:27:47浏览次数:22  
标签:cmake package 创建 rclcpp helloworld cpp C++ ament ROS2

1.创建功能包

终端下,进入ws00_helloworld/src目录,使用如下指令创建一个C++功能包:

ros2 pkg create pkg01_helloworld_cpp --build-type ament_cmake --dependencies rclcpp --node-name helloworld

执行完毕,在src目录下将生成一个名为pkg01_helloworld_cpp的目录,且目录中已经默认生成了一些子级文件与文件夹。

2.编辑源文件

进入pkg01_helloworld_cpp/src目录,该目录下有一helloworld.cpp文件,修改文件内容如下:

#include "rclcpp/rclcpp.hpp"

int main(int argc, char ** argv)
{
  // 初始化 ROS2
  rclcpp::init(argc,argv);
  // 创建节点
  auto node = rclcpp::Node::make_shared("helloworld_node");
  // 输出文本
  RCLCPP_INFO(node->get_logger(),"hello world!");
  // 释放资源
  rclcpp::shutdown();
  return 0;
}
3.编辑配置文件

在步骤1创建功能包时所使用的指令已经默认生成且配置了配置文件,不过实际应用中经常需要自己编辑配置文件,所以在此对相关内容做简单介绍,所使用的配置文件主要有两个,分别是功能包下的package.xml与CMakeLists.txt。

1.package.xml

文件内容如下:

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>pkg01_helloworld_cpp</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="[email protected]">ros2</maintainer>
  <license>TODO: License declaration</license>

  <buildtool_depend>ament_cmake</buildtool_depend>

  <!-- 所需要依赖 -->
  <depend>rclcpp</depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

注释部分以后需要根据实际的包依赖进行添加或修改。

2.CMakeLists.txt

文件内容如下:

cmake_minimum_required(VERSION 3.8)
project(pkg01_helloworld_cpp)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
# 引入外部依赖包
find_package(rclcpp REQUIRED)

# 映射源文件与可执行文件
add_executable(helloworld src/helloworld.cpp)
# 设置目标依赖库
ament_target_dependencies(
  helloworld
  "rclcpp"
)
# 定义安装规则
install(TARGETS helloworld
  DESTINATION lib/${PROJECT_NAME})

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # comment the line when a copyright and license is added to all source files
  set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # comment the line when this package is in a git repo and when
  # a copyright and license is added to all source files
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

中文注释部分以后可能需要根据实际情况修改。

4.编译

终端下进入到工作空间,执行如下指令:

colcon build
5.执行

终端下进入到工作空间,执行如下指令:

. install/setup.bash
ros2 run pkg01_helloworld_cpp helloworld

程序执行,在终端下将输出文本:"hello world!"。

标签:cmake,package,创建,rclcpp,helloworld,cpp,C++,ament,ROS2
From: https://blog.csdn.net/weixin_47378530/article/details/140102908

相关文章

  • 华为OD机试D卷 --最大括号深度--24年OD统一考试(Java & JS & Python & C & C++)
    文章目录题目描述输入描述输出描述用例题目解析算法源码题目描述现有一字符串仅由‘(‘,’)’,‘{‘,’}’,’[‘,’]’六种括号组成。若字符串满足以下条件之一,则为无效字符串:①任一类型的左右括号数量不相等;②存在未按正确顺序(先左后右)闭合的括号。输出......
  • Python武器库 - 科研中常用的python图像操作 - 创建纯色图像
    应用场景:需要创建纯色图像,作为背景图,在此基础上添加文字、形状、新的图片等等原理:cv2的读取图片操作本质上是将图片转换为uint8的numpy.ndarray类型,后续的其他图像操作,本质上也是对于这个ndarray对象的操作首先用numpy创建一个形状为(224,224,3)、元素值为均为0的ndarra......
  • C++纯虚函数的理解,纯虚函数和派生类的关系。
    在C++中,纯虚函数(purevirtualfunction)是一种特殊的虚函数,它在基类中没有实现,只定义了一个接口,要求派生类必须提供具体实现。纯虚函数的定义方式在接口设计和多态性中非常有用。纯虚函数的定义和语法在C++中,纯虚函数的定义使用以下语法:classBase{public:virtual......
  • 【算法炼金术】让数字起舞:两数相加的C++艺术
    【算法炼金术】让数字起舞:两数相加的C++艺术一、引言:编织数字的魔法二、技术概述:数字的交响乐章技术定义核心特性代码示例:原味经典三、技术细节:数字的幕后故事原理解析难点剖析四、实战应用:数字的舞台秀应用场景问题与解决方案问题:大数相加易溢出五、优化与改进:数字......
  • 【算法】搜索插入位置:C++ 实现与深入理解
    【算法】搜索插入位置:C++实现与深入理解一、引言:C++算法的精髓与探索之旅二、技术概述:有序数组的探索定义与技术介绍核心特性和优势代码示例三、技术细节:二分查找的奥秘原理解析难点分析四、实战应用:排序数组的高效操作应用场景问题与解决方案五、优化与改进潜在问题......
  • navicat使用Oracle(创建库以及用户,详细教程!!!)
    1.首先准备好navicat和已经安装Oracle数据库2.打开navicat新建连接,3.用户名和密码是安装Oracle数据库时候创建的(登录高级用户)4.测试连接5.开始建库:orcale中库的概念可以理解为用户,也就是所谓的表空间,并且每建立一个表空间都需要建立一个用户绑定然后登陆。(一个用户只能......
  • c++ final 关键字
    在C++中,final是一个关键字,它主要用于两个上下文:类继承的终结:当你在类定义后使用final关键字时,这意味着该类不能被其他类继承。这是C++11引入的特性。classMyClassfinal{//...};//下面的代码会导致编译错误,因为MyClass是final的classDerivedClass:pub......
  • c++使用matplotlibcpp,subplot() 报错问题-ubuntu22.04
    使用matplotlibcpp.h在C++代码中绘制图形plt::subplot();程序抛出运行时错误,terminatecalledafterthrowinganinstanceof'std::runtime_error'what():Calltosubplot()failed.解决方法:在matplotlibcpp.h文件中把PyTuple_SetItem(args,0,PyFloat_FromDouble(......
  • C++知识点总结全系列 (05):IO 类的详细总结和分析
    1、基类istream和ostream(1)istreamA.What输入流的抽象类,是所有输入流类的基类B.Why(输入流的作用)用于从数据源(如文件、标准输入设备等)读取数据(2)ostreamA.What输出流的抽象类,是所有输出流类的基类B.Why(输出流的作用)输出流用于将数据写入到目标位置,例如......
  • 如何使用Express.js创建一个基本的路由?
    在现代Web开发或面试过程中,Express.js成为了必不可少的一部分。Express.js是Node.js的一个非常受欢迎和强大的框架,而创建路由是这个框架的核心功能之一。在这篇文章中,我们将详细介绍如何使用Express.js创建一个基本的路由,并附上示例代码帮助你理解。什么是路由?路由决定了......