【无人水面艇路径跟随控制2】(C++)USV代码阅读: SetOfLos 类的从路径点和里程计信息中计算期望航向

【无人水面艇路径跟随控制2】(C++)USV代码阅读: SetOfLos 类的从路径点和里程计信息中计算期望航向

  • 写在最前面
  • set_of_los.cpp
    • 小结
    • 详细解释
      • 头文件包含
      • 命名空间
      • 构造函数和析构函数
      • 设置参数函数
      • 获取航向函数


请添加图片描述

🌈你好呀!我是 是Yu欸
🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!

写在最前面

阅读代码:https://github.com/USE-jx/USV_path_follow/tree/main

usv path follow:无人水面艇路径跟随
trajectory tracking:轨迹跟踪

请添加图片描述

set_of_los.cpp

motion_control\guidance\los_guidance\src\set_of_los.cpp

这个文件 set_of_los.cpp 实现了 set_of_los.h 中定义的 SetOfLos 类的成员函数。

小结

这个代码片段实现了 SetOfLos 类的构造函数、析构函数、参数设置函数和部分获取航向函数。通过这些函数,可以初始化对象、设置参数并从路径点和里程计信息中计算期望航向。

详细解释

以下是代码的详细解释:

头文件包含

#include "los_guidance/set_of_los.h"

包含头文件 set_of_los.h

命名空间

namespace motion_control {

将代码放在 motion_control 命名空间中,以避免命名冲突。

构造函数和析构函数

SetOfLos::SetOfLos() : index_(0), desired_course_(0), desired_speed_(0), is_final_(false) {}SetOfLos::~SetOfLos() {}
  • 构造函数 SetOfLos() 初始化成员变量:
    • index_:路径点索引,初始值为0。
    • desired_course_:期望航向,初始值为0。
    • desired_speed_:期望速度,初始值为0。
    • is_final_:是否到达最终目标,初始值为false。
  • 析构函数 ~SetOfLos():目前没有需要清理的资源。

设置参数函数

void SetOfLos::setParam(ros::NodeHandle& nh) {nh.param("los/desired_speed", desired_speed_, 1.0);nh.param("los/switch_distance", switch_dist_, 7.0);nh.param("los/use_const_delta", use_const_delta_, true);nh.param("los/const_delta", const_delta_, 3.0);nh.param("los/delta_max", delta_max_, 10.0);nh.param("los/delta_min", delta_min_, 1.0);nh.param("los/gamma", gamma_, 1.0);
}

从ROS节点句柄中读取参数并设置成员变量:

