Bootstrap

基于fast-lio2来跑下ego-planner(最后基于真实的livox mid 40静态下跑了) 20220913

基于fast-lio2来跑下ego-planner

odom订阅/Odometry话题就可以了

输入图片说明

出现了,激光雷达实时是在动的,随着激光雷达的位置动了!!!!订阅激光SLAM的应该是OK的。

输入图片说明

输入图片说明

但是感觉激光雷达没法用实时的数据可能,因为变的太厉害,特别是livox

ego订阅的点云的坐标系是什么没关系,ego只读取值,最后发出来都是world坐标系发出来。上面自己没有补充任何Tf.

要不要试试订阅这个

输入图片说明

这个压根没有发出来

输入图片说明

这个也没有发出来

输入图片说明

找了下fastlio并没有发出点云地图的话题,实时扫描的点云话题是有,但是比较稀疏又动得太快。

真正发出来有值的似乎就这三个话题

输入图片说明

ego订阅/cloud_registered话题是有值的,按理用真实Livox是OK的吧!!!!可能他们用的这个livox是点云比较稀疏的 /cloud_registered话题确实把livox的原始点云转到了全局坐标系下,也就是结合了位姿变换的,这不就起到了我想要的作用么。ego可能也是出于这方面的考虑,现在的激光SLAM有发出转好的点云了!!!!! R3LIVE 代码解析 - 知乎

输入图片说明

是的,后面需要换种说法,ego订阅的是转到了全局坐标系下的激光雷达扫描点云。

这么看来,激光SLAM后的地图也靠不住了?

地图似乎最后存到pcl文件里面,并不是以话题的形式发出来的。确实如果是发话题,那太大了。

输入图片说明

输入图片说明

看来激光SLAM还是只能订阅实时的激光扫描点云,而且是全局坐标系下的实时扫描点云,激光SLAM来看也不会把地图以话题的形式发出来的。但是是可能发出转到全局坐标系下的实时扫描点云话题,这个可以用起来。

启动命令总共四个

roslaunch fast_lio mapping_avia.launch
rosbag play
roslaunch ego_planner rviz_temp.launch
roslaunch ego_planner run_in_exp_maxi_lidar_test.launch

换为真的livox mid40试试

输入图片说明

激光雷达点云话题不对应,这里订阅的livox自己类型的,但是我写的话题是pointcoloud2类型的

输入图片说明

得换个launch文件启动激光雷达

输入图片说明

用livox_lidar_msg.launch启动后,发出的/livox/lidar话题就是这个类型的了,不是pointcloud2类型的了

输入图片说明

从这看感觉都订阅到了呀

输入图片说明

输入图片说明

感觉可能跟配置文件不对应有关,faslio2里面对应的livox avia ,而我这是livox mid40,不是完全一样的,可能不能直接套。

输入图片说明

找到问题所在了,用自己的Imu比如飞控的Imu的时候,这里需要改为true,看这里知道的 【自制】Livox_mid70外接维特imu运行fast_lio过程展示_哔哩哔哩_bilibili

输入图片说明

如果没有改为true,fast lio跑不起来,而且终端一直显示这个

输入图片说明

我也没有标定,直接这么跑起来看着还OK。

输入图片说明

再让ego订阅faslio发出的odom和全局下的点云,启动ego,OK了,这个时候移动小车,点云不会也说跟着转了!

输入图片说明

输入图片说明

输入图片说明

而且还不卡!

这是此时的节点图

输入图片说明

这样的话是可以基于Livox在NX上跑fastlio+ego-planner了

输入图片说明

这是此时的CPU,确实还好,而且这个时候我还nomachine远程了

输入图片说明

输入图片说明

这是此时的TF树

输入图片说明

看下fastlio2输出的/Odometry,位姿没怎么飘,这个我的激光雷达和IMU的外参还没有怎么标定过。

输入图片说明

移动快了似乎NX出现卡死的现象

总结一下基于livox跑FASTLIO2+ego-planner的操作

