【ROS2笔记三】构建ROS2功能包

news2024/11/29 2:31:53

3.构建ROS2功能包

文章目录

  • 3.构建ROS2功能包
    • 3.1ROS2中包的组成部分
    • 3.2创建ROS2功能包并编写节点
      • 3.2.1使用CMake创建功能包
      • 3.2.2编写cpp节点代码
    • 3.3编译运行节点
    • 3.4使用面向对象的方式编写ROS2节点
    • 3.5使用RCLPY编写节点
    • Reference

3.1ROS2中包的组成部分

ROS2可以使用CMake或者Python来创建工作包,使用cpp进行开发推荐使用CMake,使用python进行开发推荐使用Python来创建包。

ROS2 PythonCMake各自有自己的最低要求内容:

CMake:

  • CMakeLists.txt描述如何在包中构建代码的文件
  • include/<package_name>包含包的公共标头的目录
  • package.xml包含有关包的元信息的文件
  • src包含包的源代码的目录

Python:

  • package.xml包含有关包的元信息的文件
  • resource/<package_name>包的标记文件
  • setup.cfg当包有可执行文件时是必需的,因此可以找到它们ros2 run
  • setup.py包含如何安装软件包的说明
  • <package_name>- 与您的包同名的目录,ROS 2 工具使用它来查找您的包,包含__init__.py

3.2创建ROS2功能包并编写节点

在创建ROS2功能包之前,确保你已经位于工作空间当中,这里我的工作空间命名为colcon_test02_ws

cd colcon_test02_ws/src

创建功能包,推荐使用ament_cmake(cpp)或ament_python(python)作为编译类型,并且添加rclcpp依赖。

3.2.1使用CMake创建功能包

1.创建一个包,在ROS2中创建新包的命令语法是:

ros2 pkg create <package_name> --build-type ament_cmake --license Apache-2.0 --dependencies rclcpp
  • pkg create 是创建包的意思
  • --build-type 用来指定该包的编译类型,一共有三个可选项ament_pythonament_cmakecmake
  • --license 用于制定证书,一般设置为Apache-2.0,如果不指定的话会弹出一个警告但是没有别的影响
  • --dependencies 指的是这个功能包的依赖,这里使用的依赖是rclcpp

这里使用以下语句构建了一个包

ros2 pkg create example_cpp --build-type ament_cmake --dependencies rclcpp --license Apache-2.0

构建完毕后,包内的目录为:

.
├── CMakeLists.txt
├── include
│   └── example_cpp
├── LICENSE
├── package.xml
└── src

3 directories, 3 files

2.编译新创建的包,在ROS2中的编译命令为:

colcon build

但是这条命令会编译整个工作空间,非常耗时,如果我们只想编译构建特定的功能包可以使用:

colcon build --packages-select <my_package>

这里使用了以下的命令来构建上面创建的功能包

colcon build --packages-select example_cpp

构建完毕后,结果如下:

Starting >>> example_cpp
Finished <<< example_cpp [1.46s]                  

Summary: 1 package finished [1.72s]

3.2.2编写cpp节点代码

1.首先编写脚本代码,我们在example_cpp/src下创建一个脚本文件node01.cpp,编写下列代码

#include "rclcpp/rclcpp.hpp"

int main(int argc, char **argv){
    // 初始化rclcpp
    rclcpp::init(argc, argv);
    // 产生一个节点,并命名为node01
    auto node = std::make_shared<rclcpp::Node>("node01");
    // 打印消息
    RCLCPP_INFO(node->get_logger(), "node01 has already launched");
    rclcpp::spin(node);
    // 停止运行
    rclcpp::shutdown();

    return 0;
}

2.然后配置CMakeLists.txt

将其添加为可执行文件,在CMakeLists.txt最后一行(ament_package()之前)加入

add_executable(node01 src/node01.cpp)
ament_target_dependencies(node01 rclcpp)

并且使用install指令将其安装到install目录中,在上面两行代码的后面加入

install(TARGETS
  node01
  DESTINATION lib/${PROJECT_NAME}
)

修改完毕的CMakeLists.txt文件看起来像

cmake_minimum_required(VERSION 3.8)
project(example_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)

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()

add_executable(node01 src/node01.cpp)
ament_target_dependencies(node01 rclcpp)
install(TARGETS
  node01
  DESTINATION lib/${PROJECT_NAME}
)
ament_package()

3.3编译运行节点

进入到工作空间

cd <your_workspace>

然后编译指定的功能包

