最新文�? 企业该如何拥有自主大模型,引领行业未来 学习大模型的必经之路:Transform 大模型与知识智能:心理疾病治疗的新希望 大模型泡沫退去,谁能活到下半场 大模型如何改变内容生态
原创 : 【路径规划】move_base、路径规划算法、局部避障算法介绍 历史版本:
上次修改时间:

引用自

原创 : 【路径规划】move_base、路径规划算法、局部避障算法介绍

【路径规划】move_base、路径规划算法、局部避障算法介绍

资料整理供个人学习使用。

文章目录

一、move_base

1、move_base 包内容

需要安装 navigation 包,才可以运行 move_base。

move_base 包默认算法:

  1. 全局路径规划:Dijkstra;1. 局部路径规划:航迹推算; ROS 系统的路径规划由 move_base 统筹,在 move_base 中集成了代价地图模块 costmap_2d,全局规划器(此处使用 global_planner/GlobalPlanner)和局部规划器(dwa_local_planner/DWAPlannerROS),其中 costmap_2d 分别衍生了全局代价地图和局部代价地图,此外还有恢复模块 recovery_behaviors,采用默认值即可。

2、move_base 参数解析

move_base 需要设置六个部分的参数

  1. move_base 自身参数1. 全局代价地图(global_costmap)1. 局部代价地图(local_costmap)1. 全局规划器(global_panner)1. 局部规划器(local_planner)1. recovery_behaviors(使用默认值先不讲述) 以上参数在 move_base 节点加载时全部加载,用以下参数文件格式
<;launch>;
  <;node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">;
    <;rosparam file="$(find xxx)/param/costmap_common_params.yaml" command="load" ns="global_costmap" />;
    <;rosparam file="$(find xxx)/param/costmap_common_params.yaml" command="load" ns="local_costmap" />;
    <;rosparam file="$(find xxx)/param/local_costmap_params.yaml" command="load" />;
    <;rosparam file="$(find xxx)/param/global_costmap_params.yaml" command="load" />;
    <;rosparam file="$(find xxx)/param/base_local_planner_params.yaml" command="load" />;
    <;rosparam file="$(find xxx)/param/base_global_planner_params.yaml" command="load" />;
    <;rosparam file="$(find xxx)/param/move_base_params.yaml" command="load" />;
    <;remap from="/cmd_vel" to="/cmd_vel"/>;
  <;/node>;
<;/launch>;

1. move_base 参数

move_base 自身的参数是为了控制其他模块,有着相应的关联性

注意:当全局路径规划无法到达目标点时,才会执行这个恢复模块

2. 全局代价地图参数

全局代价地图和局部代价地图都衍生于 costmap_2d 功能包,参数设置也是一样的,但是考虑到路径规划和避障的职能不同,可以采用不同的参数策略。

全局代价地图可以将膨胀半径设置更大,障碍物系数设置更高,从而使得路径规划中,能够得到远离障碍物的规划路径。
而在局部规划中,为了避免避障陷入困境,可以设置小一点的膨胀半径和障碍物系数,使得机器人能够绕过障碍物。

下面为设置代价地图的尺寸和精度参数

全局坐标到机器人底座的变换信息,可由AMCL等发布

代价地图包含多个地图层

  1. Static Map Layer1. Obstacle Map Layer1. Inflation Layer1. Other Layers 下面举例说明,在Inflation Layer中需要设置两个计算障碍物代价值的参数

公式如下 exp(-1.0 * cost_scaling_factor * (distance_from_obstacle - inscribed_radius)) * (costmap_2d::INSCRIBED_INFLATED_OBSTACLE - 1)
其中 costmap_2d::INSCRIBED_INFLATED_OBSTACLE=254 也就是说代价值最大为 253

3. 局部代价地图参数

参数设置与全局相似,只是参数的策略上可能会不同

4. 全局规划器参数

5. 局部规划器参数

局部规划器使用局部代价地图,实现在全局规划路径上的避障功能

速度参数配置

目标误差参数

前向仿真系数

轨迹评分参数

避免振荡参数

二、路径规划

1、Dijkstra

2、最佳优先搜索

缺点:如果起点和终点之间存在障碍物,则最佳优先算法找到的很可能不是最短路径

3、A*