roslaunch livox_ros_driver livox_lidar_msg.launch   注意起这个launch文件,才能发出fastlio需要的点云话题类型
roslaunch mavros px4.launch
roslaunch fast_lio mapping_avia.launch    对应config文件需要修改
roslaunch ego_planner rviz.launch 
roslaunch ego_planner run_in_exp_310_with_livox.launch  注意订阅的话题,odom为/Odometry,激光点云话题为/cloud_registered

而且这样之后没有出现其实点就在障碍物内的情况了对吧!!!!!! 在不是用livox自带IMU用比如飞控IMU的时候,配置文件里面time_sync_en这一项需要改为true,否则FASTLIO可能跑不起来。

输入图片说明

输入图片说明

看来不管是基于livox-loam还是FAST-LIO2去跑ego-planner都是可以的,订阅经过激光SLAM输出后的全局坐标系下的点云,这个对ego很关键,是全局坐标系下的点云,不是body坐标系下的点云。

此时的avia.yaml

common:
    lid_topic:  "/livox/lidar"
    imu_topic:  "/mavros/imu/data"
    time_sync_en: true         # ONLY turn on when external time synchronization is really not possible
​
preprocess:
    lidar_type: 1                # 1 for Livox serials LiDAR, 2 for Velodyne LiDAR, 3 for ouster LiDAR, 
    scan_line: 6
    blind: 4
​
mapping:
    acc_cov: 0.1
    gyr_cov: 0.1
    b_acc_cov: 0.0001
    b_gyr_cov: 0.0001
    fov_degree:    90
    det_range:     450.0
    extrinsic_est_en:  false      # true: enable the online estimation of IMU-LiDAR extrinsic
    extrinsic_T: [ 0.04165, 0.02326, -0.0284 ]
    extrinsic_R: [ 1, 0, 0,
                   0, 1, 0,
                   0, 0, 1]
​
publish:
    path_en:  false
    scan_publish_en:  true       # false: close all the point cloud output
    dense_publish_en: true       # false: low down the points number in a global-frame point clouds scan.
    scan_bodyframe_pub_en: true  # true: output the point cloud scans in IMU-body-frame
​
pcd_save:
    pcd_save_en: true
    interval: -1                 # how many LiDAR frames saved in each pcd file; 
                                 # -1 : all frames will be saved in ONE pcd file, may lead to memory crash when having too much frames.

此时的run_in_exp_310_with_livox.launch

<launch>
  <!-- size of map, change the size inflate x, y, z according to your application -->
  <arg name="map_size_x" value="40.0"/>
  <arg name="map_size_y" value="40.0"/>
  <arg name="map_size_z" value=" 3.0"/>
​
  <!-- topic of your odometry such as VIO or LIO -->
  <arg name="odom_topic" value="/Odometry" />
  <!-- <arg name="odom_topic" value="/camera/odom/sample" /> --> 
​
  <!-- main algorithm params -->
  <include file="$(find ego_planner)/launch/advanced_param_droneyee.xml">
​
    <arg name="map_size_x_" value="$(arg map_size_x)"/>
    <arg name="map_size_y_" value="$(arg map_size_y)"/>
    <arg name="map_size_z_" value="$(arg map_size_z)"/>
    <arg name="odometry_topic" value="$(arg odom_topic)"/>
​
    <!-- camera pose: transform of camera frame in the world frame -->
    <!-- depth topic: depth image, 640x480 by default -->
    <!-- don't set cloud_topic if you already set these ones! -->
    <arg name="camera_pose_topic" value="/pcl_render_node/camera_pose"/>
    <arg name="depth_topic" value="/camera/depth/image_rect_raw"/>
​
    <!-- topic of point cloud measurement, such as from LIDAR  -->
    <!-- don't set camera pose and depth, if you already set this one! -->
    <!-- <arg name="cloud_topic" value="/livox/lidar"/> -->
    <arg name="cloud_topic" value="/cloud_registered"/>
