无里程计下的纯跟踪算法实现

文章目录

  • 概要
  • 生成相机坐标系下的三维坐标
  • 无里程计下的纯跟踪算法实现

在这里插入图片描述

概要

当你只有一个相机的时候,想要快速实现机器人跟随功能,没有里程计的情况下,就可以看这里了。这篇博文实现了一个无里程计下的纯跟踪算法。

生成相机坐标系下的三维坐标

订阅相机内参

void PoseRecognition::info_rgb_callback(const sensor_msgs::CameraInfo &caminfo_rgb){if (colorInfo)return;else{std::cout<< "\n color intrinsics: " << std::endl;innerTransformationColor<<caminfo_rgb.K.at(0), caminfo_rgb.K.at(1), caminfo_rgb.K.at(2), caminfo_rgb.K.at(3),caminfo_rgb.K.at(4), caminfo_rgb.K.at(5),caminfo_rgb.K.at(6), caminfo_rgb.K.at(7),caminfo_rgb.K.at(8);for(int i = 0; i<3; i++){for (int j = 0; j < 3; ++j){std::cout<<innerTransformationColor(i, j) << "\t";}std::cout << std::endl;}colorInfo = true;}
}

像素坐标转深度坐标

Eigen::Vector3f ImagePixObj;
ImagePixObj << centerX, centerY , 1.00;
Eigen::Vector3f CameraPixObj = innerTransformationColor.inverse() * ImagePixObj * depth;

无里程计下的纯跟踪算法实现

头文件

#include <geometry_msgs/Twist.h>
#include <nav_msgs/Path.h>
#include <ros/ros.h>
#include <tf/tf.h>
#include <tf/transform_broadcaster.h>#include <algorithm>
#include <cassert>
#include <cmath>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <signal.h>
#include <numeric>#include "geometry_msgs/PoseStamped.h"
#include "nav_msgs/Odometry.h"
#include "std_msgs/String.h"
#include "std_msgs/Bool.h"class PurePursuitController
{public:PurePursuitController();void poseCallback(const nav_msgs::Odometry &currentWaypoint);private:ros::NodeHandle n, nPrivate;ros::Publisher purepersuit_;ros::Publisher path_pub_, referencePathPub, controlPub, markerPub;ros::Subscriber splinePath, carVel, carPose, subOrder, subStatus;nav_msgs::Path path;std::string topicTrajectory, topicCmdVel, topicCurrentPose, filePath, topicOrder, topicGPSStatus;float Ld;   //轴距float PREVIEW_DIS;  //预瞄距离float carVelocity = 0;float preview_dis = 0;float k = 0.1;int pointNum;  //保存路径点的个数int startIdx; //开始循迹的下标int beginIdx; //trajectory begin idxbool initTrajectory = false;bool directionMatch = false;float midDistance; // 中值距离大小float maxDis; //最大值距离float linearVel; //线速度bool isReverse;  //是否轨迹反转bool isStopCar; //是否停车(停障)bool isStopCarCmd; //是否停车(平台)int patientCount; //重置前的耐心次数/*create kalman filter*/float lastPosX, lastPosY;
};

主函数