f(n) 是节点 n 的综合优先级。当我们选择下一个要遍历的节点时,我们总会选取综合优先级最高(值最小)的节点。

启发函数:控制算法的速度和精确度

4、A* 和 Dijkstra 比较

三、局部避障

1、dwa(动态窗口法)

优点

缺点

2、teb(时间弹力带)

优点

缺点

3、dwa 和 teb 比较

teb 在运动过程中会调整自己的位姿朝向,当到达目标点时,通常机器人的朝向也是目标朝向而不需要旋转。

dwa 则是先到达目标坐标点,然后原地旋转到目标朝向。

四、move_base 更换全局路径规划算法

move_base 更换全局路径规划算法(A、Dijkstra、DWA)
A
、Dijkstra属于全局路径规划、DWA属于局部路径规划。

1、move_base.launch

move_base.launch 文件需要添加以下内容:

    <;!--加载A star、Dijkstra算法-->;
    <;param name="base_global_planner" value="global_planner/GlobalPlanner"/>;
    <;param name="planner_frequency" value="1.0" />;
    <;param name="planner_patience" value="5.0" />;
    <;!--加载DWA算法-->;
    <;param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" />;

整体的 move_base.launch 文件内容如下(其中 xxx 内容需要修改为对应自己的包):

<;launch>;
  <;!-- Arguments -->;
  <;arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>;
  <;arg name="cmd_vel_topic" default="/cmd_vel" />;
  <;arg name="odom_topic" default="/odom" />;
  <;arg name="move_forward_only" default="false"/>;
 
  <;!-- move_base -->;
  <;node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">;
    <;!--加载A star算法-->;
    <;param name="base_global_planner" value="global_planner/GlobalPlanner"/>;
    <;param name="planner_frequency" value="1.0" />;
    <;param name="planner_patience" value="5.0" />;
    <;!--加载DWA算法-->;
    <;param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS" />;
    <;!---->;
    <;rosparam file="$(find xxx)/param/costmap_common_params_$(arg model).yaml" command="load" ns="global_costmap" />;
    <;rosparam file="$(find xxx)/param/costmap_common_params_$(arg model).yaml" command="load" ns="local_costmap" />;
    <;rosparam file="$(find xxx)/param/local_costmap_params.yaml" command="load" />;
    <;rosparam file="$(find xxx)/param/global_costmap_params.yaml" command="load" />;
    <;rosparam file="$(find xxx)/param/move_base_params.yaml" command="load" />;
    <;rosparam file="$(find xxx)/param/dwa_local_planner_params_$(arg model).yaml" command="load" />;
    <;remap from="cmd_vel" to="$(arg cmd_vel_topic)"/>;
    <;remap from="odom" to="$(arg odom_topic)"/>;
    <;param name="DWAPlannerROS/min_vel_x" value="0.0" if="$(arg move_forward_only)" />;
  <;/node>;
<;/launch>;

2、修改 planner_core.cpp 文件

planner_core.cpp 文件是 navigation 包中的文件,其具体目录如下(对应自己的路径):

修改如下内容:

private_nh.param("use_dijkstra", use_dijkstra, false);

此句 true 为使用 dijkstra 算法,false 为使用 A star 算法。

ROS_INFO("use_dijkstra");
ROS_INFO("use_A_star");

此句可以在运行路径规划时,查看自己使用的是 dijkstra 还是 A star。

注意:修改完代码之后,需要删除 build 和 devel 文件,重新 catkin_make 编译。

3、问题


原因:膨胀半径设置问题,需要自己设置,最简单方法是将膨胀半径设置为机器人外切圆。

问题:机器人在运行时会出现倒着走的现象。
解决:将 base_local_planner_params.yaml 中 holonomic_robot 参数改为 false;
holonomic_robot参数意义:代表是否是全向机器人。

参考:

  1. ROS:move_base路径规划介绍、更换全局路径规划算法(A star、Dijkstra、DWA,测试当前是哪种算法,效果展示图)1. 路径规划参数解析(一)——move_base参数解析1. 路径规划之 A* 算法1. https://www.leiphone.com/category/transportation/0TCtaBOIcFOIBN69.html1. ROS局部运动规划器Teb/DWA
0条评�?
全部评论

关于博主

an actually real engineer

通信工程专业毕业,7年开发经验

技术栈:

精通c/c++

精通golang

熟悉常见的脚本,js,lua,python,php