​
    <!-- intrinsic params of the depth camera -->
    <arg name="cx" value="321.04638671875"/>
    <arg name="cy" value="243.44969177246094"/>
    <arg name="fx" value="387.229248046875"/>
    <arg name="fy" value="387.229248046875"/>
​
    <!-- maximum velocity and acceleration the drone will reach -->
    <arg name="max_vel" value="0.3" />
    <arg name="max_acc" value="0.5" />
​
    <!--always set to 1.5 times grater than sensing horizen-->
    <arg name="planning_horizon" value="7.5" /> 
​
    <!-- 1: use 2D Nav Goal to select goal  -->
    <!-- 2: use global waypoints below  -->
    <arg name="flight_type" value="1" />
    
    <!-- global waypoints -->
    <!-- It generates a piecewise min-snap traj passing all waypoints -->
    <arg name="point_num" value="5" />
​
    <arg name="point0_x" value="-15.0" />
    <arg name="point0_y" value="0.0" />
    <arg name="point0_z" value="1.0" />
​
    <arg name="point1_x" value="0.0" />
    <arg name="point1_y" value="15.0" />
    <arg name="point1_z" value="1.0" />
​
    <arg name="point2_x" value="15.0" />
    <arg name="point2_y" value="0.0" />
    <arg name="point2_z" value="1.0" />
​
    <arg name="point3_x" value="0.0" />
    <arg name="point3_y" value="-15.0" />
    <arg name="point3_z" value="1.0" />
​
    <arg name="point4_x" value="-15.0" />
    <arg name="point4_y" value="0.0" />
    <arg name="point4_z" value="1.0" />
    
  </include>
​
  <!-- trajectory server -->
  <node pkg="ego_planner" name="traj_server" type="traj_server" output="screen">
    <remap from="/position_cmd" to="planning/pos_cmd"/>
​
    <remap from="/odom_world" to="$(arg odom_topic)"/>
    <param name="traj_server/time_forward" value="1.0" type="double"/>
  </node>
​
  <node pkg="waypoint_generator" name="waypoint_generator" type="waypoint_generator" output="screen">
    <remap from="~odom" to="$(arg odom_topic)"/>        
    <remap from="~goal" to="/move_base_simple/goal"/>
    <remap from="~traj_start_trigger" to="/traj_start_trigger" />
    <param name="waypoint_type" value="manual-lonely-waypoint"/>    
  </node>
​
</launch>

launch文件调用的xml文件内容如下

