ROS中不同情况下配置文件的编写

配置文件

  • 话题中自定义msg
    • 1. 编写msg
    • 2. 编辑package.xml
    • 3. 编辑CMakeLists.txt
    • 4. 编译
    • 5. 使用
    • 5. 在其他功能包中调用msg
      • 5.1 编辑package.xml
      • 5.2 编辑CMakeLists.txt
  • 服务中自定义srv
    • 1. 编写srv
    • 2. 其他
  • 调用头文件
    • 1. 编写头文件
    • 2. (可选,为了编程时有代码提示)
    • 3. 编写源文件来调用头文件
    • 4. 编写CMakeLists.txt
  • 调用源文件
    • 1 2(与之前相同)
    • 3. 编写源文件来对头文件实现
    • 4. 编写源文件来调用实现
    • 5. 编写CMakeLists.txt
  • A包调B包的库函数
    • 对B包编写CMakeLists.txt
    • 对A包编写package.xml
    • 对A包编写CMakeLists.txt
    • CMake可以使用message来查看一些信息

话题中自定义msg

1. 编写msg

在功能包(如plumbing_pub_sub)下创建msg目录,然后在msg目录中创建.msg文件,例如:Test.msg,内容:

float32[] data
float32 vel
geometry_msgs/Pose pose
string name

2. 编辑package.xml

package.xml中添加编译时依赖(message_generation)与执行时依赖(message_runtime)

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

3. 编辑CMakeLists.txt

find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generationgeometry_msgs
)
#上面的msg文件中用到了geometry_msgs/Pose类型,那么必须查找geometry_msgs
# 配置 msg 源文件
add_message_files(FILESTest.msg
)
# 生成消息时依赖于 std_msgs和geometry_msgs
# generate_messages必须在catkin_package前面
generate_messages(DEPENDENCIESstd_msgsgeometry_msgs
)
#执行时依赖
catkin_package(
CATKIN_DEPENDS roscpp rospy std_msgs geometry_msgs message_runtime
)

4. 编译

编译之后,在/devel/include/pkg/下就会出现对应的Test.h头文件方便调用。

5. 使用

使用就是正常导入头文件即可。
需要注意的是,如果没有执行步骤4,那么需要在CMakeLists.txt中添加:

#node 是要编译的目标文件, 就是add_executable()中的第一个名字。因此add_dependencies要写在add_executable之后
add_dependencies(node ${PROJECT_NAME}_gencpp)

5. 在其他功能包中调用msg

以下步骤仅在需要调用的包下设置:

5.1 编辑package.xml

维护软件包清单的更新

<build_depend>plumbing_pub_sub</build_depend>
<exec_depend>plumbing_pub_sub</exec_depend>

5.2 编辑CMakeLists.txt

find_package(catkin REQUIRED COMPONENTSplumbing_pub_sub
)
add_dependencies(current_node plumbing_pub_sub_gencpp)  
#current_node 是当前要编译的目标二进制文件
#add_dependencies要写在add_executable之后

add_dependencies是防止编译当前功能包时plumbing_pub_sub还没有被编译。并不是必须,但是最好加上。

服务中自定义srv

1. 编写srv

在功能包下创建srv目录,然后在msg目录中创建.srv文件,例如:Test.srv,内容:

int32 num1
int32 num2
---
int32 sum

2. 其他

除了在CMakelist.txt中将add_message_files的部分改成add_service_files对应部分:

add_service_files(FILESTest.srv
)

其他与写msg都相同。

调用头文件

1. 编写头文件

编写头文件 a.h, 放入pkg/include/head_dict/a.h
例如: 在功能包plumbing_head下写了hello/hello.h,那么应该放在 plumbing_head/include/hello/hello.h
其中, hello.h内容如下:

#ifndef _HELLO_H   //避免重复定义
#define _HELLO_H
namespace hello_ns{
class MyHello{
public:void run();
};
}#endif

2. (可选,为了编程时有代码提示)

在VSCode中的c_cpp_properties.json文件中添加

"includePath": [,"自己的路径/plumbing_head/include/**"]

3. 编写源文件来调用头文件

例如:编写hello.cpp

#include "ros/ros.h"
#include "hello/hello.h"namespace hello_ns{void MyHello::run(){ROS_INFO("running ......");}
}int main(int argc, char* argv[]){ros::init(argc, argv, "hello_head");hello_ns::MyHello myHello;myHello.run();return 0;
}

4. 编写CMakeLists.txt

include 取消注释

include_directories(
include   #就是将当前包下的include路径加进去${catkin_INCLUDE_DIRS}
)