  • desired_speed_:期望速度,默认值为1.0。
  • switch_dist_:切换路径点的距离,默认值为7.0。
  • use_const_delta_:是否使用常量前视距离,默认值为true。
  • const_delta_:常量前视距离,默认值为3.0。
  • delta_max_:最大前视距离,默认值为10.0。
  • delta_min_:最小前视距离,默认值为1.0。
  • gamma_:时间变化参数,默认值为1.0。

获取航向函数

Eigen::Vector2d SetOfLos::getCourseFromWaypoints(const nav_msgs::Path &path, const nav_msgs::Odometry &odom,bool &is_final) {if (path.poses.size() < 2) {return {tf2::getYaw(odom.pose.pose.orientation), 0};}//current positiondouble current_x = odom.pose.pose.position.x;double current_y = odom.pose.pose.position.y;//calculate path-tangential angledouble waypoint_cur_x = path.poses[index_].pose.position.x;double waypoint_cur_y = path.poses[index_].pose.position.y;double waypoint_next_x = path.poses[index_+1].pose.position.x;double waypoint_next_y = path.poses[index_+1].pose.position.y;double pi_p = atan2(waypoint_next_y - waypoint_cur_y, waypoint_next_x - waypoint_cur_x);
  • getCourseFromWaypoints 函数从路径点和里程计信息中计算期望航向。
  • 如果路径点数量少于2个,返回当前航向和速度0。
  • 获取当前位置信息 current_xcurrent_y
  • 获取当前路径点和下一个路径点的坐标。
  • 计算路径切线角 pi_p

hello,我是 是Yu欸 。如果你喜欢我的文章,欢迎三连给我鼓励和支持:👍点赞 📁 关注 💬评论,我会给大家带来更多有用有趣的文章。
原文链接 👉 ,⚡️更新更及时。

欢迎大家添加好友交流。

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

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

相关文章

热门:AI变现,看看谁在默默赚大钱?

在这个愈发依赖AI的时代&#xff0c;找到属于自己的盈利方式愈发重要。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 总的来说&#xff0c;利用AI进行盈利的方式主要有三种&#xff1a;技术型、流量型和内容型。 每种方式都根植于AI的特性&#xff0c;但同时也需要特定…

重庆数字孪生工业互联网可视化技术,赋能新型工业化智能制造工厂

重庆作为西南地区的重要工业基地&#xff0c;正积极探索和实践数字孪生、工业互联网及可视化技术在智能制造领域的深度融合&#xff0c;致力于打造新型工业化智能制造工厂&#xff0c;为制造业的高质量发展注入强劲动力。 在重庆的智能制造工厂中&#xff0c;数字孪生技术被广…

Pytorch基础:网络层

文章目录 1.卷积层-Convolution Layers1.1 1d/2d/3d卷积1.2卷积--nn.Conv2d1.3转置卷积(实现上采样) 2.池化层3.线性层—Linear Layer4.激活函数层—Activate Layer 1.卷积层-Convolution Layers 卷积运算:卷积运算在输入信号(图像)上滑动,相应位置上进行乘加. 卷积核:又称过滤…

感知机及其实践

说明 感知机是SVM(support vector machine,支持向量机)的基础&#xff0c;更是机器学习的基础。本文的目的在于把感知机的相关概念捋清楚&#xff0c;并基于感知机做最基本的线性可分的二分类实践。 有关机器学习的一些基础概念&#xff0c;读者可以参考本专栏的第一篇博文[4]&…

AI大模型有哪些,收藏起来防踩坑

大模型是指具有数千万甚至数亿参数的深度学习模型&#xff0c;通常由深度神经网络构建而成&#xff0c;拥有数十亿甚至数千亿个参数。大模型的设计目的是为了提高模型的表达能力和预测性能&#xff0c;能够处理更加复杂的任务和数据。以下是对大模型的详细数据与分析&#xff1…

【AI副业项目】揭密AI技术对于儿童古诗文项目的应用

大家都知道&#xff0c;古诗文作为中华文化的瑰宝&#xff0c;承载着丰富的历史情感和智慧。但是&#xff0c;在现代社会快节奏的生活中&#xff0c;如何让更多人尤其是少年儿童感受到古诗文的魅力&#xff0c;成为了一个极需解决的问题。 AI技术的兴起为这一难题提供了新的解…

Vue基础指令用法

vue2&#xff0c;官网&#xff1a;介绍 — Vue.js (vuejs.org) 例子&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-s…

免费送源码:Java+B/S+MySQL 基于springboot网上书店管理系统 计算机毕业设计原创定制

基于springboot网上书店管理系统 摘 要 网上书店管理系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员和用户两部分&#xff0c;管理员管理主要功能包括&#xff1a;首页、网站管理&#xff08;轮播图、网站公告&#xff09;人员管理&#xff08;管…

新160个crack - 075-blaster99

运行分析 需要破解code PE分析 VB程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 使用VB Decomplier进行分析&#xff0c;发现直接爆出了Code 验证成功

虚拟电厂可视化:智能能源管理新时代

通过图扑可视化技术&#xff0c;全方位展示虚拟电厂的运行状态&#xff0c;优化能源生产与消耗&#xff0c;提高电网效率和稳定性&#xff0c;实现智能能源管理。

降重秘籍:如何利用ChatGPT将重复率从45%降至10%以下?

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 重复率高达45%&#xff1f;很多人一查论文的重复率&#xff0c;瞬间想“完了&#xff0c;这次真的要重写了”。但其实不用这么绝望&#xff01;有了ChatGPT&#xff0c;降重真的没那么难。今天就教你几招&a…

CSP-J/S 复赛算法 并查集-Hash表

文章目录 前言并查集并查集是什么&#xff1f;并查集的应用举几个并查集的例子更加详细的介绍合并两个集合判断元素的关系 并查集在树中的表示方法并查集在树中的表示概念 字符串图示例初始状态合并操作示例最终结构 查找操作和路径压缩示例 并查集的工作原理判断元素是否在同一…

交换排序:冒泡排序、递归实现快速排序

目录 冒泡排序 1.冒泡排序的核心思想 2.冒泡排序的思路步骤 3.冒泡排序代码 4.代码分析 5.对冒泡排序的时间复杂度是O(N^2)进行解析 6.冒泡排序的特性总结 递归实现快速排序(二路划分版本) 1.快速排序基本思路 2.代码思路步骤 3.代码实现 4.代码分析 (1)递归终止条…

uniapp固定document.title标题

由于业务中需要将h5的标题固定 但是uniapp没有对应的接口 所以使用Object.defineProperty拦截set方法来实现 代码也很简单 在App.vue的onLaunch加上就行了 onLaunch: function() {document.title 固定标题;Object.defineProperty(document, title, {set() {return false;}});…

【电路笔记】-运算放大器微分器

运算放大器微分器 文章目录 运算放大器微分器1、概述2、运算放大器微分器的表示2.1 理想微分器2.2 输出公式2.3 交流分析3、实际微分器3.1 理想配置的局限性3.2 带串联电阻的伪微分器3.3 具有并联电容器的伪微分器4、总结1、概述 在我们之前关于积分器运算放大器的文章中,我们…

2024全面指南:从零开始到精通大模型学习路径规划!保姆级教程非常详细,收藏我这一篇就够了

第一阶段&#xff1a;基础理论入门 目标&#xff1a;了解大模型的基本概念和背景。 内容&#xff1a; 人工智能演进与大模型兴起。 大模型定义及通用人工智能定义。 GPT模型的发展历程。 第二阶段&#xff1a;核心技术解析 目标&#xff1a;深入学习大模型的关键技术和工…

使用keras-tuner微调神经网络超参数

目录 随机搜索RandomSearch HyperBand 贝叶斯优化BayesianOptimization 附录 本文将介绍keras-tuner提供了三种神经网络超参数调优方法。它们分别是随机搜索RandomSearch、HyperBand和贝叶斯优化BayesianOptimization。 首先需要安装keras-tuner依赖库,安装命令如…

【数学分析笔记】第4章第4节 复合函数求导法则及其应用(3)

4. 微分 4.4 复合函数求导法则及其应用 【例4.4.9】向斜向上方向抛一个物体&#xff0c;当 t 0 t0 t0时&#xff0c;水平速度与垂直向上的速度分别为 v 1 v_1 v1​和 v 2 v_2 v2​&#xff0c;问在什么时刻速度的方向是水平的&#xff1f; 【解】该物体画出来的轨迹是抛物线…

降低大模型幻觉的5种方案

降低大模型幻觉的5种方案 大语言模型&#xff08;如GPT-4&#xff09;在生成文本时&#xff0c;有时会产生所谓的“幻觉”——即生成的内容虽然语法和逻辑上看似正确&#xff0c;但实际上是不准确或虚构的。为了减少这种现象&#xff0c;以下是五种有效的方案&#xff1a;Prom…

LeetCode讲解篇之34. 在排序数组中查找元素的第一个和最后一个位置

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 这题让我们求目标值的左边界和右边界&#xff0c;我们可以采用二分查找搜索有序数组内大于等于目标值的最左边的下标 然后我们只需要在有序数组查找一下大于等于target的最左边下标 如果该下标越界或者下标对应…