熟悉电路基础,嵌入式,单片机

耕耘领域:

服务端开发

嵌入式开发

git

>

gin接口代码CURD生成工具

sql ddl to struct and markdown,将sql表自动化生成代码内对应的结构体和markdown表格格式,节省宝贵的时间。

输入ddl:
输出代码:

qt .ui文件转css文件

duilib xml 自动生成绑定控件代码

协议调试器

基于lua虚拟机的的协议调试器软件 支持的协议有:

串口

tcp客户端/服务端

udp 组播/udp节点

tcp websocket 客户端/服务端

软件界面

使用例子: 通过脚本来获得接收到的数据并写入文件和展示在界面上

下载地址和源码

duilib版本源码 qt qml版本源码 二进制包

webrtc easy demo

webrtc c++ native 库 demo 实现功能:

基于QT

webrtc摄像头/桌面捕获功能

opengl渲染/多播放窗格管理

janus meeting room

下载地址和源码

源码 二进制包

wifi,蓝牙 - 无线开关

实现功能:

通过wifi/蓝牙实现远程开关电器或者其他电子设备

电路原理图:

实物图:

深度学习验证工具

vtk+pcl 点云编辑工具

实现功能:

1. 点云文件加载显示(.pcd obj stl)

2. 点云重建

3. 点云三角化

4. 点云缩放

下载地址:

源码 二进制包

虚拟示波器

硬件实物图:

实现原理

基本性能

采集频率: 取决于外部adc模块和ebaz4205矿板的以太网接口速率,最高可以达到100M/8 约为12.5MPS

上位机实现功能: 采集,显示波形,存储wave文件。

参数可运行时配置

上位机:

显示缓冲区大小可调

刷新率可调节

触发显示刷新可调节

进程守护工具

基本功能:

1. 守护进程,被守护程序崩溃后自动重启。

2. 进程输出获取,显示在编辑框中。

二进制包

openblt 烧录工具

基本功能:

1. 加载openblt 文件,下载到具有openblt bootloader 运行的单片机中。

二进制包

opencv 功能验证工具(开源项目二次开发)

基本功能:

1. 插件化图像处理流程,支持自定义图像处理流程。 2. 完善的日志和权限管理

二进制包

又一个modbus调试工具

最近混迹物联网企业,发现目前缺少一个简易可用的modbus调试工具,本软件旨在为开发者提供一个简单modbus测试工具。
主打一个代码简单易修改。
特点:

1. 基于QT5

2. 基于libmodbus

3. 三方库完全跨平台,linux/windows。

二进制包

屏幕录制工具

1. 基于QT5

2. 基于ffmpeg

3. 支持自定义录屏

源代码

开源plutosdr 板卡

1. 完全开源

2. 提高固件定制服务

3. 硬件售价450 手焊产量有线

测试数据

内部DDS回环测试

接收测试

外部发送500MHZ FM波形

硬件原理图

matlab测试

2TRX版本

大部分plutosdr应用场景都是讲plutosdr板卡作为射频收发器来使用。
实际上plutosdr板卡本身运行linux 操作系统。是具有一定脱机运算的能力。 对于一些微型频谱检测,简单射频信号收发等应用完全可以将应用层直接实现在板卡上
相较于通过网卡或者USB口传输具有更稳定,带宽更高等优点。
本开源板卡由于了SD卡启动,较原版pluto支持了自定义启动应用的功能。
提供了应用层开发SDK(编译器,buildroot文件系统)。
通过usb连接电脑,经过RNDIS驱动可以近似为通过网卡连接
(支持固件的开发定制)。

二次开发例子

``` all:
arm-linux-gnueabihf-gcc -mfloat-abi=hard --sysroot=/root/v0.32_2trx/buildroot/output/staging -std=gnu99 -g -o pluto_stream ad9361-iiostream.c -lpthread -liio -lm -Wall -Wextra -lrt
clean:
rm pluto_stream

bsdiff算法补丁生成器

1. 官方bsdiff算法例子自带bzip压缩方式

2. 本例子没有压缩,直接生成补丁文件

3. 图形化界面基于DUILIB

二进制文件

版面分析即分析出图片内的具体文件元素,如文档标题,文档内容,文档页码等,本工具基于cnstd模型

Base64 Image

. 闽ICP备19002644号