其他分享
首页 > 其他分享> > ROS使用总结(AGV方向)

ROS使用总结(AGV方向)

作者:互联网

目录

1. ros安装

1.1. 添加源

sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'

1.2. 添加私钥

wget https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -O - | sudo apt-key add -
打不开则:
sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116

1.3. 更新软件列表

sudo apt-get update,会报GPG错误,解决办法是添加公钥:sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654

1.4. 安装ros

sudo apt-get install ros-melodic-desktop-full
安装目录在/opt/ros下。

1.5. 初始化

sudo rosdep init
rosdep update

1.5.1. 问题1

提示:sudo rosdep:找不到命令提示,执行下面指令:
sudo apt install python-rosdep

1.5.2. 问题2

提示:ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list Website may be down.

1.6. 环境变量配置

放到~/.bashrc文件最后
source /opt/ros/melodic/setup.bash
然后执行source ~/.bashrc

1.7. 安装rosinstall

sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential
安装ros插件sudo apt install ros-melodic-jsk-rviz-plugins

1.8. 测试小乌龟

1.9. 测试rviz

rosrun rviz rviz,发现报段错误,需要将export LIBGL_ALWAYS_INDIRECT=添加到.bashrc文件最后。

1.10. 卸载ros

sudo apt-get remove ros-melodic-*

2. 注意注意

建议启动新的节点时,将roscore重启一下,防止莫名其妙的错误!!

3. 创建工作空间与功能包

ros的工作空间是我们开发ros项目的一个工作目录

  • src:代码空间,包含代码、lanuch文件、配置文件等等,是源码所在的目录;
  • build:编译空间,包含编译过程中产生的中间文件;
  • devel:开发空间,编译生成的可执行文件、库等等;
  • install:安装空间,用install命令安装的文件放置的位置(开发基本用不到)。

3.1. 创建工作空间

mkdir -p ~/catkin_ws/src 
cd ~/catkin_ws/src
catkin_init_workspace

3.2. 编译工作空间

cd ~/catkin_ws
catkin_makecatkin_make install,后者会将可执行文件放入install文件夹

3.3. 设置环境变量

在.bashrc最后添加:
source ~/catkin_ws/devel/setup.bash
source ~/.bashrc

3.4. 检查环境变量

echo $ROS_PACKAGE_PATH

3.5. 创建功能包

功能包是放置代码的最小单元
cd ~/catkin_ws/src
catkin_create_pkg test_pkg std_msgs roscpp(catkin_create_pkg<功能包名>[依赖1][依赖2])

3.6. 编译功能包

cd ~/catkin_ws
catkin_make

3.7. 编译指定的功能包

4. 话题

4.1. 发布与订阅

4.2. 自定义话题消息

5. 服务

5.1. 客户端与服务

5.2. 自定义服务数据

6. 参数服务Parameter Server (全局字典)

使用命令rosparam操作变量,参考上面。ROS用的是YAML格式文件。  
参考test_param包。

7. ros中坐标系管理系统

【 原理 】 : 通过tf包的发布功能,可以发布一组坐标之间的转换关系(平移+旋转), 构建一个树形结构,然后通过lookupTransform()接口可以获取任意两个坐标之间的转换关系,不用自己再计算了,强大!!即通过tf广播器广播坐标映射关系,通过tf监听器得到任意两个坐标系之间的关系

7.1. 代码解释

 static tf::TransformBroadcaster tfb;  
 tfb.sendTransform(tf::StampedTransform(tr, ros::Time::now(), "world", strTurtlename));   
 tf::TransformListener listener;  
 tf::StampedTransform tr;
 listener.waitForTransform("/turtle2", "/turtle1", ros::Time(0), ros::Duration(3.0)); //从当前时间开始,等待一段时间3s,没有数据应该会异常(猜的),有数据返回  
 listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), tr); //获取转换关系   

7.2. 相关指令

geometry_msgs/TransformStamped[] transforms
std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id 
string child_frame_id #子坐标系
geometry_msgs/Transform transform
  geometry_msgs/Vector3 translation
    float64 x
    float64 y
    float64 z
  geometry_msgs/Quaternion rotation
    float64 x
    float64 y
    float64 z
    float64 w

