当前位置: 首页 > news >正文

ROS(Robot Operating System)中,编写一个记录机器人速度并将其转换成轨迹

在ROS(Robot Operating System)中,编写一个记录机器人速度并将其转换成轨迹的类涉及到几个步骤。以下是一个简单的示例,展示了如何创建这样一个类,并将其放置在一个自定义的命名空间中。这个类将订阅机器人的速度信息,记录这些信息,并存储轨迹数据。
首先,你需要创建一个新的ROS包。如果你还没有创建,可以使用以下命令:

1、编写单一文件

cd ~/catkin_ws/src
catkin_create_pkg my_robot_tracker std_msgs roscpp
cd ~/catkin_ws
catkin_make
source devel/setup.bash

然后,在你的包中创建一个C++源文件,比如 tracker_node.cpp ,并添加以下代码:

#include <ros/ros.h>
#include <nav_msgs/Odometry.h>
#include <geometry_msgs/PoseStamped.h>
#include <vector>namespace my_robot_tracker {class TrajectoryRecorder {
public:TrajectoryRecorder() {// 初始化ROS节点ros::NodeHandle nh;// 订阅机器人的速度信息sub_ = nh.subscribe<nav_msgs::Odometry>("odom", 10, &TrajectoryRecorder::odometryCallback, this);// 发布轨迹信息pub_ = nh.advertise<geometry_msgs::PoseStamped>("trajectory", 10);}void odometryCallback(const nav_msgs::Odometry::ConstPtr& msg) {// 将速度信息转换为轨迹点geometry_msgs::PoseStamped pose;pose.header = msg->header;pose.pose = msg->pose.pose;trajectory_.push_back(pose);// 可以选择在这里发布轨迹点pub_.publish(pose);}// 可以添加一个方法来保存轨迹数据void saveTrajectory() {// 这里可以添加代码将trajectory_保存到文件}private:ros::Subscriber sub_;ros::Publisher pub_;std::vector<geometry_msgs::PoseStamped> trajectory_;
};} // namespace my_robot_trackerint main(int argc, char** argv) {ros::init(argc, argv, "tracker_node");my_robot_tracker::TrajectoryRecorder recorder;ros::spin();return 0;
}

接下来,你需要在 CMakeLists.txt 文件中添加编译指令:

cmake_minimum_required(VERSION 2.8.3)
project(my_robot_tracker)find_package(catkin REQUIRED COMPONENTSstd_msgsroscppnav_msgsgeometry_msgs
)include_directories(${catkin_INCLUDE_DIRS}
)add_executable(tracker_node src/tracker_node.cpp)
target_link_libraries(tracker_node ${catkin_LIBRARIES})

最后,你需要在 package.xml 文件中添加依赖:

<package><name>my_robot_tracker</name><version>0.0.0</version><description>A package for recording robot trajectory</description><maintainer email="your_email@example.com">your_name</maintainer><license>BSD</license><build_depend>roscpp</build_depend><build_depend>std_msgs</build_depend><build_depend>nav_msgs</build_depend><build_depend>geometry_msgs</build_depend><exec_depend>roscpp</exec_depend><exec_depend>std_msgs</exec_depend><exec_depend>nav_msgs</exec_depend><exec_depend>geometry_msgs</exec_depend>
</package>

确保你的工作空间是最新的,然后编译你的包:

cd ~/catkin_ws
catkin_make
source devel/setup.bash

现在,你可以运行你的节点:

rosrun my_robot_tracker tracker_node

这个简单的示例展示了如何创建一个记录机器人速度并将其转换成轨迹的类,并将其放置在一个自定义的命名空间 my_robot_tracker 中。你可以根据需要扩展这个类,添加更多的功能,比如保存轨迹到文件等。

2、分文件编写

要将代码分成两个文件,我们可以将类定义和其成员函数的实现放在一个头文件和一个源文件中,而将 main 函数放在另一个源文件中。以下是如何组织这些代码:

1. 头文件(trajectory_recorder.h)

#ifndef TRAJECTORY_RECORDER_H
#define TRAJECTORY_RECORDER_H#include <ros/ros.h>
#include <nav_msgs/Odometry.h>
#include <geometry_msgs/PoseStamped.h>
#include <vector>namespace my_robot_tracker {class TrajectoryRecorder {
public:TrajectoryRecorder();void odometryCallback(const nav_msgs::Odometry::ConstPtr& msg);void saveTrajectory();private:ros::Subscriber sub_;ros::Publisher pub_;std::vector<geometry_msgs::PoseStamped> trajectory_;
};} // namespace my_robot_tracker#endif // TRAJECTORY_RECORDER_H

2. 源文件(trajectory_recorder.cpp)