<launch>
  <arg name="map_size_x_"/>
  <arg name="map_size_y_"/>
  <arg name="map_size_z_"/>

  <arg name="odometry_topic"/>
  <arg name="camera_pose_topic"/>
  <arg name="depth_topic"/>
  <arg name="cloud_topic"/>

  <arg name="cx"/>
  <arg name="cy"/>
  <arg name="fx"/>
  <arg name="fy"/>

  <arg name="max_vel"/>
  <arg name="max_acc"/>
  <arg name="planning_horizon"/>

  <arg name="point_num"/>
  <arg name="point0_x"/>
  <arg name="point0_y"/>
  <arg name="point0_z"/>
  <arg name="point1_x"/>
  <arg name="point1_y"/>
  <arg name="point1_z"/>
  <arg name="point2_x"/>
  <arg name="point2_y"/>
  <arg name="point2_z"/>
  <arg name="point3_x"/>
  <arg name="point3_y"/>
  <arg name="point3_z"/>
  <arg name="point4_x"/>
  <arg name="point4_y"/>
  <arg name="point4_z"/>

  <arg name="flight_type"/>

  <!-- main node -->
  <node pkg="ego_planner" name="ego_planner_node" type="ego_planner_node" output="screen">
    <remap from="/odom_world" to="$(arg odometry_topic)"/>
    <remap from="/grid_map/odom" to="$(arg odometry_topic)"/>
    <remap from="/grid_map/cloud" to="$(arg cloud_topic)"/>
    <remap from = "/grid_map/pose"   to = "$(arg camera_pose_topic)"/> 
    <remap from = "/grid_map/depth" to = "$(arg depth_topic)"/>

    <!-- planning fsm -->
    <param name="fsm/flight_type" value="$(arg flight_type)" type="int"/>
    <param name="fsm/thresh_replan" value="1.5" type="double"/>
    <param name="fsm/thresh_no_replan" value="2.0" type="double"/>
    <param name="fsm/planning_horizon" value="$(arg planning_horizon)" type="double"/> <!--always set to 1.5 times grater than sensing horizen-->
    <param name="fsm/planning_horizen_time" value="3" type="double"/>
    <param name="fsm/emergency_time_" value="1.0" type="double"/>

    <param name="fsm/waypoint_num" value="$(arg point_num)" type="int"/>
    <param name="fsm/waypoint0_x" value="$(arg point0_x)" type="double"/>
    <param name="fsm/waypoint0_y" value="$(arg point0_y)" type="double"/>
    <param name="fsm/waypoint0_z" value="$(arg point0_z)" type="double"/>
    <param name="fsm/waypoint1_x" value="$(arg point1_x)" type="double"/>
    <param name="fsm/waypoint1_y" value="$(arg point1_y)" type="double"/>
    <param name="fsm/waypoint1_z" value="$(arg point1_z)" type="double"/>
    <param name="fsm/waypoint2_x" value="$(arg point2_x)" type="double"/>
    <param name="fsm/waypoint2_y" value="$(arg point2_y)" type="double"/>
    <param name="fsm/waypoint2_z" value="$(arg point2_z)" type="double"/>
    <param name="fsm/waypoint3_x" value="$(arg point3_x)" type="double"/>
    <param name="fsm/waypoint3_y" value="$(arg point3_y)" type="double"/>
    <param name="fsm/waypoint3_z" value="$(arg point3_z)" type="double"/>
    <param name="fsm/waypoint4_x" value="$(arg point4_x)" type="double"/>
    <param name="fsm/waypoint4_y" value="$(arg point4_y)" type="double"/>
    <param name="fsm/waypoint4_z" value="$(arg point4_z)" type="double"/>

    <param name="grid_map/resolution"      value="0.1" /> 
    <param name="grid_map/map_size_x"   value="$(arg map_size_x_)" /> 
    <param name="grid_map/map_size_y"   value="$(arg map_size_y_)" /> 
    <param name="grid_map/map_size_z"   value="$(arg map_size_z_)" /> 
    <param name="grid_map/local_update_range_x"  value="5.5" /> 
    <param name="grid_map/local_update_range_y"  value="5.5" /> 
    <param name="grid_map/local_update_range_z"  value="4.5" /> 
    <param name="grid_map/obstacles_inflation"     value="0.099" /> 
    <param name="grid_map/local_map_margin" value="30"/>
    <param name="grid_map/ground_height"        value="-0.01"/>
    <!-- camera parameter -->
    <param name="grid_map/cx" value="$(arg cx)"/>
    <param name="grid_map/cy" value="$(arg cy)"/>
    <param name="grid_map/fx" value="$(arg fx)"/>
    <param name="grid_map/fy" value="$(arg fy)"/>
    <!-- depth filter -->
    <param name="grid_map/use_depth_filter" value="true"/>
    <param name="grid_map/depth_filter_tolerance" value="0.15"/>
    <param name="grid_map/depth_filter_maxdist"   value="5.0"/>
    <param name="grid_map/depth_filter_mindist"   value="0.2"/>
    <param name="grid_map/depth_filter_margin"    value="1"/>
    <param name="grid_map/k_depth_scaling_factor" value="1000.0"/>
    <param name="grid_map/skip_pixel" value="2"/>
    <!-- local fusion -->
    <param name="grid_map/p_hit"  value="0.65"/>
    <param name="grid_map/p_miss" value="0.35"/>
    <param name="grid_map/p_min"  value="0.12"/>
    <param name="grid_map/p_max"  value="0.90"/>
    <param name="grid_map/p_occ"  value="0.80"/>
    <param name="grid_map/min_ray_length" value="0.1"/>
    <param name="grid_map/max_ray_length" value="4.5"/>

    <param name="grid_map/virtual_ceil_height"   value="2.5"/>
    <param name="grid_map/visualization_truncate_height"   value="2.4"/>
    <param name="grid_map/show_occ_time"  value="false"/>
    <param name="grid_map/pose_type"     value="2"/>  
    <param name="grid_map/frame_id"      value="world"/>

  <!-- planner manager -->
    <param name="manager/max_vel" value="$(arg max_vel)" type="double"/>
    <param name="manager/max_acc" value="$(arg max_acc)" type="double"/>
    <param name="manager/max_jerk" value="4" type="double"/>
    <param name="manager/control_points_distance" value="0.4" type="double"/>
    <param name="manager/feasibility_tolerance" value="0.05" type="double"/>
    <param name="manager/planning_horizon" value="$(arg planning_horizon)" type="double"/>

  <!-- trajectory optimization -->
    <param name="optimization/lambda_smooth" value="1.0" type="double"/>
    <param name="optimization/lambda_collision" value="0.5" type="double"/>
    <param name="optimization/lambda_feasibility" value="0.1" type="double"/>
    <param name="optimization/lambda_fitness" value="1.0" type="double"/>
    <param name="optimization/dist0" value="0.5" type="double"/>
    <param name="optimization/max_vel" value="$(arg max_vel)" type="double"/>
    <param name="optimization/max_acc" value="$(arg max_acc)" type="double"/>

    <param name="bspline/limit_vel" value="$(arg max_vel)" type="double"/>
    <param name="bspline/limit_acc" value="$(arg max_acc)" type="double"/>
    <param name="bspline/limit_ratio" value="1.1" type="double"/>

  </node>