7.3. ROS基本坐标系理解:map, odom, base_link, base_footprint, base_laser等等

参考链接https://blog.csdn.net/weixin_46181372/article/details/109694300

两个问题:
①位姿矩阵得到的不应该是map->base_link的tf关系吗?map坐标系与odom坐标系又有什么关系?
其实机器人刚开始运动时,odom坐标系与map坐标系是重合的,即odom->base_link与map->base_link的tf是一致的。
但是随着时间的推移,出现了偏差,出现的偏差也就是里程计的累计误差,如果里程计精确度很高,没有计算误差,那么map坐标系与odom坐标系会一直是重合的。
然而实际情况中,里程计是有偏差的,所以我们计算里程计得到的位姿矩阵是odom->base_link,与map->base_link还是有偏差的。
②那么map->odom的tf是怎么得到的呢?
除去里程计还有一些合作校正的传感器例如imu,这些传感器可以估计出机器人在地图中的位置也就是map->base_link的tf,我们估计机器人在地图中的位置和解算里程计得到的位置的偏差也就是map->odom的tf。

8. launch启动文件

任何包含两个或两个以上节点的系统都可以利用启动文件来指定和配置需要使用的节点。通常的命名方案是以.launch作为启动文件的后缀,启动文件是XML文件。一般把启动文件存储在取名为launch的目录中。

8.1. 指令

roslaunch [options] [package] <filename> [arg_name:=value...]
roslaunch [options] <filename> [<filename>...] [arg_name:=value...]
options: 未知
package: 包名
filename: launch文件
arg_name:=value : arg_name参数名,可覆盖launch文件中的指定para值

8.2. 节点说明

respawn = “true”:复位属性,该节点停止时,会自动重启,默认为false;
required = “true”:必要节点,当该节点终止时,launch文件中的其他节点也被终止;
ns = “namespace”:命名空间,为节点内的相对名称添加命名空间前缀,同一个launch文件中,允许不同namespace中出现相同的node names;
args = “arguments”:节点运行时输入的参数。

9. 可视化工具介绍

10. ROS-Navigation安装

官方链接:http://wiki.ros.org/navigation

10.1. 安装方式

注意,如果通过turtlebot来仿真,当用apt-get安装时它会自动下载导航包。这里因为可能会研究源码,利用源码进行安装。

方式一,通过apt-get安装编译好的包;
方式二,通过源码编译安装–推荐。会安装如下包:

navigation (metapackage)   map_server  amcl  fake_localization  voxel_grid  costmap_2d  nav_core  base_local_planner   carrot_planner  clear_costmap_recovery  dwa_local_planner  move_slow_and_clear  navfn  global_planner  rotate_recovery  move_base

10.2. 源码安装

10.3. 安装teb_local_planner插件

传统的navigation里的路径规划策略性能不佳。在尝试了teb_local_planner后,发现机器人导航性能得到非常大的提升。
为了编译时不再检查前面装的包,可以在前面包源码目录下新建CATKIN_IGNORE文件夹。

10.4. 安装cartographer_ros模块

参考链接https://google-cartographer-ros.readthedocs.io/en/latest/compilation.html

10.4.1. 安装wstool和rosdep以及Ninjia

sudo apt-get update
sudo apt-get install -y python3-wstool python3-rosdep ninja-build stow
这里会报错缺少依赖包,因为之前装的都是python2的包,按照提示添加上依赖包后会导致ROS重新安装(我擦),所以用下面的指令代替:
sudo apt-get install -y python-wstool python-rosdep ninja-build stow

10.4.2. 安装cartographer_ros

mkdir catkin_ws
cd catkin_ws
wstool init src
wstool merge -t src https://raw.githubusercontent.com/cartographer-project/cartographer_ros/master/cartographer_ros.rosinstall
wstool update -t src

这里最后一步速度很慢,对hosts文件进行如下配置,然后重启网卡(结果不太明显):