#include "pure_pursuit_image/pure_pursuit.h"using namespace std;PurePursuitController::PurePursuitController():nPrivate("~")
{/*params setting*/nPrivate.param("Ld", Ld, float(1.0));nPrivate.param("PREVIEW_DIS", PREVIEW_DIS, float(2.0));nPrivate.param("linearVel", linearVel, float(0.3));nPrivate.param("isReverse", isReverse, bool(false));nPrivate.param("topicCurrentPose", topicCurrentPose, std::string("/objectTracking/odom"));nPrivate.param("topicCmdVel", topicCmdVel, std::string("/cmd_vel"));/*订阅话题*/carPose = n.subscribe(topicCurrentPose.c_str(), 1000, &PurePursuitController::poseCallback, this);//创建Publisher,发送经过pure_pursuit计算后的转角及速度purepersuit_ = n.advertise<geometry_msgs::Twist>(topicCmdVel.c_str(), 10);ROS_INFO("Pure pursuit init successfully!!!");
}//计算发送给模型车的转角
void PurePursuitController::poseCallback(const nav_msgs::Odometry &currentWaypoint) {// ROS_INFO("poseCallback");auto currentPositionX = currentWaypoint.pose.pose.position.x;auto currentPositionY = currentWaypoint.pose.pose.position.y;auto currentPositionZ = 0.0;auto currentQuaternionX = currentWaypoint.pose.pose.orientation.x;auto currentQuaternionY = currentWaypoint.pose.pose.orientation.y;auto currentQuaternionZ = currentWaypoint.pose.pose.orientation.z;auto currentQuaternionW = currentWaypoint.pose.pose.orientation.w;auto currentPositionYaw = tf::getYaw(currentWaypoint.pose.pose.orientation);/*判断是否到达终点*/float cur2endDistance = sqrt(pow(currentPositionY, 2) + pow(currentPositionX, 2));if(cur2endDistance < 2*Ld){ROS_INFO("The car has reached the end!!!");geometry_msgs::Twist vel_msg;vel_msg.linear.x = 0;vel_msg.angular.z = 0;purepersuit_.publish(vel_msg);}// ROS_INFO("The rate of progress is %d / %d. ", startIdx, pointNum);float alpha = atan2(currentPositionY, currentPositionX) - currentPositionYaw;// 当前点和目标点的距离Idfloat dl = sqrt(pow(currentPositionY, 2) + pow(currentPositionX, 2));/*原地转向,使得车的航向角对齐轨迹方向*/float theta = atan(2 * Ld * sin(alpha) / dl);if (dl > 2*Ld ) {ROS_INFO("Moving the car");// double delta = atan2(2* Ld * sin(alpha), preview_dis);geometry_msgs::Twist vel_msg;vel_msg.linear.x = linearVel;vel_msg.angular.z = theta;purepersuit_.publish(vel_msg);} else {geometry_msgs::Twist vel_msg;vel_msg.linear.x = 0;vel_msg.angular.z = 0;purepersuit_.publish(vel_msg);}
}int main(int argc, char **argv) {//创建节点ros::init(argc, argv, "pure_pursuit_image");PurePursuitController ppc;  ros::spin();return 0;
}

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

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

相关文章

1、安全开发-Python爬虫EDUSRC目标FOFA资产Web爬虫解析库

用途&#xff1a;个人学习笔记&#xff0c;有所借鉴&#xff0c;欢迎指正 前言&#xff1a; 主要包含对requests库和Web爬虫解析库的使用&#xff0c;python爬虫自动化&#xff0c;批量信息收集 Python开发工具&#xff1a;PyCharm 2022.1 激活破解码_安装教程 (2022年8月25日…

Linux下find命令详解

find #查找文件 #按照文件名、大小、时间、权限、类型、所属者、所属组来搜索文件 格式&#xff1a; find 查找路径 查找条件 具体条件&#xff08;按文件名或时间大小等&#xff09; 操作 注意&#xff1a; find命令默认的操作是print输出 find是检索…

MATLAB绘制电磁场

MATLAB绘制电磁场举例: clc;close all;clear all;warning off;%清除变量 rand(seed, 100); randn(seed, 100); format long g; m12 for k1:m for j1:m if k1 V(j,k)1; elseif((j1)|(jm)|(km)) V(j,k)0; else …

PKG系统安装包及IPSW固件:MacOS 11-14 Sonoma 正式版

MacOS 14 Sonoma&#xff0c;为提高生产力和创造力带来了全新的功能&#xff0c;有了更多使用小部件和令人惊叹的新屏幕保护程序进行个性化设置的方法&#xff0c;对Safari浏览器和视频会议进行了重大更新&#xff0c;以及优化的游戏体验——Mac体验比以往任何时候都更好。 mac…

贝叶斯的缺点

贝叶斯方法是一种统计学习方法&#xff0c;通过利用贝叶斯定理来计算给定先验概率的情况下&#xff0c;后验概率的条件概率。虽然贝叶斯方法在许多领域中应用广泛且有效&#xff0c;但也存在一些缺点。以下是一些贝叶斯方法的缺点的例子&#xff1a; 1、先验概率的选择 贝叶斯方…

第二十四天| 77. 组合

Leetcode 77. 组合 题目链接&#xff1a;77 组合 题干&#xff1a;给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。 思考&#xff1a;回溯法。把回溯法的搜索过程抽象为树形结构。 每次从集合中选取元素&#xff0…

vio参数文件内相机imu参数的修改

imu标定工具 https://github.com/mintar/imu_utils网络上有各种IMU校准工具和校准教程&#xff0c;曾经花费了巨大精力跟着各种教程去跑校准。 然而&#xff0c;标定使用的数据都是在静止状态下录制的&#xff0c;我们在使用vio或者imu-cam联合标定的时候&#xff0c;imu确是处…

计算机视觉实战项目4(单目测距与测速+摔倒检测+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A_路径规划+行人车辆计数+动物识别等)

基于YOLOv5的无人机视频检测与计数系统 摘要&#xff1a; 无人机技术的快速发展和广泛应用给社会带来了巨大的便利&#xff0c;但也带来了一系列的安全隐患。为了实现对无人机的有效管理和监控&#xff0c;本文提出了一种基于YOLOv5的无人机视频检测与计数系统。该系统通过使用…

