(五)ROS2学习--创建调用其它包接口的一个发布者

这里写自定义目录标题

  • 一、背景
  • 二、构建步骤
    • 1. 构建项目包
    • 2. 创建消息接口
    • 3. 修改“package.xml”
    • 4. 修改"src/smart_car/CMakeLists.txt"
    • 5. 创建发布者程序
  • 三、编译及验证
    • 1. 编译
    • 2. 验证

一、背景

主机:Ubuntu20.04
介绍:基于上一篇(四)ROS2学习–第一个ROS2项目(创建一个客制化接口),本片教程将会在新的包里面创建新的发布者publisher,发布到上一篇文章创建的topic,另外创建新的接收者subscriber也可以参考本篇文章。

二、构建步骤

1. 构建项目包

  • 首先打开上一篇文章所用到的源码目录
cd <Your project path>/ros2_01/src
  • 创建ROS2项目包及msg
ros2 pkg create --build-type ament_cmake car_publish_test
mkdir car_publish_test/msg

创建完成后项目目录结构如下

.
├── build.sh
└── src├── car_publish_test│   ├── CMakeLists.txt│   ├── include│   │   └── car_publish_test│   ├── msg│   ├── package.xml│   └── src└── smart_car├── CMakeLists.txt├── include│   └── smart_car├── msg│   └── Car.msg├── package.xml└── src├── publish_car.cpp└── subscriber_car.cpp11 directories, 8 files

2. 创建消息接口

  • 创建msg文件
    既然要用到上一篇文章创建的接口,就必然与上一个包里的msg文件有所关联,所以我们在路径“ros2_01/src/car_publish_test/msg/”目录下创建一个.msg文件,命名为Car.msg,内容如下:
smart_car/Car[] car

3. 修改“package.xml”

在"package.xml"中添加项目编译时依赖rosidl_default_generators及运行时依赖rosidl_default_runtime及依赖所在的组别。同时,此包依赖上一篇文章中生成的"smart_car", 也要添加编译和运行依赖。添加后的文件内容如下(需要自行修改项目描述description,作者信息maintainer ,以及遵从的license) :

<?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>car_publish_test</name><version>0.0.0</version><description>TODO: Package description</description><maintainer email="your email address">Your name</maintainer><license>TODO: License declaration</license><buildtool_depend>ament_cmake</buildtool_depend><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><buildtool_depend>rosidl_default_generators</buildtool_depend><exec_depend>rosidl_default_runtime</exec_depend><member_of_group>rosidl_interface_packages</member_of_group><build_depend>smart_cat</build_depend><exec_depend>smart_cat</exec_depend><export><build_type>ament_cmake</build_type></export>
</package>

4. 修改"src/smart_car/CMakeLists.txt"

将添加以下内容:

  • 配置msg文件到保存 msg文件列表 的变量中。
  • 添加编译对“smart_car” 包的依赖
  • 通过配置的msg_files变量,rosidl_generate_interfaces接口 将消息列表添加到项目中
  • 添加运行时依赖rosidl_default_runtime
  • find_package(rclcpp REQUIRED)查找编译发布者程序依赖的“rclcpp”包。
  • 最终添加发布者程序编译及安装操作,切记添加"rosidl_target_interfaces"的接口,确保可以使用自定义的接口
set(msg_files"msg/Car.msg"
)find_package(smart_car REQUIRED)rosidl_generate_interfaces(${PROJECT_NAME}${msg_files}DEPENDENCIES smart_car
)ament_export_dependencies(rosidl_default_runtime)find_package(rclcpp REQUIRED)add_executable(publish_car_test src/publish_car_test.cpp)
ament_target_dependencies(publish_car_test rclcpp)install(TARGETSpublish_car_test DESTINATION lib/${PROJECT_NAME})rosidl_target_interfaces(publish_car_test ${PROJECT_NAME} "rosidl_typesupport_cpp")

5. 创建发布者程序

发布者程序“ros2_01/src/car_publish_test/src/publish_car_test.cpp”。
示例代码内容如上篇文章中发布者程序一致:

#include <chrono>
#include <memory>#include "rclcpp/rclcpp.hpp"
#include "smart_car/msg/car.hpp" //包含信息列表的头文件, 规则举例Car.msg->car.h;CarAbc.msg->car_abc.husing namespace std::chrono_literals;
//以下创建一个节点及一个 smart_car TOPIC的发布者
class CarPublisher : public rclcpp::Node
{
public:CarPublisher(): Node("smart_car_publisher"){smart_car_publisher_ =this->create_publisher<smart_car::msg::Car>("smart_car", 100);//以下创建一个定时回调函数auto publish_msg = [this]() -> void {auto message = smart_car::msg::Car();message.direction = message.D_DOWN;message.note = "this is for test 2 ! ";RCLCPP_INFO(this->get_logger(), "Direction: '%d' note: '%s'", message.direction, message.note.c_str());this->smart_car_publisher_->publish(message);};//创建一个定时器,使每秒调用一次publish_msg函数timer_ = this->create_wall_timer(1s, publish_msg);}private://变量声明rclcpp::Publisher<smart_car::msg::Car>::SharedPtr smart_car_publisher_;rclcpp::TimerBase::SharedPtr timer_;
};int main(int argc, char * argv[])
{rclcpp::init(argc, argv);rclcpp::spin(std::make_shared<CarPublisher>());rclcpp::shutdown();return 0;
}

三、编译及验证

首先回到项目的根目录ros2_01

1. 编译