其他正常:

add_executable(hello src/hello.cpp)
# add_dependencies似乎不是必须
add_dependencies(hello ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})  
target_link_libraries(hello${catkin_LIBRARIES}
)

调用源文件

1 2(与之前相同)

第一步和第二步与之前相同

3. 编写源文件来对头文件实现

例如:编写hello.cpp

#include "ros/ros.h"
#include "hello/hello.h"namespace hello_ns{void MyHello::run(){ROS_INFO("running ......");}
}

4. 编写源文件来调用实现

例如:编写test_hello.cpp

#include "ros/ros.h"
#include "hello/hello.h"int main(int argc, char* argv[]){ros::init(argc, argv, "hello_head");hello_ns::MyHello myHello;myHello.run();return 0;
}

5. 编写CMakeLists.txt

include_directories(include 			${catkin_INCLUDE_DIRS}
)add_library(hello_libsrc/hello.cpp
)

其他正常:

add_executable(test_hello src/test_hello.cpp)
add_dependencies(test_hello ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})target_link_libraries(test_hello ${catkin_LIBRARIES}
)

A包调B包的库函数

对B包编写CMakeLists.txt

继续用上面例子,catkin_package用于指定该包的一些基本信息,提供头文件和库供其他软件包使用。
catkin_package让其他包在使用 find_package(catkin REQUIRED COMPONENTS ...) 后自动引入你的软件包提供的头文件和库,而不需要显式指定。

catkin_package(
INCLUDE_DIRS includeLIBRARIES hello_lib
)include_directories(include 			${catkin_INCLUDE_DIRS}
)add_library(hello_libsrc/hello.cpp
)

INCLUDE_DIRS include是将自己的INCLUDE_DIRS指定为的include的绝对路径,LIBRARIES hello_lib就是将自己的hello_lib加入到该包的库中。
这样其他包可以使用找到此头文件头文件的实现

对A包编写package.xml

<build_depend>B_PKG_NAME</build_depend>
<exec_depend>B_PKG_NAME</exec_depend>

对A包编写CMakeLists.txt

find_package(catkin REQUIRED COMPONENTSB_PKG_NAME
)

CMake可以使用message来查看一些信息

message(STATUS "B_PKG_NAMEd_LIBRARIES = ${B_PKG_NAME_INCLUDE_DIRS}")
message(STATUS "B_PKG_NAME_LIBRARIES = ${B_PKG_NAME_INCLUDE_DIRS}")

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

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

相关文章

opencv+python(二值化图像)

1、全局二值化&#xff1a;将图像全部变成两种值&#xff0c;比如&#xff1a;0&#xff0c;255 threshold(src: ndarray&#xff08;图像&#xff0c;最好是灰度图&#xff09; thresh: float,&#xff08;阙值&#xff09; maxval: float,&…

function 包装器 ——C++新特性(二)

文章目录 包装器function包装器可以包装可调用对象其他使用示例 &#x1f396; 博主的CSDN主页&#xff1a;Ryan.Alaskan Malamute &#x1f4dc; 博主的代码仓库主页 [ Gitee ]&#xff1a;ryanala [GitHub]&#xff1a; Ryan-Ala 包装器 function 使用 function包装器…

身份证二、三、四要素实名认证接口、C#开发示例

在瞬息万变的网络时空&#xff0c;每一次点击&#xff0c;每一份交易都离不开对“你是谁”的确认。想象一下&#xff0c;当我们畅游在网络的海洋中&#xff0c;无论是注册心仪已久的APP还是在线办理重要的业务&#xff0c;甚至是在虚拟世界中结交新朋友等活动时&#xff0c;只需…

Selenium+Chrome Driver 爬取搜狐页面信息

进行selenium包和chromedriver驱动的安装 安装selenium包 在命令行或者anaconda prompt 中输入 pip install Selenium 安装 chromedriver 先查看chrome浏览器的版本 这里是 123.0.6312.106 版 然后在http://npm.taobao.org/mirrors/chromedriver/或者https://googlechrom…

EasyPOI复杂表格导入

EasyPOI复杂表格导入 多表头数据导入方式一导入表格实体类文件导入代码测试结果 方式二导入表格实体类文件导入代码测试结果 总结 设置表格从哪行读取表格内容 多表头数据导入 方式一 导入的表格样式如下 导入表格实体类 package com.demo.entity;import cn.afterturn.eas…

基于令牌桶算法对高并发接口的优化