AJAX-认识URL

定义 概念&#xff1a;URL就是统一资源定位符&#xff0c;简称网址&#xff0c;用于访问网络上的资源 组成 协议 http协议&#xff1a;超文本传输协议&#xff0c;规定浏览器和服务器之间传输数据的格式&#xff1b;规定了浏览器发送及服务器返回内容的格式 协议范围&#xf…

flask基于Python的期货交易模拟系统的django-afl61-vue

期货交易模拟系统是一个便于用户在线查看期货投资、取消投资、风险控制、账户资金、持仓资金等&#xff0c;管理员进行管理的平台。因此本文主要论述了系统开发的过程和实现的功能&#xff0c;结合Web技术来实现的期货交易模拟系统。本系统以软件工程理论为开发基础&#xff0c…

UE4 C++ 静态加载类和资源

静态加载类和资源&#xff1a;指在编译时加载&#xff0c;并且只能在构造函数中编写代码 .h //增加所需组件的头文件 #include "Components/SceneComponent.h" //场景组件 #include "Components/StaticMeshComponent.h" //静态网格体组件 #include &qu…

SpringBoot实战2

目录 1.如何返回两个类型的数据&#xff1f;User和Booth 2.如何使用MyBatis遍历一个数组进行查询&#xff1f; 3.前端要的数据太多太杂&#xff0c;我们拼接多个List&#xff0c;前端找数据困难&#xff0c;浪费时间。因此我们进行三表联表查询。 1.首先创建一个vo包&#x…

yo!这里是c++IO流相关介绍

目录 前言 C语言的输入输出 CIO流基本介绍 流的概念 IO流类库 iostream fstream stringstream 后记 前言 学过C语言的输入输出相关知识点的童鞋应该多多少少会觉得有些许麻烦&#xff0c;反正我就是这么觉得的&#xff0c;scanf、printf等函数不仅数量众多&#xff0c…

20240202在WIN10下使用whisper.cpp

20240202在WIN10下使用whisper.cpp 2024/2/2 14:15 【结论&#xff1a;在Windows10下&#xff0c;确认large模式识别7分钟中文视频&#xff0c;需要83.7284 seconds&#xff0c;需要大概1.5分钟&#xff01;效率太差&#xff01;】 83.7284/4200.1993533333333333333333333333…

使用 Go 发送微信群消息

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 背景 最近的某个副业需要我写一个脚本&#xff08;脚本内容就不说了&#xff09;&#xff0c;需要通知群成员&#xff0c;尽快地…

云原生业务全流程DevOps配置预研与实践

背景 我在一个二线城市&#xff08;山东济南&#xff09;&#xff0c;相对与北上广深杭这些IT业发达的城市来说&#xff0c;济南IT业对于业内新技术的接受度是有点慢的&#xff0c;国内很多一线大厂早先几年前就开始实践使用的技术&#xff0c;我们这边也是近两年才开始慢慢兴…

如何计算模型的复杂度(参数量,FLOPs)

参考 如何计算神经网络模型的复杂度 深度学习卷积、全连接层、深度可分离层参数量和FLOPs计算公式 概念 Params&#xff1a;模型的参数量。&#xff08;空间复杂度&#xff09;FLOPs&#xff1a;FLoating point Operations&#xff0c;前向推理的计算量。&#xff08;时间复…

C++函数分文件编写之VScode版

VScode实现函数的分文件编写 1.下载插件创建项目2.分文件编写内容3.修改主函数文件名 我在分享内容时经常用的软件是VScode&#xff0c;相信有些内存敏感或需要VScode便利性的小伙伴也是更愿意使用VScode。那么接下来我们就盘一盘怎样使用VScode实现分文件编写。 1.下载插件创建…

2024 Flutter 重大更新,Dart 宏(Macros)编程开始支持,JSON 序列化有救

说起宏编程可能大家并不陌生&#xff0c;但是这对于 Flutter 和 Dart 开发者来说它一直是一个「遗憾」&#xff0c;这个「遗憾」体现在编辑过程的代码修改支持上&#xff0c;其中最典型的莫过于 Dart 的 JSON 序列化。 举个例子&#xff0c;目前 Dart 语言的 JSON 序列化高度依…

来看看Tomcat和Web应用的目录结构

在前面两篇大致了解了Tomcat的架构和运行流程&#xff0c;以及Tomcat应用中的web.xml。 聊一聊Tomcat的架构和运行流程&#xff0c;尽量通俗易懂一点-CSDN博客 来吧&#xff0c;好好理解一下Tomcat下的web.xml-CSDN博客 那接下来&#xff0c;再看看Tomcat的目录&#xff0c;…