  • 编译依赖包
    注意,因为本篇所生成的包依赖上篇文章生成的"smart_car"的包,因此需要先编译及使能“smart_car”,但如果已经编译及使能则可以忽略
colcon build --packages-up-to smart_car
source install/local_setup.bash
  • 编译 “car_publish_test”包
colcon build --packages-up-to car_publish_test

2. 验证

执行以下命令使发布者程序运行如下:

source install/local_setup.bash
ros2 run car_publish_test publish_car_test

结果如下:
在这里插入图片描述
在新的窗口打开上一篇文章"smart_car"包中的接收者节点,结果如下:
在这里插入图片描述
同时打开"smart_car"中的发布者程序和"car_publish_test"中的发布者程序结果会出现有意思的事情,接收者可以同时接收两个发布者所发布的不同信息如下:
在这里插入图片描述

代码已附

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大话设计模式之工厂模式

工厂模式&#xff08;Factory Pattern&#xff09;是一种创建型设计模式&#xff0c;它提供了一种创建对象的最佳方式&#xff0c;而无需指定将要创建的对象的确切类。通过使用工厂模式&#xff0c;我们可以将对象的创建和使用分离&#xff0c;从而使代码更具灵活性和可维护性。…

音视频处理 - 音频概念详解,码率,采样率,位深度,声道,编码

1. 音频采样 与视频不同&#xff0c;音频的最小单位不是一帧&#xff0c;而是一个采样。 采样是当前一刻声音的声音样本&#xff0c;样本需要经过数字转换才能存储为样本数据。 真实声音是连续的&#xff0c;但是在计算机中&#xff0c;声音是离散且均匀的声音样本。 2. 位深…

22 多态

目录 多态的概念多态的定义及实现抽象类多态的原理单继承和多继承关系中的虚函数表继承和多态常见的面试问题 前言 需要声明的&#xff0c;下面的代码和解释的哦朴实vs2013x86环境&#xff0c;涉及指针是4bytes&#xff0c;如果要其他平台下&#xff0c;部分代码需要改动。比…

ttkbootstrap界面美化系列之Notebook(四)

在简单的界面设计中&#xff0c;Notebook也是常用的组件之一&#xff0c;Notebook组件的引入可以根据标签来切换不同的界面。使得界面更有层次感&#xff0c;不必都挤在一个界面上。在tkinter中就有Notebook组件&#xff0c;在ttkbootstrap中&#xff0c;同样也对Notebook进行了…

四、Yocto创建静态IP和VLAN(基于raspiberrypi 4B)

Yocto创建VLAN配置 在车载域控中很多时候需要创建VLAN&#xff0c;本小节记录如何为yocto构建出来的image自动化创建静态IP以及VLAN。 关于各种VLAN的配置参考&#xff1a;VLAN 1. ubuntu系统中使用netplan创建VLAN 正常情况下我们在ubuntu系统中可以通过netplan来自动化创建…

会话跟踪技术(Session 以及Cookie)

一: 前提概要 1>会话: 会话指的是用户打开浏览器, 访问某些web服务器资源的时候, 会话就会进行建立, 直到有一方断开, 那么会话才会结束, 需要注意的一点是, 一次的会话可以有多次的请求以及响应 2>会话跟踪: 是一种用于维护浏览器状态的方法, 服务器需要识别多次的请求,…

CTF题型 php://filter特殊编码绕过小汇总

CTF题型 php://filter特殊编码绕过小汇总 文章目录 CTF题型 php://filter特殊编码绕过小汇总特殊编码base64编码string过滤器iconv字符集 例题1.[Newstarctf 2023 week2 include]2.[Ctfshow web 117] php://filter 是一个伪协议&#xff0c;它允许你读取经过过滤器处理的数据流…

Jmeter 从登录接口提取cookie 并 跨线程组调用cookie (超详细)

文章目录 一、开始前的准备二、 业务场景介绍三、从登录接口提取cookies四、跨线程组调用cookies 一、开始前的准备 1、安装Jmeter&#xff0c;参考文章&#xff1a;JMeter 3.1 和JMeterPlugin的下载安装 2、设置配置文件使Cookie管理器保存cookie信息。 修改apache-jmeter-x…

C语言:编译和链接

前言 在ANSI C的任何一种实现中&#xff0c;存在两个不同的环境。 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令&#xff08;二进制指令&#xff09;。第2种是执行环境&#xff0c;它用于实际执行代码。 目录 1.翻译环境1.1 预处理&#xff08;预编…

iOS - Runtime - Class-方法缓存(cache_t)

文章目录 iOS - Runtime - Class-方法缓存(cache_t)1. 散列表的存取值 iOS - Runtime - Class-方法缓存(cache_t) Class内部结构中有个方法缓存&#xff08;cache_t&#xff09;&#xff0c;用散列表&#xff08;哈希表&#xff09;来缓存曾经调用过的方法&#xff0c;可以提高…

vlan间单臂路由

【项目实践4】 --vlan间单臂路由 一、实验背景 实验的目的是在一个有限的网络环境中实现VLAN间的通信。网络环境包括两个交换机和一个路由器&#xff0c;交换机之间通过Trunk链路相连&#xff0c;路由器则连接到这两个交换机的Trunk端口上。 二、案例分析 在网络工程中&#…

Qt 完成图片的缩放拖动

1. 事件和函数 主要使用事件paintEvent(QPaintEvent *event)和drawTiledPixmap函数实现绘图。 paintEvent事件在改变窗口大小、移动窗口、手动调用update等情形下会被调用。需先了解下绘图该函数的用法。 - QPainter::drawTiledPixmap(int x, int y, int w, int h, const QPi…

数据运营分析-详解

一、指标与指标体系 指标体系就是业务逻辑的框架,也是思考业务逻辑的第一步 案例: 老板,我负责的用户活跃,主要考察每天启动产品的注册用户数量,整体来看,每月活跃保持7.3%的增长,是因为渠道团队的拉新活动带来很多新增注册用户,占每月活跃用户的40%,新一年会继续沿…

计算机网络⑦ —— 网络层协议

1. ARP协议 在传输⼀个 IP 数据报的时候&#xff0c;确定了源 IP 地址和⽬标 IP 地址后&#xff0c;就会通过主机路由表确定 IP 数据包下⼀跳。然⽽&#xff0c;⽹络层的下⼀层是数据链路层&#xff0c;所以我们还要知道下⼀跳的 MAC 地址。由于主机的路由表中可以找到下⼀跳的…

Python-基础部署

机器没法直接读懂我们写的代码&#xff0c;需要解释解释器作为中间的翻译&#xff0c;把代码转换成字节码在执行 安装python解释器 Download Python | Python.org 安装代码编辑器 pycharm Thank you for downloading PyCharm! 创建一个项目&#xff0c;每个项目里的文件夹…

Android Studio Iguana | 2023.2.1 补丁 1

Android Studio Iguana | 2023.2.1 Canary 3 已修复的问题Android Gradle 插件 问题 295205663 将 AGP 从 8.0.2 更新到 8.1.0 后&#xff0c;任务“:app:mergeReleaseClasses”执行失败 问题 298008231 [Gradle 8.4][升级] 由于使用 kotlin gradle 插件中已废弃的功能&#…

9、jenkins微服务持续集成(一)

文章目录 一、流程说明二、源码概述三、本地部署3.1 SpringCloud微服务部署本地运行微服务本地部署微服务3.2 静态Web前端部署四、Docker快速入门一、流程说明 Jenkins+Docker+SpringCloud持续集成流程说明 大致流程说明: 开发人员每天把代码提交到Gitlab代码仓库Jenkins从G…

Linux---命令行参数

一、命令行参数 在介绍命令行参数前&#xff0c;我想问大家一个问题&#xff0c;在以前写C/C时&#xff0c;main 函数可不可以带参数&#xff1f; 答案是可以带的&#xff0c;int main(int argc, char* argv[]){}&#xff0c;但平时写代码时也证明了&#xff0c;main 函数的参…

【实验报告】--基础VLAN

【VLAN实验报告】 一、项目背景 &#xff08;为 Jan16 公司创建部门 VLAN&#xff09; Jan16 公司现有财务部、技术部和业务部&#xff0c;出于数据安全的考虑&#xff0c;各部门的计算机需进 行隔离&#xff0c;仅允许部门内部相互通信。公司拓扑如图 1 所示&#xff0c; …

leetcode:392. 判断子序列

题目&#xff1a; class Solution { public:bool isSubsequence(string s, string t) {} }; 题解&#xff1a; 很巧妙的题解&#xff1a;循环遍历两个字符串&#xff0c;两个字符串都没遍完就继续遍历&#xff0c;字符串s先遍历完结果为true&#xff0c;字符串t先遍历完结果为…