业务背景 项目中有一个抽奖接口&#xff0c;此接口需要处理高并发问题以及使用脚本作弊的问题。 本文主要探讨如何最大程度地减少脚本作弊行为对抽奖业务的影响。 设计思路 如何减少脚本作弊行为对抽奖业务的影响 使用令牌桶算法&#xff0c;对频率过高的用户请求进行拦截 …

pdffactory pro 8注册码序列号下载 附教程

PdfFactory Pro可以说是一款行业专业且技术领先的的PDF虚拟打印机软件。其不仅占用系统内存小巧&#xff0c;功能强大&#xff0c;可支持用户无需使用Acrobat来创建Adobe PDF即可以进行PDF组件的创建和打印。同时&#xff0c;现在全新的PdfFactory Pro 8也正式上线来袭&#xf…

(源码+部署+讲解)基于Spring Boot + Vue编程学习平台的设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31f;…

Hadoop简介

Hadoop 1、 Hadoop的介绍 Hadoop最早起源于Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎&#xff0c;包括网页抓取、索引、查询等功能&#xff0c;但随着抓取网页数量的增加&#xff0c;遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。2003年、20…

【数据结构】考研真题攻克与重点知识点剖析 - 第 7 篇:查找

前言 本文基础知识部分来自于b站&#xff1a;分享笔记的好人儿的思维导图与王道考研课程&#xff0c;感谢大佬的开源精神&#xff0c;习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析&#xff0c;本人技术…

开源铱塔切换MySQL数据库启动报异常

1.错误日志&#xff1a; 铱塔切换数据库配置为MySQL之后&#xff0c;启动后报错如下&#xff1a; SqlExceptionHelper - Table iotkit.task_info doesnt exist SqlExceptionHelper - Table iotkit.rule_info doesnt exist SqlExceptionHelper - Table iotkit.device_info does…

(WSI分类)WSI分类文献小综述 2024

2024的WSI分类。 Multiple Instance Learning Framework with Masked Hard Instance Mining for Whole Slide Image Classification &#xff08;ICCV2024&#xff09; 由于阳性组织只占 Gi- gapixel WSI 的一小部分&#xff0c;因此现有的 MIL 方法直观上侧重于通过注意力机…

Redis的常见命令

单线程&#xff1a;每个命令具备原子性 低延迟&#xff0c;速度快&#xff08;基于内存、IO多路复用、良好的编码&#xff09; 支持数据持久化 支持主从集群、分片集群 支持多语言客户端 2.Redis数据库介绍 Redis是一个key-value的数据库&#xff0c;key一般是String类型…

(源码+部署+讲解)基于Spring Boot + Vue的车位租赁系统设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《100套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31f;…

Apache Incubator Answer 本地开发部署

文章目录 简介Github文档插件部署 Answer开发环境编译项目初始化项目运行项目 简介 一款适合任何团队的问答平台软件。 Apache Incubator Answer是一个开源项目&#xff0c;它是一个用于构建和部署问答系统的框架。该项目是Apache软件基金会的孵化器项目&#xff0c;提供一个…

Nginx流媒体服务器RTMP直播同步录像

目录 一、环境 1、以下见往期文章 2、ffmpeg支持 二、建立录像路径

vscode 关键字记录

vscode 关键字记录&#xff1a; ${workspaceFolder}&#xff1a;当前工作区&#xff08;Workspace&#xff09;的根目录路径。${file}&#xff1a;当前打开文件的路径。如a/b/c/test.cpp。${fileDirname}&#xff1a;当前打开文件的目录路径。比如文件 test.cpp 位于 a/b/c&am…

自动驾驶中的传感器融合算法

目录 引言 一、传感器融合算法步骤 二、卡尔曼滤波 (Kalman Filter) 1. 卡尔曼滤波的原理 1.1. 预测步骤&#xff08;Predict&#xff09; 1.2. 更新步骤&#xff08;Update&#xff09; 2. 卡尔曼滤波在自动驾驶中的应用 2.1. 位置和姿态估计 2.2. 目标跟踪和感知 2…

【centos】Redis离线安装配置教程

Linux 离线安装Redis配置教程 一、下载二、安装redis三、设置redis开机自启&#xff0c;并且添加到系统服务四、gcc安装 redis官网地址&#xff1a;https://redis.io/ 一、下载 【点击进入下载地址&#xff1a;http://download.redis.io/releases/】选择安装包&#xff1a;re…

uniapp 地图分幅网格生成 小程序基于map组件

// 获取小数部分 const fractional function(x) {x Math.abs(x);return x - Math.floor(x); } const formatInt function(x, len) {let result x;len len - result.length;while (len > 0) {result 0 result;len--;}return result; }/*** 创建标准分幅网格* param …