前置知识:
costmap_2d::Costmap2DROS costmap;
costmap_2d::Costmap2DROS
是一个ROS包中提供的用于处理2D成本地图的类。它是一个高级的接口,通常用于与ROS导航栈中的导航规划器和本地路径跟踪器等模块进行集成。
costmap
是一个指向 Costmap2DROS
对象的指针。通常,通过这个指针,你可以访问与导航和路径跟踪相关的成本地图信息,以及执行一些与导航相关的操作,如查询障碍物信息、获取机器人的当前全局位置等。这个指针指向了整个ROS导航栈中的成本地图管理器。
costmap_2d::Costmap2D costmap_map_;
costmap_2d::Costmap2D
是一个用于表示二维成本地图的类,通常用于底层的地图管理和处理。
costmap_map_
是一个指向 Costmap2D
对象的指针。这个指针通常用于直接访问成本地图的数据,如地图的大小、分辨率、栅格信息以及每个栅格的成本值等。这个指针通常用于执行与成本地图的低级操作,如路径规划和避障算法。
costmap->getOrientedFootprint(std::cector
构建机器人在当前姿态下的足迹,结果将存储在参数 oriented_footprint
中, 这个函数可以返回机器人当前位置的足迹, 获取的是一个机器人在世界坐标系下的坐标, 通常用于碰撞检测或生成局部代价地图
costmap->getRobotFootprint()
获取机器人的轮廓, 表现为一系列std::vector
costmap->getRobotFootprintPolygon()
获取机器人的轮廓, 表现为一个凸多边形, geometry_msgs::Polygon 类型
参数:
name
tf
costmap_ros 一个ROS的上层接口
发布者:
global_plan_pub : 将global_planner中发过来的路径不经过任何处理发布到”/ftc_local_planner/global_plan”
global_point_pub: 发布当前控制点, 即ftc代码判断的机器人的位置, 由 current_index控制
obstacle_marker_pub: 发布障碍物的信息, 当靠近障碍物时, rviz中的障碍物会由绿色变为黄色, 当障碍物变为红色时, 机器人停止移动
参数:
plan 包含位姿信息的向量, 从起始点指向结束点
逻辑:
global_plan[global_plan.size() - 2].pose.orientation = global_plan[global_plan.size() - 3].pose.orientation;
nav_msgs::Path path;
double FTCPlannerROS::distanceLookahead()
{
if (global_plan.size() < 2)
{
return 0;
}
Eigen::Quaternion<double> current_rot(current_control_point.linear());
Eigen::Affine3d last_straight_point = current_control_point;
for (uint32_t i = current_index + 1; i < global_plan.size(); i++)
{
tf2::fromMsg(global_plan[i].pose, last_straight_point);
// check, if direction is the same. if so, we add the distance
Eigen::Quaternion<double> rot2(last_straight_point.linear());
if (abs(rot2.angularDistance(current_rot)) > config.speed_fast_threshold_angle * (M_PI / 180.0))
{
break;
}
}
return (last_straight_point.translation() - current_control_point.translation()).norm();
}
作用:
根据当前状态确定执行内容
状态: PRE_ROTATE, FOLLOWING, POST_ROTATE, WAITTING_FOR_GOAL_APPROACH, FINISHED
参数:
dt: 当前时间 - 上次执行的时间
逻辑: current_control_point: map坐标系下的点
local_control_point: base_link坐标系下的点
判断当前执行状态
remaining_distance_to_next_pose < distance_to_move
*并且*remaining_angular_distance_to_next_pose < angle_to_move
),则将机器人移动到下一个位置,更新**current_progress
,减少distance_to_move
和angle_to_move
**current_progress
**以确保机器人在下一个时间步内能够到达下一个位置current_control_point
**中,以供后续控制使用创建目标点, viz用于发布current_control_point的坐标
通过tf::doTransform(currnet_control_point, local_control_point, map_to_base)
转化current_control_point的坐标到 local_control_point. 注: current_control_point为基于map的全局坐标, 而local_control_point通过下面 两行, 将map全局坐标系下的点, 转化为从base_link到map的局部变换的点
auto map_to_base = tf_buffer->lookupTransform("base_link", "map", ros::Time(), ros::Duration(1.0));
tf2::doTransform(current_control_point, local_control_point, map_to_base);
计算误差 lat_error(横向误差), lon_error(纵向误差), angle_error(角度误差)
逻辑:
参数:
max_points 向前预判的点的个数, 根据实际global_plan中每一个点之间的距离设置max_points
例如: 机器人当前点为 global_plan[current_index]
, 而max_points则负责检测从global_plan[current_index]
到global_plan[current_index + max_points]
这段路径中间是否有障碍物, 有则为true
逻辑:
costmap->getOrientedFootprint(footprint);
获取当前机器人足迹, 保存到footprintcosts >= costmap_2d::LETHAL_OBSTACLE
参数:
dt 现在时间与上次执行时间之差
cmd_vel 速度置零
逻辑:
参数:
cmd_vel 速度
逻辑:
update_control_point(dt)
auto new_planner_state = update_planner_state()