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

2024-03-30 11:44

本文主要是介绍(五)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"中的发布者程序结果会出现有意思的事情,接收者可以同时接收两个发布者所发布的不同信息如下:
在这里插入图片描述

代码已附

这篇关于(五)ROS2学习--创建调用其它包接口的一个发布者的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/861398

相关文章

JAVA中整型数组、字符串数组、整型数和字符串 的创建与转换的方法

《JAVA中整型数组、字符串数组、整型数和字符串的创建与转换的方法》本文介绍了Java中字符串、字符数组和整型数组的创建方法,以及它们之间的转换方法,还详细讲解了字符串中的一些常用方法,如index... 目录一、字符串、字符数组和整型数组的创建1、字符串的创建方法1.1 通过引用字符数组来创建字符串1.2

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

java如何调用kettle设置变量和参数

《java如何调用kettle设置变量和参数》文章简要介绍了如何在Java中调用Kettle,并重点讨论了变量和参数的区别,以及在Java代码中如何正确设置和使用这些变量,避免覆盖Kettle中已设置... 目录Java调用kettle设置变量和参数java代码中变量会覆盖kettle里面设置的变量总结ja

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal