TARE-PLANNER学习记录

参考:

CMU-TARE 探索算法官方社区问答汇总_cmu localplanner 部署-CSDN博客

Tare_planner学习笔记_tare planner-CSDN博客

Tare_planner 学习教程(二)_tareplanner-CSDN博客

(学习笔记)机器人自主导航从零开始第七步——TARE Planner自主探索算法-CSDN博客

11.7

配置:

首先是github地址:caochao39/tare_planner: TARE Exploration Planner for Ground Vehicles

然后需要下载CMU仿真环境(以及仿真对应场景的mesh)GitHub - HongbiaoZ/autonomous_exploration_development_environment: Leveraging system development and robot deployment for ground-based autonomous navigation and exploration.

中途有libusb问题报错,修改了sixpair.c部分代码(本机是ubuntu20.04 noetic)

具体位置如下:

autonomous_exploration_development_environment-noetic/src/joystick_drivers/ps3joy/src/sixpair.c

下面是我修改的sixpair.c全部代码

#include <string.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h> // 添加 <stdlib.h> 以支持 exit
#include <libusb-1.0/libusb.h>

#define VENDOR 0x054c
#define PRODUCT 0x0268

#define USB_DIR_IN 0x80
#define USB_DIR_OUT 0

void fatal(char *msg) { perror(msg); exit(1); }

void show_master(libusb_device_handle *devh, int itfnum) {
    printf("Current Bluetooth master: ");
    unsigned char msg[8];
    int res = libusb_control_transfer
        (devh, USB_DIR_IN | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
         0x01, 0x03f5, itfnum, msg, sizeof(msg), 5000);
    if (res < 0) { perror("USB_REQ_GET_CONFIGURATION"); return; }
    printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
           msg[2], msg[3], msg[4], msg[5], msg[6], msg[7]);
}

void set_master(libusb_device_handle *devh, int itfnum, int mac[6]) {
    printf("Setting master bd_addr to %02x:%02x:%02x:%02x:%02x:%02x\n",
           mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
    unsigned char msg[8]= { 0x01, 0x00, mac[0], mac[1], mac[2], mac[3], mac[4], mac[5] };
    int res = libusb_control_transfer
        (devh,
         USB_DIR_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE,
         0x09,
         0x03f5, itfnum, msg, sizeof(msg),
         5000);
    if (res < 0) fatal("USB_REQ_SET_CONFIGURATION");
}

void process_device(int argc, char **argv, libusb_device *dev,
                    struct libusb_config_descriptor *cfg, int itfnum) { // 修正类型声明
    int mac[6];

    libusb_device_handle *devh;
    int res = libusb_open(dev, &devh);
    if (res != 0 || !devh) fatal("usb_open");

    libusb_detach_kernel_driver(devh, itfnum);

    res = libusb_claim_interface(devh, itfnum);
    if (res < 0) fatal("usb_claim_interface");

    show_master(devh, itfnum);

    if (argc >= 2) {
        if (sscanf(argv[1], "%x:%x:%x:%x:%x:%x",
                   &mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]) != 6) {

            printf("usage: %s [<bd_addr of master>]\n", argv[0]);
            exit(1);
        }
    } else {
        FILE *f = popen("hcitool dev", "r");
        if (!f ||
            fscanf(f, "%*s\n%*s %x:%x:%x:%x:%x:%x",
                   &mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]) != 6) {
            printf("Unable to retrieve local bd_addr from `hcitool dev`.\n");
            printf("Please enable Bluetooth or specify an address manually.\n");
            exit(1);
        }
        pclose(f);
    }

    set_master(devh, itfnum, mac);

    libusb_release_interface(devh, itfnum);
    libusb_close(devh);
}