#include "trajectory_recorder.h"namespace my_robot_tracker {TrajectoryRecorder::TrajectoryRecorder() {// 初始化ROS节点ros::NodeHandle nh;// 订阅机器人的速度信息sub_ = nh.subscribe<nav_msgs::Odometry>("odom", 10, &TrajectoryRecorder::odometryCallback, this);// 发布轨迹信息pub_ = nh.advertise<geometry_msgs::PoseStamped>("trajectory", 10);
}void TrajectoryRecorder::odometryCallback(const nav_msgs::Odometry::ConstPtr& msg) {// 将速度信息转换为轨迹点geometry_msgs::PoseStamped pose;pose.header = msg->header;pose.pose = msg->pose.pose;trajectory_.push_back(pose);// 可以选择在这里发布轨迹点pub_.publish(pose);
}void TrajectoryRecorder::saveTrajectory() {// 这里可以添加代码将trajectory_保存到文件
}} // namespace my_robot_tracker

3. 主函数文件(main.cpp)

#include <ros/ros.h>
#include "trajectory_recorder.h"int main(int argc, char** argv) {ros::init(argc, argv, "tracker_node");my_robot_tracker::TrajectoryRecorder recorder;ros::spin();return 0;
}

更新CMakeLists.txt
确保你的 CMakeLists.txt 文件包含了新的文件:

cmake_minimum_required(VERSION 2.8.3)
project(my_robot_tracker)find_package(catkin REQUIRED COMPONENTSstd_msgsroscppnav_msgsgeometry_msgs
)include_directories(${catkin_INCLUDE_DIRS}
)add_executable(tracker_node src/main.cpp src/trajectory_recorder.cpp)
target_link_libraries(tracker_node ${catkin_LIBRARIES})

这样就将代码分成了三个文件:一个头文件 trajectory_recorder.h ,一个源文件 trajectory_recorder.cpp ,以及一个包含 main 函数的文件 main.cpp 。这种组织方式使得代码更加模块化,易于管理和维护。

相关文章:

ROS(Robot Operating System)中,编写一个记录机器人速度并将其转换成轨迹

在ROS&#xff08;Robot Operating System&#xff09;中&#xff0c;编写一个记录机器人速度并将其转换成轨迹的类涉及到几个步骤。以下是一个简单的示例&#xff0c;展示了如何创建这样一个类&#xff0c;并将其放置在一个自定义的命名空间中。这个类将订阅机器人的速度信息&…...

了解bootstrap改造asp.net core MVC的样式模板

我们都知道&#xff0c;在使用默认的asp.net core MVC模板建立项目的时候&#xff0c;里面的样式是已经事先被写好了的。一般来说都在css目录下的site.css和bootstrap.css及下面的bootstrap.min.css中。我们打开bootstrap这些样式文件&#xff0c;里面有大量的样式类的定义&…...

【C++】对左值引用右值引用的深入理解(右值引用与移动语义)

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 ​ 目录 前言&#xff1a;对引用的底层理解 一、左值与右值 提问&#xff1a;左值在左&#xff0c;右值在右&#xff1f;…...

寻找符合要求的最长子串

题目描述 给定一个字符串 s s s &#xff0c;找出这样一个子串&#xff1a; 1&#xff09;该子串中的任意一个字符最多出现2次&#xff1b; 2&#xff09;该子串不包含指定某个字符&#xff1b; 请你找出满足该条件的最长子串的长度。 输入描述&#xff1a; 第一行为要求…...

【vim文本编辑器gcc编译器gdb调试器】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、vimvim安装vim常用快捷键vim使用vimtutor zh文档 二、gcc编译器安装gcc工具编译源代码 三、gdb调试器gdb安装gdb常用指令gdb简单上手使用gdb的单步调试功能 总结…...

解决使用Golang的email库发送qq邮件报错short response,错误类型为textproto.ProtocolError

问题阐述 使用email库发送QQ邮件&#xff0c;采用465端口&#xff1a; package mainimport ("fmt""net/smtp""github.com/jordan-wright/email" )func SendEmail(sendTo string, subject string, body string) (err error) {e : email.NewEmai…...

为什么说高级工程师研究的不仅是器件的稳态,模拟器件的开关过程

高级工程师研究器件的开关过程而不仅仅是稳态&#xff0c;主要有以下几个原因&#xff1a; 1. 动态性能优化&#xff1a;开关过程中的特性&#xff0c;如上升时间、下降时间、过冲、振铃等&#xff0c;直接影响系统的性能。了解和优化这些动态特性对于提高系统的速度、精度和稳…...

Matlab实现白鲸优化算法(BWO)求解路径规划问题

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 白鲸优化算法&#xff08;BWO&#xff09;是一种受自然界白鲸捕食行为启发的新型优化算法&#xff0c;它通过模拟白鲸的群体捕猎策略和社会互动来探索问题的最优解。BWO因其强大的全局搜索能力和高效的局部搜索能…...

SQLserver索引的优化和使用

在SQL Server中&#xff0c;索引的优化和有效使用是提高查询性能的关键。以下是一些详细的步骤和最佳实践&#xff0c;帮助你优化和使用索引。 1. 理解索引类型 聚集索引&#xff08;Clustered Index&#xff09; 定义&#xff1a;表中数据的物理排序顺序与索引的逻辑顺序相…...

Linux 安装nacos

