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

news/2024/10/9 20:26:39/

【无人水面艇路径跟随控制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.ppmy.cn/news/1536808.html

相关文章

人脸表情行为识别系统源码分享

人脸表情行为识别系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【斯坦福CS144】Lab2

一、实验目的 实现一个 TCPReceiver&#xff0c;用以接收传入的 TCP segment 并将其转换成用户可读的数据流。 二、实验内容 1.接收TCP segment&#xff1b; 2.重新组装字节流&#xff08;包括EOF&#xff09;&#xff1b; 3.确定应该发回给发送者的信号&#xff0c;以进行…

UE4 材质学习笔记03(翻书(Flipbook)动画/环境混合)

一.FlipBook Animation 如果你想让游戏以每秒30帧的速度运行&#xff0c;所有内容都必须在33毫秒内渲染出来&#xff0c; 如果你想让游戏以每秒60帧的速度运行的话&#xff0c;必须在16毫秒内。 所以当一个效果需要很多细节的时候&#xff0c;往往会离线创建它&#xff0c;然…

Linux操作系统——概念扫盲I

目录 虚拟机概念刨析 在那之前&#xff0c;询问什么是虚拟化&#xff1f; 现在来看看什么是虚拟机 虚拟机有啥好的 小差&#xff1a;那JVM也叫Java Virtual Machine&#xff0c;有啥区别呢&#xff1f; Reference 虚拟机概念刨析 我们下面来简单聊聊虚拟机这个概念。对于…

基于springboot vue 学生就业信息管理系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆…

UE5.4.3 录屏回放系统ReplaySystem蓝图版

这是ReplaySystem的蓝图使用方法版&#xff0c;以第三人称模版为例&#xff0c;需要几个必须步骤 项目config内DefaultEngine.ini的最后添加&#xff1a; [/Script/Engine.GameEngine] NetDriverDefinitions(DefName"DemoNetDriver",DriverClassName"/Script/…

Qt 中的 QChartView

深入理解 Qt 的 QChartView&#xff1a;图表展示与交互 QChartView 是 Qt Charts 模块中的一个核心类&#xff0c;它用于在 Qt 应用程序中显示图表&#xff0c;并支持多种用户交互方式。它继承自 QGraphicsView&#xff0c;通过封装 QChart&#xff0c;为用户提供了强大的图表…

Oracle中处理空值函数(NVL、NVL2、NULLIF等)详解

文章目录 前言一、函数语法NVL函数NVL2函数NULLIF函数COALESCE函数DECODE函数 二、用法区别三、测试用例总结 前言 本文将介绍Oracle中处理空值的函数。常用的处理函数有&#xff1a;NVL()、NVL2()、NULLIF()、COALESCE()。此外DECODE()和CASE()函数也可以起到处理空值的效果。…