#解决git clone 速度慢的问题
192.30.253.112 github.com
151.101.185.194 github.global.ssl.fastly.net
#解决浏览器下载master-zip包的问题
192.30.253.120 codeload.github.com
#解决github不能查看图片的问题
199.232.68.133 raw.githubusercontent.com

10.4.3. 安装依赖

rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y

发现依赖了下面的包:libatlas3-base libgflags2.2 libgoogle-glog0v5 libceres1 libgflags-dev libgoogle-glog-dev libceres-dev

10.4.4. 手动安装abseil-cpp library

src/cartographer/scripts/install_abseil.sh
执行后下载了https://github.com/abseil/abseil-cpp.git,并编译该库。该库是google开源的内部通用库。

10.4.5. 构建cartographer_ros

catkin_make_isolated --install --use-ninja
source install_isolated/setup.bash
编译构建过程中可能出现内存不足的问题,参考上面ROS-Navigation解决办法。

11. turtlebot仿真(利用karto)

参考链接
https://blog.csdn.net/qq_40078576/article/details/104773668
https://blog.csdn.net/lingchen2348/article/details/79503970

11.1. 安装Gazebo仿真软件

安装ros时已经安装。

11.2. 下载Gazobo的模型包

不需要再下载模型包了,turtlebot包会加载出模型。

11.3. 安装slam建图包

turtlebot3支持gmapping、cartographer、hector、karto、frontier_exploration。

11.3.1. karto安装

sudo apt-get install ros-melodic-slam-karto

11.3.2. 安装cartographer_turtlebot(待完善TODO)

注意这里不是cartographer_ros,参考链接https://www.ncnynl.com/archives/201801/2230.html

11.4. 安装turtlebot相关包

sudo apt-get install ros-melodic-turtlebot-*

11.5. 加载环境

roslaunch turtlebot3_gazebo turtlebot3_world.launch
报错:‘TURTLEBOT3_MODEL’ is not set。表示TURTLEBOT3_MODEL没有设置, 需要给它指定[burger, waffle, waffle_pi]中的一个, 我们随便指定一个:export TURTLEBOT3_MODEL=burger(可以写入.bashrc文件),重新执行命令。

11.6. 启动键盘遥控节点

可以遥控小车行走。新建终端,
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

11.7. 建图

这里选择了karto。新建终端,
roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=karto

11.8. 保存地图

控制小车扫描完地图后,保存地图:
mkdir -p ~/maps/turtlebot3
rosrun map_server map_saver -f ~/maps/turtlebot3/map1

11.9. 导航

利用刚才扫描的地图进行导航控制。关闭建图终端,关闭手动键盘控制后:
roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=~/maps/turtlebot3/map1.yaml
记录本机地址:roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=/mnt/e/wsl/maps/turtlebot3/map1.yaml
接下来首先要做的是调整RViz中turtlebot在地图中的位姿,使其与Gazebo中turtlebot在环境中的位姿一致。做法是用鼠标选中RViz工具栏中的“2D Pose Estimate”,然后根据Gazebo中tuetlebot的位姿点击RViz地图中的相应位置,注意姿态也要相同。
接下来我们就开始导航了,鼠标选择工具栏中的“2D Nav Goal”,在地图中任意设置一个目标位姿,turtlebot便会自动规划路径,然后慢悠悠地移动过去。

11.10. 分析

11.10.1. 建图分析

11.10.1.1. 建图启动文件

建图的指令中用到了turtlebot3_slam.launch文件

 <launch>
  2   <!-- Arguments -->
  3   <arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/>
  4   <arg name="slam_methods" default="gmapping" doc="slam type [gmapping, cartographer, hector, karto, frontier    _exploration]"/>
  5   <arg name="configuration_basename" default="turtlebot3_lds_2d.lua"/>
  6   <arg name="open_rviz" default="true"/>
  7
  8   <!-- TurtleBot3 -->
  9   <include file="$(find turtlebot3_bringup)/launch/turtlebot3_remote.launch">
 10     <arg name="model" value="$(arg model)" />
 11   </include>
 12
 13   <!-- SLAM: Gmapping, Cartographer, Hector, Karto, Frontier_exploration, RTAB-Map -->
 14   <include file="$(find turtlebot3_slam)/launch/turtlebot3_$(arg slam_methods).launch">
 15     <arg name="model" value="$(arg model)"/>
 16     <arg name="configuration_basename" value="$(arg configuration_basename)"/>
 17   </include>
 18
 19   <!-- rviz -->
 20   <group if="$(arg open_rviz)">
 21     <node pkg="rviz" type="rviz" name="rviz" required="true"
 22           args="-d $(find turtlebot3_slam)/rviz/turtlebot3_$(arg slam_methods).rviz"/>
 23   </group>
 24 </launch>

可以看到默认的slam_methods是gmapping,我们传入的是karto。有三大部分:TurtleBot3、SLAM和rviz。
TurtleBot3加载了turtlebot3_remote.launch文件,对应了/robot_state_publisher节点,SLAM加载了turtlebot3_karto.launch,对应了/slam_karto节点,打开了rviz软件。

11.10.1.2. 建图节点视图

执行rosrun rqt_graph rqt_graph如图所示:
在这里插入图片描述
[(./img/0.png)]

我们通过rosnode info /slam_karto查看到/slam_karto发布的主题/map是nav_msgs/OccupancyGrid类型,可以供保存地图使用。

11.10.2. 保存地图

保存地图使用的指令:
rosrun map_server map_saver -f ~/maps/turtlebot3/map1
这里利用了map_server的命令行功能,从/map中接收了[nav_msgs/OccupancyGrid]类型的数据,可以通过rosmsg show nav_msgs/OccupancyGrid查看数据的格式,并把它写到map1.pgm和map1.yaml中。
.pgm说明如下:

  • 该图像描述了相应像素的颜色中的世界的每个单元的占用状态。白色像素是自由的,黑色像素被占据,并且两者之间的像素是未知的。接受彩色和灰度图像,但大多数地图都是灰色的(即使它们可能存储为彩色)。YAML文件中的阈值用于划分三个类别; 阈值在map_server内部完成。
  • 当与阈值参数比较时,图像像素的占用概率计算如下:occ =(255-color_avg)/ 255.0其中color_avg是通过在所有通道上求平均值而得到的8位值,例如,如果图像是24位颜色,具有颜色0x0a0a0a的像素具有0.96的概率,这是非常占用的。颜色0xeeeeee产生0.07,这是非常空的。
  • 当通过ROS消息通信时,占用被表示为范围[0,100]中的整数,0意味着完全自由,100意味着完全被占用,并且特殊值-1用于完全未知。

.yaml格式如下:

image:包含占用数据的图像文件的路径; 可以是绝对的,或相对于YAML文件的位置
resolution:地图的分辨率,米/像素
origin:地图中左下像素的2-D姿态为(x,y,yaw),偏航为逆时针旋转(yaw = 0表示无旋转)。系统的许多部分目前忽略偏航。通过该值可以计算出地图的(0,0)点。
occupancy_thresh:占据概率大于该阈值的像素被认为完全占用。
free_thresh:占有概率小于该阈值的像素被认为是完全自由的。
negate:白/黑自由/占用语义是否应该被反转(阈值的解释不受影响)
其余具体参考/map_server章节。

11.10.3. 导航分析

11.10.3.1. 启动文件

导航用的是turtlebot3_navigation.launch文件:

   <launch>
     <!-- Arguments -->
     <arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/> <!--模型-->
     <arg name="map_file" default="$(find turtlebot3_navigation)/maps/map.yaml"/> <!--地图参数-->
     <arg name="open_rviz" default="true"/>
     <arg name="move_forward_only" default="false"/>
  
     <!-- Turtlebot3 -->
     <include file="$(find turtlebot3_bringup)/launch/turtlebot3_remote.launch">
      <arg name="model" value="$(arg model)" />
    </include>
 
    <!-- Map server -->
    <node pkg="map_server" name="map_server" type="map_server" args="$(arg map_file)"/>
 
    <!-- AMCL -->
    <include file="$(find turtlebot3_navigation)/launch/amcl.launch"/>
 
    <!-- move_base -->
    <include file="$(find turtlebot3_navigation)/launch/move_base.launch">
      <arg name="model" value="$(arg model)" />
      <arg name="move_forward_only" value="$(arg move_forward_only)"/>
    </include>
 
    <!-- rviz -->
    <group if="$(arg open_rviz)">
      <node pkg="rviz" type="rviz" name="rviz" required="true"
            args="-d $(find turtlebot3_navigation)/rviz/turtlebot3_navigation.rviz"/>
    </group>
  </launch>