</launch>

输入图片说明

输入图片说明

我录了两个bag包,一个是只录了livox激光雷达话题,有一个是把基于livox跑FASTLIO2+EGO的所有话题都录下来了。

rosbag record -O livoxmid40_mavrosimu /livox/lidar /mavros/imu/data
rosbag record -O livoxmid40_mavrosimu_FASTLIO2_ego_all -a

录的bag包放到百度网盘里面去了

输入图片说明

可以发现在激光扫描离得很近的物体的时候FASTLIO可能容易发散,可能是因为我没有标定激光雷达和IMU的原因吧。后面可以试试把config文件里面的那个IMU外参在线优化打开,看看是否会好些。

20220913 今天单纯跑FASTLIO2,这么近距离对着墙,没有发散。

输入图片说明

单纯跑FAST-LIO2+nomachine远程时候的CPU使用率

输入图片说明

输入图片说明

输入图片说明

输入图片说明

输入图片说明

刚开始前面没有规划出路径应该是位置z变为负的了!!!!

输入图片说明

今天确实挪到这个程度FASTLIO2没有像昨天那样发散。

输入图片说明

输入图片说明

我把这改为true看看

输入图片说明

输入图片说明

改为外参自己估计后,近对着墙,效果也一般,甚至可能还不如。 而且可以看到FASTLIO刚一开始就把Z估计成负的好几厘米,可能是因为外参没有标定好。希望标定好是准确的,不然就连vins都抵不上了。

输入图片说明

总体感受是把那个外参在线估计打开之后,位姿估计误差更大了,还不如不打开。 下面的位姿是我把无人车原地转了90度再转回来,位置偏差有几米,外参在线估计打开后的,没有打开的时候,这个偏差是比较小至少没有这么大的。

输入图片说明

所以我还是改回了false

输入图片说明

高度大于0的时候就规划出轨迹了

输入图片说明

一般没有规划出路径确实就是astar找不出路径了。

这是FAST-LIO2+ego-planner都起起来时候的CPU,nomachine远程还开着

输入图片说明

输入图片说明

FAST-LIO2的输出位姿频率是10hz

输入图片说明

最后给个启动的录屏视频截取

NX上静态跑通基于livox mid40的FASTLIO2+ego-planner 20220912

;