int main(int argc, char *argv[]) {  
    libusb_context *ctx = NULL;
    int r = libusb_init(&ctx);
    if (r < 0) {
        fprintf(stderr, "Failed to initialize libusb: %s\n", libusb_error_name(r));
        return 1;
    }

    libusb_device **devs;
    ssize_t cnt = libusb_get_device_list(ctx, &devs);
    if (cnt < 0) {
        fprintf(stderr, "Failed to get device list\n");
        libusb_exit(ctx);
        return 1;
    }

    int found = 0;
    for (ssize_t i = 0; i < cnt; i++) {
        libusb_device *dev = devs[i];
        struct libusb_device_descriptor desc; // 使用struct修正类型声明
        int res = libusb_get_device_descriptor(dev, &desc);
        if (res < 0) {
            fprintf(stderr, "Failed to get device descriptor\n");
            continue;
        }

        if (desc.idVendor == VENDOR && desc.idProduct == PRODUCT) {
            process_device(argc, argv, dev, NULL, 0);
            found++;
        }
    }

    libusb_free_device_list(devs, 1);
    libusb_exit(ctx);

    if (!found) {
        printf("No controller found on USB busses. Please connect your joystick via USB.\n");
        return 1;
    }

    return 0;
}

然后是protobuf版本问题,降版本到protobuf3.6.1编译就ok了

运行仿真:

选取仿真的环境(替换enviroment)

source devel/setup.sh
roslaunch vehicle_simulator system_<environment>.launch
source devel/setup.sh
roslaunch tare_planner explore_<environment>.launch

比如要在garage中进行:

source devel/setup.sh
roslaunch vehicle_simulator system_garage.launch

source devel/setup.sh
roslaunch tare_planner explore_garage.launch 

下面在campus环境运行,记录在仿真环节的问题:

1.or-tools解决tsp问题(局部路径规划),如何进行路径平滑?

2.随着机器人局部路径规划进行,以及机器人进行运动,发现绿色方块深浅发生变化,这代表什么变化了?

3.发现随着局部路径规划进行,外部绿色方块减少的时候,浅蓝色路径也会更新,是否和全局路径相关?

思考:局部路径算法和全局路径算法分开,局部路径负责动态更新绿色方框内各个view_point之间的路径规划,而全局路径是在绿色方块进行更新时,进行重新规划淡蓝色路径的。

ps:如何去确定哪几个viewpoint去和外面的绿色方块连接呢?

后续校园环境仿真方案:

1.纯lidar方案

采集纯激光雷达点云地图导入CloudCompare进行downsample和计算每个点的normal。然后将其保存成文件(比如ply格式),再用meshlab打开并重建成mesh。最后用meshlab把它存成dae格式的文件,加载进gazebo进行仿真即可。

2.rgb方案

对图像渲染有要求的话则可以用图像生成3D模型(campus环境制作方案),先用google earth对其从不同的角度采集图片,最后用这些图片进行3D reconstruction

用谷歌地球采集图片之后,3D重建再保存为dae  使用meshroom

meshroom:https://github.com/alicevision/meshroom

FAST-LIO部署:

 使用 fastlio 部署 system_real_robot.launch

    问:使用fastlio部署system_real_robot.launch loam接口按照要求已经调整好,发现tf树没连接上,不知道怎么修改,还有fastlio的frame坐标在地图上混乱的 应该怎么调整?
    答:你好,我们的系统实际需要的就是两个话题,一个是包含sensor在map下的odometry(integrated_to_init),另一个就是当前帧点云在map下的投影(velodyne_cloud_registered),只要提供这两个信息,loam_interface会自己发布一套tf以及点云出来。需要注意的就是在fastlio里不能发布重复的map到sensor的关系,最简单的做法就是将fastlio里的map和sensor(如果有的话)都换成别的名字,防止重复发布有冲突的tf

调试问题:

https://bbs.csdn.net/topics/614500720

阅读源码:

1.exploration_path

主要是实现了一个用于探索和路径规划的基础数据结构

类名作用
Node表示探索路径中的一个节点,包含节点类型、位置、状态信息等。
ExplorationPath管理和操作由多个节点组成的路径,支持路径的添加、转换、反转和可视化。

2.graph

基本的图(Graph)结构,用于路径规划和距离计算,特别是支持在图结构中进行A*搜索,以找到两个节点之间的最短路径(这里用的是A*,局部路径tsp采用的or-tools?)

3.keypose_graph

用于处理机器人探索环境中的关键位姿图(Keypose Graph),并为机器人提供了导航、避障、路径规划、连通性检测等功能

  • 图的构建与动态更新
  • 避障与连通性检查
  • 路径规划与最短路径查找
  • 关键位姿节点的管理
  • 环境动态更新与可达性检测

keypose_graph 是用来搜索路径用的,相当于一个 roadmap。

