SYSU-RoboticsLab / FAEL

FAEL: Fast Autonomous Exploration for Large-Scale Environments with a Mobile Robot
163 stars 19 forks source link

FAEL算法部署到机器人上无法实现自主探索,期待您的解答! #5

Open Sisqui opened 1 year ago

Sisqui commented 1 year ago

您好,打扰了!你们的算法真厉害,我们已经可以用它跑通模拟了,现在想在我们实验室的机器人上做测试。理论上应该只需要提供lidar和odometry数据来实现探索路径规划,我们现在也有自己的mapping和odometry,所以我们一开始就只是remap我们的数据和话题到 /jackal/velodyne/gazebo_gt/odometry/jackal/velodyne/velodyne_points,我们也建立了lidar和这个算法里sensor的 静态坐标变换,运行算法的时候也没报错,但是local planner只发布0给/cmd_vel,感觉explorer节点和topo mapper节点没有运行。 请问在部署到机器人上时,除了remap话题和数据之外还有什么注意事项么?期待您的解答,谢谢🙏!!

hjlstudy commented 1 year ago

非常感谢您对FAEL的赞赏,也十分高兴您尝试将它运用于真实的环境中。

看了您的问题描述之后,我发现你们可以注意以下几点:

1、 tf中 “world” 为robot的“base_link”起始所在位置, “map” 为lidar(sensor)起始所在位置。

2、 robot_move.launch 中启动的slam_sim_output节点是将gazebo中的真值"/jackal/velodyne/gazebo_gt/odometry"(数据是相对于gazebo的原点,并不是robot的起始位姿)和激光点云"/jackal/velodyne/velodyne_points"模拟成slam的输出---“/laser_odom_init” ”/registered_point_cloud”(都是相对于lidar的起始位姿)。因此,如果使用真实slam,那么不需要启动这个slam_sim_output节点。 只需使用sensor_odom_to_world节点,它是根据slam得到的odometry(eg:laser_odom_init,相对于lidar的起始位姿)和lidar到base_link的tf,另外再生成了两个odometry(sensor_to_world/odometry和 base_link/odometry), 分别表示了lidar和base_link相对于“world”系的里程计数据,用于topo_planner中UFOmap的地图构建和robot的局部路径规划。

因此你们应该注释slam_sim_output节点,再将slam 输出的odometry remap 成“laser_odom_init”,或者将所有launch文件中与“laser_odom_init”相关的部分remap成slam输出的odometry话题。另外slam需要输出相对于lidar起始位姿的激光点云帧(eg:slam输出/registered_scan),并将其remap为 /registered_point_cloud。

3、 目前代码中的traversability analysis节点只能简单识别较为平坦路面上的障碍物与一些空洞区域,在一些较为复杂的真实场景中很容易分析错误,导致识别出的traversable areas不准,从而影响robot主动探索的进行。地形分析模块对于地面robot的探索来说很重要,这部分的改进目前还在研究中。

该节点中还有几个参数需要注意: “vehicle_height” 是lidar相对于地面的高度 "upper_bound_z" 是lidar的z值(相对于map系),这里为 0 “lower_bound_z” 是用于剔除一些点云的参数,绝对值通常比vehicle_height 的值大0.03即可(需相对于map系,是负值)。 "low_z" 是一个调节地形误分析的参数,由于我们当时用的slam存在较大误差,表示地面的激光点可很厚,这个参数为该厚度的上限。

另外cmu_planner文件夹中几个launch文件中关于“vehicle_height”的值也需更改,含义同上。

4、 在地面robot的探索中,由于视角有限,我们限制了可用于引导探索的frontiers的高度。

topo_planner_1.yaml中, “robot_height” 实际为frontiers的上限, "robot_bottom"为下限,值都是相对于“world”

"sensor_height" 为lidar到 “base_link”的高度。

这些是目前值得注意的几个地方,由于真实场景比较复杂,目前这些代码可能还存在许多问题,到时还请您指出,我们将尽可能提供帮助。

希望一起进步,努力推进robot主动探索领域的研究。

glhwork commented 11 months ago

非常感谢开源这么优秀的算法!我想在自己的平台和场景下实现实际场景的探索(仿真已经顺利跑通),但是我出现了和帖主类似的问题。

不同之处在于,我每次启动程序,底盘都会先探索很短的一段时间(半分钟左右),然后就停下来,不再移动了。echo了一下/cmd_vel,发现一直在发0。不知道您@Sisqui的问题是否已经解决,是否有遇到类似的问题?

我参考了作者提供的参数配置方法,除此之外,我还修改了vehicleLength和vehicleWidth,(位于cmu_planner/local_planner/launch/local_planner.launch)。没有修改过其他参数。 场景是室内办公室,雷达是VLP16;IMU是维特智能,250Hz的输出;SLAM跑的fast_lio。

没有报错,但是一直有一个WARN:tourpoints is empty, planning finish.. 这里想请教一下 @hjlstudy ,什么原因会导致tourpoints empty?(很抱歉代码能力有限,看了一下代码中有关这个warning的部分,但是没有太明白)。

期待您的解答,谢谢!

hjlstudy commented 10 months ago

在代码中对视点的gain设置了几个阈值,如果没有满足要求的视点,那么此时tourpoints就为空,可尝试在参数配置文件中降低这几个参数的值:viewpoint_gain_thre,viewpoint_ignore_thre,tourpoint_ignore_thre,tourpoint_ignore_distance。 此外,在室内场景由于较为狭窄,最好把ufomap地图分辨率调高,增加地图的精度。但是由于VLP16的点云较为稀疏,对地图的观测不充分可能影响探索性能。