colcon build --packages-select example_cpp

然后source一下,运行节点

source install/setup.bash
ros2 run example_cpp node01

结果如下:

Image

3.4使用面向对象的方式编写ROS2节点

在之前的功能包example_cpp中,我们使用面向对象编成的方式来重构代码,新建一个node02.cpp脚本文件,然后输入以下的代码

#include "rclcpp/rclcpp.hpp"
#include <string>

// 构建一个类节点Node02,该节点继承自rclcpp::Node
class Node02: public rclcpp::Node
{
public:
    // 构造函数,传入的参数为节点的名字
    Node02(std::string name) : Node(name)       // 调用了基类的构造函数rclcpp::Node
    {
        RCLCPP_INFO(this->get_logger(), "node02 has already launched");
    }
private:

};

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

然后添加配置文件

add_executable(node02 src/node02.cpp)
ament_target_dependencies(node02 rclcpp)
install(TARGETS
  node02
  DESTINATION lib/${PROJECT_NAME}
)

然后运行

cd <your_workspace>
colcon build
source ./install/setup.bash
ros2 run example_cpp node02

结果如下:

Image

3.5使用RCLPY编写节点

整个流程省略了,可以参考d2lros2和编写一个简单的服务和客户端Python。

Reference

d2lros2
ROS2 Tutorial

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1586759.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ELK日志分析系统+Filebeat

目录 一、Filebeat介绍 1、Filebeat简介 2、Filebeat的工作方式 3、filebeat工作流程 4、Filebeat的作用 5、filebeat的用途 1.为什么要用filebeat来收集日志&#xff1f;为什么不直接用logstash收集日志&#xff1f; 2.filebeat和logstash的区别 二、部署(ELFK)Fileb…

【web开发01】前端开发HTML、CSS-新浪新闻的实现

前端开发HTML、CSS-新浪新闻的实现 1 实现标题排版1.1图片连接的三种方式1.2 具体代码1.3 总结1.< h1>到< h6>是标题从大到小 2 实现标题样式2.1 css的三种引入方式2.2 颜色的三种表示2.3 css选择器2.4 超链接 3 实现正文排版3.1 视频标签 video3.2 音频标签 audio…

【网安小白成长之路】6.pkachu、sql-lbas、upload-lbas靶场搭建

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…

Python操作MongoDB - 常用操作

1、连接MongoDB 可以下载使用客户端&#xff1a;MangoDB Compass # 连接数据库&#xff0c;INT_MONGO是INT环境mongo的连接串 mongo_client pymongo.MongoClient(INT_MONGO)2、访问数据库 # 访问数据库Pytest db mongo_client["Pytest"]3、创建集合&#xff08;…

文件加密软件大全,按市场份额排名

文件加密软件大全&#xff0c;按市场份额排名 文件加密是一种保护数据安全的重要手段&#xff0c;通过使用特定的算法将明文文件转化为密文&#xff0c;以防止未经授权的访问、篡改或泄露&#xff0c;市场份额排名的八款软件你需要了解一下。 1、安企神软件 专注于加密和审计…

漏洞挖掘 SSRF 一次很菜的SSRF低危小通杀

前言 一转眼貌似很长时间都没更新博客了&#xff0c;甚至连标题的大小和格式都有点忘了&#xff0c;今后应该尽量保持每周更新一次&#xff0c;主要是平常上课太忙了&#xff0c;在学校还总是不定时会刷新一些烂事&#xff0c;就耽误了很多时间。这篇文章用于记载我最近的一次…

深入理解MD5算法:原理、应用与安全

title: 深入理解MD5算法&#xff1a;原理、应用与安全 date: 2024/4/11 20:55:57 updated: 2024/4/11 20:55:57 tags: MD5算法数据安全哈希函数摘要算法安全漏洞SHA算法密码学 第一章&#xff1a;引言 导言 在当今数字化时代&#xff0c;数据安全和完整性变得至关重要。消息…

gradio简单搭建——关键词简单筛选【2024-4-11优化】

gradio简单搭建——关键词简单筛选[2024-4-11 优化] 新的思路&#xff1a;标签自动标注界面搭建优化数据处理与生成过程交互界面展示 新的思路&#xff1a;标签自动标注 针对通过关键词&#xff0c;在文本数据中体现出主体的工作类型这一任务&#xff0c;这里使用展示工具grad…

Claude使用教程