keypose 最开始是从 SLAM 端来的,如果 SLAM 算法提供闭环检测的话,keypose 就是关键帧对应的机器人位姿。在开源的版本里省去了对闭环的处理,所以直接从机器人的轨迹上取点了。

普通点是保留了机器人周围的可行驶视点。

keypose_graph_cloud 内有两类,is_keypose 和 普通节点。

  • keypose 是机器人行进轨迹上按一定频率留下来的点;
  • 其他普通节点是在 global planning里,以视点候选点为节点求出 cells 之间的路径后,在这些路径上留下来的点。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JMeter基础篇

目录 总目录&#xff1a; 一、JMeter简介&#xff1a; -用途&#xff1a; -优缺点&#xff1a; 二、JMeter安装&#xff1a; 三、项目简介&#xff1a; -学生管理系统&#xff1a; -API接口清单&#xff1a; 查询&#xff1a; 新增&#xff1a; 更新&#xff1a; 删…

AWTK-HarmonyOS NEXT 发布

AWTK 全称为 Toolkit AnyWhere&#xff0c;是 ZLG 倾心打造的一套基于 C 语言开发的 GUI 框架。旨在为用户提供一个功能强大、高效可靠、简单易用、可轻松做出炫酷效果的 GUI 引擎&#xff0c;支持跨平台同步开发&#xff0c;一次编程&#xff0c;到处编译&#xff0c;跨平台使…

右旋圆极化散射后的stocks矢量 与T3矩阵的关系

T3矩阵如下 斯托克斯与T3的关系如下。 斯托克斯与T3均没有平均处理&#xff0c;即斯托克斯是完全极化波的&#xff08;一种琼斯矢量得到&#xff09;&#xff0c;T3是由一个散射矩阵得到&#xff0c;只有一个特征值。

理解 WordPress | 第二篇:结构化分析

WordPress 专题致力于从 0 到 1 搞懂、用熟这种可视化建站工具。 第一阶段主要是理解。 第二阶段开始实践个人博客、企业官网、独立站的建设。 如果感兴趣&#xff0c;点个关注吧&#xff0c;防止迷路。 WordPress 的内容和功能结构可以按照层级来划分&#xff0c;这种层次化的…

Python-利用os,tkinter库编写一个伪恶意程序文件(Pro版)

前言&#xff1a;上一期我们简单学习了如何编写一个多次弹窗警告用户的exe伪恶意文件。我们知道了把Python初始文件编译为exe文件后&#xff0c;程序在没有Python环境的情况下也能正常运行。我们上次编写的程序仅仅只是伪造系统正在执行关机命令前的倒计时的假象&#xff0c;实…

大语言模型训练的全过程:预训练、微调、RLHF

一、 大语言模型的训练过程 预训练阶段&#xff1a;PT&#xff08;Pre training&#xff09;。使用公开数据经过预训练得到预训练模型&#xff0c;预训练模型具备语言的初步理解&#xff1b;训练周期比较长&#xff1b;微调阶段1&#xff1a;SFT&#xff08;指令微调/有监督微调…

字节青训-小S的倒排索引

问题描述 小S正在帮助她的朋友们建立一个搜索引擎。为了让用户能够更快地找到他们感兴趣的帖子&#xff0c;小S决定使用倒排索引。倒排索引的工作原理是&#xff1a;每个单词都会关联一个帖子ID的列表&#xff0c;这些帖子包含该单词&#xff0c;且ID按从小到大的顺序排列。 例…

你需要了解的正则表达式相关知识

正则表达式&#xff08;Regular Expression&#xff0c;简称 regex 或 regexp&#xff09;是一种用于匹配字符串的模式。它广泛应用于文本查找、替换、验证等场景&#xff0c;尤其是在数据处理、网络爬虫、编程等领域非常有用。下面将详细介绍正则表达式的基本语法、常用元字符…

掌握分布式系统的38个核心概念

天天说分布式分布式&#xff0c;那么我们是否知道什么是分布式&#xff0c;分布式会遇到什么问题&#xff0c;有哪些理论支撑&#xff0c;有哪些经典的应对方案&#xff0c;业界是如何设计并保证分布式系统的高可用呢&#xff1f; 1. 架构设计 这一节将从一些经典的开源系统架…