11.10.3.2. 节点视图

如图所示:
在这里插入图片描述

[(./img/1.png)]

11.10.3.3. /tf和/tf_static

/tf是只要有节点发布就会有消息;
/tf_static是在已知的坐标发生变化或有新的节点订阅的时候才会发布新的消息。(未验证)

11.10.3.4. /gazebo

11.10.3.5. /robot_state_publisher

11.10.3.6. /amcl

定位模块,这里不关注amcl用的粒子滤波算法,我们要将其替换为cartographer算法。

11.10.3.7. /map_server

map_server有两个功能:

  • 当做map_server节点服务,它从磁盘加载静态地图数据作为一个ROS服务提供地图数据。
  • 提供map_saver地图保存命令行功能,通过指令从/map中接收网格地图数据,然后保存成ROS专用格式的地图,参考上面的[保存地图]章节。

本节点发布话题/map给move_base用,具体格式参考上面的[保存地图]章节。

11.10.3.8. /move_base

参考链接https://www.pianshen.com/article/3044120500/
局部路径规划之DWAPlannerROS分析:https://www.cnblogs.com/sakabatou/p/8297479.html
参考<move_base详解>

12. turtlebot仿真(利用cartographer_ros替换karto)

参考链接
https://blog.csdn.net/qq_34935373/article/details/111991920
https://www.freesion.com/article/9794248452/

12.1. 官方纯定位Pure localization仿真测试

12.1.1. 下载数据集

wget -P mnt/e/wsl/cartographer_demo/pureLoc/ https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/b2-2016-04-05-14-44-52.bag  
wget -P mnt/e/wsl/cartographer_demo/pureLoc/ https://storage.googleapis.com/cartographer-public-data/bags/backpack_2d/b2-2016-04-27-12-31-41.bag

第一个用于建图,第二个用于定位。

12.1.2. 建图

自己的路径:

roslaunch cartographer_ros offline_backpack_2d.launch bag_filenames:=/mnt/e/wsl/cartographer_demo/pureLoc/b2-2016-04-05-14-44-52.bag

生成.pbstream的地图文件.

12.1.3. 定位

自己的路径:

roslaunch cartographer_ros demo_backpack_2d_localization.launch \
   load_state_filename:=/mnt/e/wsl/cartographer_demo/pureLoc/b2-2016-04-05-14-44-52.bag.pbstream \
   bag_filename:=/mnt/e/wsl/cartographer_demo/pureLoc/b2-2016-04-27-12-31-41.bag

这里第一个参数是用的地图,第二个参数是下载的数据集进行定位测试。

12.2. turtlebot3仿真建图

12.3. turtlebot3仿真导航

[关键]上个步骤中实际已经启动了move_base节点,可以一边扫图一边导航控制。具体可查看turtlebot3_cartographer.launch文件。
如果需要单独进行定位导航,那么需要修改cartographer_ros的源码,将那行代码注释掉,不然你纯定位过程建立的子图会覆盖在之前建好的地图上。但建图是需要的,所以得改一种传参的办法:

//cartographer_ros-master\cartographer_ros\cartographer_ros\occupancy_grid_node_main.cc:
//occupancy_grid_publisher_.publish(*msg_ptr); //注释掉

13. move_base详解

13.1. move_base配置参数解读