claude 3 opus面世后&#xff0c;网上盛传吊打了GPT-4。网上这几天也已经有了许多应用&#xff0c;但竟然还有很多小伙伴不知道国内怎么用gpt&#xff0c;也不知道怎么去用这个据说已经吊打了gpt-4的claude3。 今天我们想要进行的一项尝试就是—— 用claude3和gpt4&#xff0c…

猝不及防 CCF-B ICPP 2024投稿延期至4月22日提交摘要 机会来了别错过

会议之眼 快讯 第53届ICPP&#xff08;International Conference on Parallel Processing&#xff09;即国际并行处理会议将于 2024年 8月12日-15日在瑞典哥特兰岛举行&#xff01;ICPP是世界上最古老的连续举办的并行计算计算机科学会议之一。它是学术界、工业界和政府的研究…

Vue项目页面中快速使用JSON数据格式化模块插件

页面中快速使用JSON数据格式化模块插件 JSON数据格式化模块插件&#xff0c;可以用来展示JSON数据&#xff0c;也可以验证某数据是否为JSON格式 1、可以使用 b-code-editor插件 来实现效果&#xff0c;方便快捷&#xff0c; 安装命令&#xff1a;npm install bin-code-editor…

suno有了新对手udio炸裂音乐圈;又一个开源AI Devin 程序员;完全开源轻量级的文本到语音可生成特定说话者的风格

✨ 1: udio 由音乐和科技界重量级人物支持的强大 AI 音乐生成器&#xff0c;被称为音乐界的另一个 ChatGPT。 Udio 由前 Google DeepMind的研究院和工程师创立&#xff0c;得到了a16z的支持&#xff0c;总部在伦敦和纽约。 目前是一个免费的V1测试版产品&#xff0c;每个人每…

docker完美安装分布式任务调度平台XXL-JOB

分布式任务调度平台XXL-JOB 1、官方文档 自己看 https://www.xuxueli.com/xxl-job/#1.1%20%E6%A6%82%E8%BF%B0 2、使用docker部署 本人使用的腾讯云&#xff0c;安装docker暴露一下端口&#xff0c;就很舒服的安装这个服务了。 docker pull xuxueli/xxl-job-admin:2.4.03…

飞书api增加权限

1&#xff0c;进入飞书开发者后台&#xff1a;飞书开放平台 给应用增加权限 2&#xff0c;进入飞书管理后台 https://fw5slkpbyb3.feishu.cn/admin/appCenter/audit 审核最新发布的版本 如果还是不行&#xff0c;则需要修改数据权限&#xff0c;修改为全部成员可修改。 改完…

KVM+GFS分布式存储

本章内容&#xff1a; 学会KVMGFS分布式存储高可用 1.0 案例环境 1.案例环境 大规模使用 KVM 虚拟机来运行业务&#xff0c;为了保证公司虚拟机能够安全稳定运行&#xff0c; 决定采用 KVMGlusterFS 模式&#xff0c;来保证虚拟机存储的分布部署&#xff0c;以及分布冗余。避…

2024.4.11

1.思维导图 2.指针形式验证大小端存储 #include<myhead.h>int main(int argc, const char *argv[]) {int num 0x12345678;char* ptr (char *)&num;if(*ptr 0x12){printf("big endian\n");}else if(*ptr 0x78){printf("little endian\n");}r…

正则表达式与JSON序列化:去除JavaScript对象中的下划线键名

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

vue源码解析——v-if和v-for哪个优先级高,如何避免两者同时使用

首先&#xff0c;官方不推荐v-if和v-for在同一个元素上使用。其次&#xff0c;如果两者同时使用&#xff0c;v-if和v-for的优先级怎么确定&#xff1f;在vue2和vue3中这两者的优先级顺序不一样。vue2是v-for优先&#xff0c;条件不存在时也会渲染多个注释节点。在vue3中进行了改…

关于01背包和完全背包问题的细节思考

01背包问题 #include<iostream> #include<stdlib.h> #include<vector> #include<cmath> int main() {int M0; //材料数int N0; //背包容量std::cin>>M>>N;std::vector<int>space(M,0);for(int i0;i<M;i) std::cin>>…

Nodejs 第六十二章(短链接)

短链接介绍 短链接是一种缩短长网址的方法&#xff0c;将原始的长网址转换为更短的形式。它通常由一系列的字母、数字和特殊字符组成&#xff0c;比起原始的长网址&#xff0c;短链接更加简洁、易于记忆和分享。 短链接的主要用途之一是在社交媒体平台进行链接分享。由于这些…