1.下载版本 https://github.com/alibaba/nacos/tags 2.解压压缩包&#xff0c;启动 (1)将压缩包放到/usr/local目录下&#xff0c;解压 tar -xvf nacos-server-2.0.0-BETA.tar.gz(2)删除压缩包 rm -f nacos-server-2.0.0-BETA.tar.gz(3) 找到nacos的mysql的数据库脚本,在数…...

水仙花判断

一个三位整数&#xff0c;如果满足条件&#xff1a;个位数的立方十位数立方百位数立方这个数&#xff0c;那么称之为“水仙花数” 编程判断一个三位整数是不是水仙花数。 输入格式: 输入一个三位整数 输出格式: 是则输出YES&#xff0c;不是输出 NO &#xff08;注意是大写字母…...

在VS中安装chatGPT

2、在VSCode中打开插件窗口 3、输入ChatGPT 4、这里有个ChatGPT中文版&#xff0c;就它了 5、安装 6、这时候侧边栏多了一个chatGPT分页图标&#xff0c;点击它 7、打个招呼 8、好像不行 9、看一下细节描述 10、根据要求按下按下快捷键 Ctrl Shift P 11、切换成国内模式 12、…...

算法笔记:Day-09(初始动态规划)

509. 斐波那契数 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 …...

“探索未来医疗:生成式人工智能在医疗领域的革命性应用“

生成式人工智能&#xff08;GenAI&#xff09;在医疗领域的应用具有巨大的潜力和变革性&#xff0c;以下是一些关键的应用领域&#xff1a; 医学影像分析&#xff1a; GenAI模型通过深度学习技术&#xff0c;能够自动识别医学影像中的病变区域&#xff0c;提高诊断的准确性和速…...

数字IC后端实现Innovus 时钟树综合(Clock Tree Synthesis)典型案例

对于如下所示电路&#xff0c;要求以下几路做到等长&#xff0c;clock skew控制在50ps以内&#xff0c;clock tree insertion delay做到800ps! from FF/Q to FF1_1/D through the FF1 CK from FF/Q to FF2_1/D through the FF2 CK from FF/Q to FF3_1/D through the FF3 CK fr…...

Matlab应用制作入门

要在 MATLAB 中创建一个简单的应用程序&#xff0c;你可以使用 App Designer&#xff0c;这是一个用于构建交互式应用的工具。以下是一个简单的步骤&#xff0c;帮助你创建一个基本的 MATLAB 应用程序&#xff1a; 1. 打开 App Designer 在 MATLAB 命令窗口中输入 appdesigne…...

什么是声明式编程什么是函数式编程,打比方说明

在前端开发中&#xff0c;声明式编程和函数式编程是两种不同的编程范式&#xff0c;各自有其特定的理念和用法。下面详细介绍这两种编程范式&#xff0c;并通过比喻进行说明。 声明式编程 定义&#xff1a; 声明式编程是一种编程风格&#xff0c;强调“你想要什么”而不是“怎…...

SpringBoot+Shiro权限管理

Shiro是一个强大的Java安全框架&#xff0c;提供了身份验证、授权、加密、会话管理以及与Web集成等多种安全功能。以下是对Shiro权限管理的详细总结&#xff1a; 一、Shiro权限管理的基本概念 权限管理&#xff0c;一般指根据系统设置的安全规则或者安全策略&#xff0c;用户…...

前端面试题22 | 什么是跨域问题?怎么解决?

哈喽小伙伴们大家好!新的一周开始啦~距离2024年结束也仅有两个月了,不知道大家年初给自己制定的目标实现了多少?不管怎样,接下来的两个月都请继续加油哦!我们坚持下来了,我们就是最棒的! 今天,继续来给大家分享一道面试题 在开发中,我们经常会遇到跨域的问题,尤其是开发前后…...

HarmonyOS Next星河版笔记--界面开发(3)

属性 1.1.设计资源-svg图标 需求&#xff1a;界面中展示图标→可以使用的svg图标(任意放大缩小不失真、可以改变颜色) 使用方式&#xff1a; ①设计师提供&#xff1a;基于项目的图标&#xff0c;拷贝到项目目录使用 Image($r(app.media.ic_dianpu)) .width(40) fillColor…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...

LangChain【6】之输出解析器:结构化LLM响应的关键工具

文章目录 一 LangChain输出解析器概述1.1 什么是输出解析器&#xff1f;1.2 主要功能与工作原理1.3 常用解析器类型 二 主要输出解析器类型2.1 Pydantic/Json输出解析器2.2 结构化输出解析器2.3 列表解析器2.4 日期解析器2.5 Json输出解析器2.6 xml输出解析器 三 高级使用技巧3…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...

CMS内容管理系统的设计与实现:多站点模式的实现

在一套内容管理系统中&#xff0c;其实有很多站点&#xff0c;比如企业门户网站&#xff0c;产品手册&#xff0c;知识帮助手册等&#xff0c;因此会需要多个站点&#xff0c;甚至PC、mobile、ipad各有一个站点。 每个站点关联的有站点所在目录及所属的域名。 一、站点表设计…...