参考链接:https://blog.csdn.net/banzhuan133/article/details/90239252
https://wenku.baidu.com/view/1ae6d9a56729647d27284b73f242336c1fb9304d.html
https://blog.csdn.net/qq_29313679/article/details/106237063
在仿真中,查看turtlebot3_navigation/param/move_base.launch,发现局部规划器用的是DWAPlannerROS,同时加载了下面几个yaml文件:

costmap_common_params_$(arg model).yaml  
local_costmap_params.yaml  
global_costmap_params.yaml  
move_base_params.yaml  
dwa_local_planner_params_$(arg model).yaml  

这里的(arg model)用的burger模型。
在rviz下,直接用鼠标选定2D navigation goal就可以指定目标了,但是,你可能会发现效果不太好,比如,疯狂原地打转,走S型,绕大圈等现象。这些都可以通过调参搞定。
重点看后两个move_base_params.yaml、dwa_local_planner_params_$(arg model).yaml文件。
move_base_params.yaml:

shutdown_costmaps: false   #当move_base不在活动状态时,是否关掉costmap的加载。  
controller_frequency: 10.0 #局部规划器执行频率,也是发送cmd_vel命令的频率。     
planner_patience: 5.0  #全局规划器未规划出路线超过本时间,进行清理操作。        
controller_patience: 15.0  #局部规划器未规划出路线超过本时间,进行清理操作。   
conservative_reset_dist: 3.0 #在恢复模块执行后,重置的代价地图范围  
planner_frequency: 5.0   #全局规划操作频率,如果为0,则仅在接收到新的目标点或局部路径堵塞时才重新规划路径。       
oscillation_timeout: 10.0  #执行修复机制前,允许的震荡时长(秒)     
oscillation_distance: 0.2  #来回运动在多大距离以上不会认为是震荡  
recovery_behavior_enabled: true  #是否使用恢复模块     

dwa_local_planner_params.yaml

DWAPlannerROS:  
 # Robot Configuration Parameters (机器人配置参数)                                 
   max_vel_x: 0.22  #最大x轴方向线速度  
   min_vel_x: -0.22 #最小x轴方向线速度  

   max_vel_y: 0.0  
   min_vel_y: 0.0  

  # The velocity when robot is moving in a straight line (机器人直线运行时的速度)  
    max_vel_trans:  0.22  #最大线速度  
    min_vel_trans:  0.11  
 
    max_vel_theta: 2.75  #最大角速度  
    min_vel_theta: 1.37  
 
    acc_lim_x: 2.5  #x轴方向最高加速度  
    acc_lim_y: 0.0  
    acc_lim_theta: 3.2  
 
  # Goal Tolerance Parametes (目标误差参数)  
    xy_goal_tolerance: 0.05  #路径规划到达点与目标点的距离允许偏差  
    yaw_goal_tolerance: 0.17 #路径规划到达点与目标点的角度允许偏差  
    latch_xy_goal_tolerance: false  
 
  # Forward Simulation Parameters(前向仿真参数)  
    sim_time: 1.5  #仿真时间,仿真距离=sim_time*vel  
    vx_samples: 20 #x轴方向速度采样数量,至少是1,否则会被强制设定为1  
    vy_samples: 0  
    vth_samples: 40  
    controller_frequency: 10.0  #发布控制速度的频率    
 
  # Trajectory Scoring Parameters(轨迹评分参数),系数影响的是本代价算法在最终代价中的一个比例    
    path_distance_bias: 32.0  #局部规划路径与全局路径保持一致的权重系数, path_costs和alignment_costs使用 
    goal_distance_bias: 20.0 #无论从什么路径以多大权重尝试到达目标点,增大后于全局规划路径一致性降低,goal_costs_和goal_front_costs_使用  
    occdist_scale: 0.02  #权衡机器人以多大的权重躲避障碍物。该值过大会导致机器人陷入困境,obstacle_costs_使用  
    forward_point_distance: 0.325  #将机器人与目标点连线并延长forward_point_distance距离作为一个评分点  
    stop_time_buffer: 0.2  #为防止碰撞,机器人必须提前停止的时间长度  
    scaling_speed: 0.25  #开始缩放机器人足迹时的速度的绝对值,单位为m/s  
    max_scaling_factor: 0.2  #最大缩放因子  
 
  # Oscillation Prevention Parameters(避免振荡参数)  
    oscillation_reset_dist: 0.05  #机器人运动多远距离才会重置振荡标记  
 
  # Debugging  
    publish_traj_pc : true  
    publish_cost_grid_pc: true  #是否发布计算后的cost话题  