【C++进阶】智能指针的使用和原理(2)

5. shared_ptr和weak_ptr 5.1 shared_ptr循环引用问题 shared_ptr大多数情况下管理资源⾮常合适&#xff0c;⽀持RAII&#xff0c;也⽀持拷贝。但是在循环引⽤的场景下会导致资源没得到释放内存泄漏&#xff0c;所以我们要认识循环引用的场景和资源没释放的原因&#xff0c;并…

【Uniapp】Uniapp Android原生插件开发指北

前言 在uniapp开发中当HBuilderX中提供的能力无法满足App功能需求&#xff0c;需要通过使用Andorid/iOS原生开发实现时&#xff0c;或者是第三方公司提供的是Android的库&#xff0c;这时候可使用App离线SDK开发原生插件来扩展原生能力。 插件类型有两种&#xff0c;Module模…

linux进程的状态之环境变量

我们在前面了解了进程的状态及相关概念 接下来我们接着上一篇进程的状态接着了解环境变量 进程的状态 文章目录 目录 文章目录 前言 二、环境变量 1、常见环境变量 2、查看环境变量 3、修改PATH 4、HOME 5、PATH ​编辑 6、和环境变量相关的命令 三、环境变量的组织…

揭秘集装箱箱号自动识别原理,箱号识别算法

集装箱箱号自动识别算法是一种高效且实用的软件工具。它利用相机、手机或其他摄像头捕获集装箱箱号图像&#xff0c;并通过深度学习的OCR&#xff08;光学字符识别&#xff09;识别技术对集装箱号码进行准确识别。要想进行集装箱箱号识别&#xff0c;需要以下几个基本步骤&…

AndroidLab:一个系统化的Android代理框架,包含操作环境和可复现的基准测试,支持大型语言模型和多模态模型。

2024-10-31&#xff0c;由清华大学和北京大学共同创建的AndroidLab数据集&#xff0c;为安卓自主代理的训练和评估提供了一个包含操作环境、行动空间和可复现基准的系统框架&#xff0c;这对于推动安卓代理技术的发展具有重要意义。 数据集地址&#xff1a;Android Instruct|A…

使用axois自定义基础路径,自动拼接前端服务器地址怎么办

请求路径&#xff1a; http://localhost:5173/http://pcapi-xiaotuxian-front-devtest.itheima.net/home/category/head 很明显多拼接了路径地址 查看基础路径文件发现&#xff1a; //axios基础封装 import axios from axiosconst httpInstance axios.create({baseURL: /h…

Densenet模型花卉图像分类

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

【Mysql NDB Cluster 集群(CentOS 7)安装笔记一】

Mysql NDB Cluster 集群(CentOS 7)安装笔记 NDB集群核心概念 NDBCLUSTER(也称为NDB)是一个内存存储引擎,提供高可用性和数据保存功能。 NDBCLUSTER存储引擎可以配置一系列故障转移和负载平衡选项,但从集群级别的存储引擎开始是最容易的。NDB集群的NDB存储引擎包含一整套…

Pattern program MPAT 详解

本文为VIP文章,主要介绍Pattern中元素与格式、常用指令、地址&数据产生指令等。 目录 一、pattern概述 二:Pattern构成元素 1、pattern构成元素:MPAT、END 2、pattern构成元素:pattern file name 3、pattern构成元素:SDEF 4、Pattern构成元素:REGISETR 5、Pa…

【通义灵码】AI编码新时代

目录 一.初识灵码&#xff0c;开启新篇 安装 登录 二.灵码相伴&#xff0c;探索新境 实时续写 自然生成 单元测试生成 解释代码 优化建议 快捷键 三.智慧流转&#xff0c;高效开发 驱动移植 LVGL框架 项目总结 四.融合创新&#xff0c;携手同行 一.初识灵码&#…

RabbitMQ客户端应用开发实战

这一章节我们将快速完成RabbitMQ客户端基础功能的开发实战。 一、回顾RabbitMQ基础概念 这个RabbitMQ的核心组件&#xff0c;是进行应用开发的基础。 二、RabbitMQ基础编程模型 RabbitMQ提供了很多种主流编程语言的客户端支持。这里我们只分析Java语言的客户端。 上一章节提…