从Mid360到自主移动:基于Fast-LIO与Move_Base的机器人导航实战拆解
1. Mid360激光雷达与Fast-LIO的适配实战第一次拿到Livox Mid360激光雷达时我完全被它360°×59°的超大视场角惊艳到了。这款固态激光雷达不仅体积小巧而且完全不用担心传统机械式雷达的电机磨损问题。但真正开始用它做SLAM时才发现实物开发和仿真完全是两码事。硬件配置的坑我踩了整整三天。首先是网络配置Mid360默认使用192.168.1.180这个固定IP你的主机必须配置成同网段比如192.168.1.50。在Ubuntu 20.04上修改IP的指令是这样的sudo nmcli con mod 有线连接 ipv4.addresses 192.168.1.50/24 sudo nmcli con up 有线连接接着是驱动安装这里强烈建议直接用我修改过的livox_ros_driver2版本。原版驱动有两个坑一是编译时要求gcc版本必须完全匹配二是发布的点云消息中ring字段为空会导致Fast-LIO报错。我的解决方案是在msg_MID360.launch中强制指定点云类型param namepublish_format typeint value1/ !-- 0:Pointcloud2 1:CustomMsg --Fast-LIO的适配更是个技术活。最新版的FAST_LIO2默认不支持livox_ros_driver2需要手动修改三处CMakeLists.txt中所有livox_ros_driver都要改成livox_ros_driver2laserMapping.cpp里include路径要同步修改在mapping_mid360.launch中增加参数param namelidar_type value1/ !-- 1Livox -- param namemax_pt_num value50000/ !-- Mid360点云密度太高需要限制 --实测建图效果令人惊喜。在20㎡的房间里仅需缓慢走一圈就能完成建图墙角处的点云重合度误差小于2cm。不过要注意Mid360的安装高度建议在0.5-1.2米之间太高会导致地面点云稀疏。2. 三维点云到二维栅格地图的魔法转换当看到Fast-LIO生成的精美三维点云时我一度很纠结要不要直接用3D导航。但考虑到Move_Base等成熟框架都是基于二维栅格地图的最终还是决定做降维处理。这里分享三种我验证过的转换方案方案一pcd2pgm离线转换roslaunch pcd2pgm run.launch pcd_path:/path/to/your.pcd resolution:0.05 floor_height:-0.5 ceiling_height:1.0这个方法的优势是转换速度快但需要手动调整floor_height参数来过滤地面。我发现在瓷砖地面上效果最好当地毯较厚时容易误过滤有效障碍物。方案二octomap_server实时转换node pkgoctomap_server typeoctomap_server_node nameoctomap_server param nameresolution value0.05/ param nameframe_id valuemap/ param nameheight_map valuefalse/ !-- 关键参数 -- remap fromcloud_in to/laser_cloud_surround/ /node这种方法能实时更新地图但对CPU消耗较大。我的i7-11800H笔记本上CPU占用率会飙升到70%。建议在launch文件中添加param namelatch valuefalse/ param namemax_sensor_range value10.0/方案三最终采用方案混合式处理我在sentry_build.launch中实现了一个智能方案先用Fast-LIO构建完整三维地图运行时用octomap_server做实时更新通过条件编译控制是否保存中间结果关键技巧是在保存地图时执行rosrun map_server map_saver -f mymap map:/projected_map这能确保地图坐标系与点云完全对齐。遇到过yaw角变成NaN的诡异问题后来发现是tf树没配置好解决方法是在yaml文件中手动添加origin的yaw值。3. 重定位与坐标系的玄学问题重定位是导航系统中最容易翻车的环节。我测试过三种方案AMCL方案传统但稳定适合结构化环境roslaunch amcl amcl.launch odom_frame_id:camera_init base_frame_id:body_2d需要特别注意frame_id的对应关系否则会出现机器人鬼畜漂移。ICP方案用Fast-LIO自带的定位模块# 在global_localization.py中修改 FOV 6.28 # Mid360的全向视野 max_correspondence_distance 0.5 # 关键参数混合定位方案最终采用启动时用ICP粗定位运行时用AMCL精修通过EKF融合里程计数据坐标系对齐是个大坑。我的机器人上Mid360是倒装的底部朝上导致直接转换的坐标系全是错的。解决方案是在tf转换节点中添加旋转变换tf2::Quaternion q_rot; q_rot.setRPY(M_PI, 0, 0); // X轴旋转180度 transform.setRotation(q_rot);建议所有人在调试时都打开RViz的TF显示确保map → odom → base_link的层级关系正确各坐标系Z轴朝向一致没有多余的坐标系干扰4. Move_Base调参实战指南Move_Base的默认参数对Mid360来说简直是灾难。经过两周调参我总结出这些黄金参数costmap_common_params.yamlobstacle_range: 3.0 # 比雷达最大距离小些 raytrace_range: 3.5 transform_tolerance: 0.5 # Mid360有时会丢数据local_costmap_params.yamlupdate_frequency: 5.0 # 太高会卡顿 publish_frequency: 2.0 width: 6.0 # 比机器人速度×反应时间大 height: 6.0dwa_local_planner_params.yamlmax_vel_x: 0.8 acc_lim_theta: 1.0 # 固态雷达不怕旋转 sim_time: 2.0 # 比机械雷达可以设长些实测建议先用rosbag记录测试数据用rqt_reconfigure动态调整参数特别注意yaw_target_tolerance参数建议设为0.3遇到最诡异的问题是机器人总是绕远路后来发现是inflation_radius设太大默认0.55调到0.3后问题解决。5. 串口通信与决策层设计当看到Move_Base终于输出正常的cmd_vel时我以为大功告成了结果发现根本控制不了真实机器人串口通信这里又踩了一堆坑权限问题sudo usermod -aG dialout $USER这条命令必须执行否则会出现权限拒绝错误。数据协议设计 我的下位机是STM32采用的通信协议如下帧头(0xAA) | 数据长度 | 线速度(4字节float) | 角速度(4字节float) | 校验和关键代码片段void cmdVelCallback(const geometry_msgs::Twist::ConstPtr msg) { uint8_t buffer[12]; float vx msg-linear.x; float wz msg-angular.z; memcpy(buffer, vx, 4); memcpy(buffer4, wz, 4); // 添加校验和等... serial.write(buffer, 12); }决策层设计 我实现了一个简单的状态机空闲状态等待目标点导航状态发送cmd_vel异常状态检测到障碍物超时建议在初期先不要做复杂决策重点确保基础导航流程能跑通。我的第一个版本就是因为加了太多异常处理逻辑导致基础功能都没法验证。6. 实机测试中的血泪教训第一次实地测试时机器人直接撞上了玻璃门——因为Mid360几乎完全看不见透明物体解决方案是在costmap中添加虚拟障碍层layer namevirtual_walls typecostmap_2d::StaticLayer param namemap_topic value/virtual_objects/ /layer另一个坑是地面反光问题。当阳光直射瓷砖地面时点云会突然增多导致误判。我的解决方案是在livox_ros_driver2中启用抗干扰模式在costmap中设置min_obstacle_height0.1最惊险的一次是机器人突然失控旋转后来发现是USB线接触不良导致雷达数据中断。现在我都改用带锁紧机构的USB线并在代码中添加了心跳检测def check_lidar_alive(): try: msg rospy.wait_for_message(/livox/lidar, CustomMsg, timeout1.0) return True except: return False建议所有人在实机测试时先用手持模式测试建图给机器人加装急停开关在空旷场地做首次自动导航测试这套系统现在能稳定运行8小时不崩溃定位误差小于5cm。虽然还有些小毛病但作为开源方案已经能满足大多数室内导航需求了。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2622129.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!