13.2. 启动流程

move_base节点源文件位于/navigation-melodic-devel/move_base/move_base_node.cpp,其调用了move_base.cpp中的MoveBase的构造。主要的初始化过程也在这个构造中。大概内容如下:

13.3. executeCb回调

该回调函数在收到目标点时会触发调用,收到新的目标点的话会通过ROS的actionlib机制进行处理,可以调用一些接口来判断,actionlib我们不关心,大概的流程如下:

13.4. executeCycle接口

本函数的核心在状态CONTROLLING处理逻辑中。通过调用dwa_planner_ros.cppDWAPlannerROS类的computeVelocityCommands()接口来计算下发给AGV底盘的指令。这里AGV清除恢复CLEARING及流程我们不关心。

13.5. computeVelocityCommands接口

DWA参考链接: http://gaoyichao.com/Xiaotu/?book=turtlebot&title=dwa_local_planner
DWAPlannerROS类中的本接口实际调用的是dwa_planner.cppDWAPlanner类的findBestPath()接口,它又调用了SimpleScoredSamplingPlanner接口中的findBestTrajectory(),后者会通过SimpleTrajectoryGenerator类创建出轨迹,并调用代价算法来计算轨迹得分。
DWAPlanner类中存储了7种代价计算方法,分别是:

  • OscillationCostFunction oscillation_costs_ // 减少晃动
  • ObstacleCostFunction obstacle_costs_ // 减少机器人装上障碍物
  • MapGridCostFunction goal_front_costs_ // prefers trajectories that make the nose go towards (local) nose goal
  • MapGridCostFunction alignment_costs_ // prefers trajectories that keep the robot nose on nose path
  • MapGridCostFunction path_costs_ // 通过波传播的一种代价算法,更倾向于贴近全局轨迹
  • MapGridCostFunction goal_costs_ // 通过波传播的一种代价算法,更倾向于全局路径和局部地图的交点
  • TwirlingCostFunction twirling_costs_ // 减少原地打转
    通过设定的比例系数,来对各个代价进行加权得出最后的代价数值。

13.5.1. SimpleTrajectoryGenerator轨迹创建

该类中主要的接口有两个:initialisegenerateTrajectory

线速度仿真距离 = 线速度 * 采样时间;  
角速度速度仿真距离 = 角速度速度 * 采样时间;  
线速度方向个数 = 线速度仿真距离 / 线速度仿真间隔;  
角速度方向个数 = 角速度仿真距离 / 角速度仿真间隔;
总数量 = max(线速度方向个数,角速度方向个数);  

13.6. MapGridCostFunction代价计算

有四种代价都是通过本类实现的,这里只关注了两个主要的:贴近全局轨迹和贴近全局轨迹与局部地图的交点。
这个类主要的接口有两个:prepare()scoreTrajectory()

3 2 1 0 1 - - 
3 2 1 0 1 2
2 1 0 1 1 2 -
1 0 1 2 - -
1 0 1 2 - - -

另一个是计算每个网格到全局路径和局部地图交点的单位长度,也是通过同样的扩散算法实现的:

- 2 1 0 1 2 -
- 3 2 1 2 3 -
- 4 3 2 3 4 -
Last:默认是这个,只保留最后一个轨迹点,作为最终的代价;
Sum:代价累加;
Product:代价累乘。

14. ROSCostMap2D详解

15. cartographer_ros详解

16. 常用的指令

16.1. ros相关,rosxxx

16.2. catkin_相关

16.3. 其他命令工具

标签:总结,cartographer,ros,catkin,base,https,AGV,ROS,com
来源: https://blog.csdn.net/hao1183716597/article/details/112988517