在Gazebo中为Husky机器人集成Livox激光雷达仿真
1. 为什么要在仿真中集成Livox激光雷达如果你正在用Husky这类移动机器人做研究或者开发尤其是涉及到自动驾驶、SLAM同步定位与地图构建或者环境感知那你肯定离不开激光雷达。Livox作为近几年异军突起的固态激光雷达品牌以其独特的非重复扫描模式和极具竞争力的价格在科研和工业界都攒了不少人气。但问题来了真机实验成本高、风险大还受场地天气限制总不能天天抱着几十万的设备在户外“冒险”吧这时候仿真的优势就体现出来了。在Gazebo这样的高保真物理仿真环境中我们可以安全、快速、低成本地测试算法。想象一下你可以在电脑里搭建一个复杂的城市街道或者室内仓库让搭载了Livox雷达的Husky小车在里面任意驰骋测试你的导航、避障算法而不用担心撞坏设备或者伤到人。这简直就是算法工程师的“安全屋”和“加速器”。我自己在项目里就深有体会。早期没有做仿真每次算法迭代都要去实地跑车调试效率极低一个参数调不好可能就得折腾一整天。后来下定决心把仿真环境搭起来才发现“真香”。今天我就把自己在Gazebo里为Husky机器人集成Livox激光雷达仿真的完整过程以及踩过的坑、总结的经验毫无保留地分享给你。整个过程其实不难核心思路就是“拼积木”把Livox的仿真插件“安装”到Husky的URDF模型上。下面我们就从零开始一步步把它实现。2. 搭建你的仿真环境从系统到软件包工欲善其事必先利其器。在开始“拼积木”之前我们需要一个干净、兼容的软件环境。我使用的环境是Ubuntu 20.04和ROS Noetic这也是目前ROS 1最后一个LTS版本生态稳定资料丰富。如果你的系统版本不同部分步骤可能需要微调。2.1 安装Livox的核心SDKLivox官方提供了完整的软件开发工具包SDK这是我们后续所有工作的基础。它包含了与雷达硬件通信的底层库。虽然我们做仿真不直接连接真机但仿真插件和ROS驱动都依赖这个SDK。安装过程非常标准打开终端依次执行以下命令# 1. 克隆SDK仓库到本地 git clone https://github.com/Livox-SDK/Livox-SDK.git cd Livox-SDK # 2. 使用CMake编译并安装 mkdir build cd build cmake .. make sudo make install这几行命令的作用是从GitHub上拉取最新的SDK源代码然后使用CMake构建系统生成Makefile接着make命令进行编译最后sudo make install将编译好的库文件安装到系统目录通常是/usr/local/lib和/usr/local/include。整个过程一般很顺利只要你的系统安装了基本的编译工具如gcc, g, cmake就不会出错。2.2 获取Livox的ROS驱动程序有了底层SDK我们还需要ROS层面的驱动包它负责将SDK的功能封装成ROS标准的Topic如/livox/lidar和Service方便我们在ROS生态中使用。这个驱动包同样来自Livox官方。# 创建一个专门的工作空间如果已有可跳过 mkdir -p ~/livox_ws/src cd ~/livox_ws/src # 克隆ROS驱动包 git clone https://github.com/Livox-SDK/livox_ros_driver.git # 返回工作空间根目录并编译 cd ~/livox_ws catkin_make编译成功后别忘了使用source devel/setup.bash来激活这个工作空间的环境。这样ROS才能找到我们新编译的livox_ros_driver功能包。这个驱动包主要针对真机但它的消息定义等也会被仿真包用到。2.3 安装至关重要的Livox激光雷达仿真包这是本次集成的核心Livox官方提供了一个名为livox_laser_simulation的Gazebo插件包。它实现了一个Gazebo的传感器插件能够模拟Livox雷达独特的扫描模式比如Mid-70的“花瓣式”扫描并发布出符合Livox数据格式的点云。这里有一个关键坑点需要注意这个仿真包最初是针对Ubuntu 18.04和ROS Melodic开发的。在Ubuntu 20.04上直接编译会报错提示‘any’ is not a member of ‘std’。这是因为C标准库的版本问题。解决方法很简单我们只需要修改一下它的编译标准。找到你克隆下来的livox_laser_simulation包中的CMakeLists.txt文件用文本编辑器打开找到下面这行add_compile_options(-stdc11)将其中的c11修改为c17add_compile_options(-stdc17)保存后再按照常规ROS包的方式进行编译即可# 假设你把仿真包也放在livox_ws/src下 cd ~/livox_ws/src git clone https://github.com/Livox-SDK/livox_laser_simulation.git # 修改CMakeLists.txt后 cd ~/livox_ws catkin_make这个修改是为了让代码兼容更新版本的GCC编译器。搞定这一步最棘手的部分就过去了。2.4 安装Husky移动机器人的仿真模型Husky是Clearpath Robotics公司的一款经典户外移动机器人平台ROS社区对其支持非常好有官方维护的仿真包。我们直接通过apt安装即可这是最省事的方式。sudo apt-get install ros-noetic-husky-simulator ros-noetic-husky-description这条命令会安装Husky在Gazebo中仿真所需的所有模型、控制器和启动文件。安装完成后你可以尝试运行roslaunch husky_gazebo husky_playpen.launch来启动一个带有Husky的默认Gazebo世界检查是否安装成功。3. 核心操作将Livox“安装”到Husky身上环境准备好了现在进入最激动人心的部分——修改Husky的URDF模型文件把Livox雷达“焊”上去。URDFUnified Robot Description Format是ROS中描述机器人模型的标准格式它定义了机器人的连杆link和关节joint以及它们在Gazebo中的外观、物理属性和传感器插件。我们的目标文件是/opt/ros/noetic/share/husky_description/urdf/husky.urdf.xacro。注意这是一个.xacro文件它是URDF的宏扩展版本支持变量、条件判断等更灵活。我们直接修改它。3.1 第一步为Livox创建一个实体连杆Link首先我们需要在机器人模型中定义Livox雷达这个“零件”。在Husky的URDF文件中找到所有link标签定义结束的地方通常是在定义完机器人基体、轮子、各种支架之后添加以下代码link namelaser_livox collision origin xyz0 0 0 rpy0 0 0/ geometry box size0.1 0.1 0.1/ /geometry /collision visual origin xyz0 0 0 rpy0 0 0/ geometry box size0.1 0.1 0.1/ /geometry /visual /link这段代码创建了一个名为laser_livox的连杆。collision标签定义了它的碰撞体积Gazebo会用这个来计算物理交互visual标签定义了它在Gazebo可视化界面中显示的样子。这里我简单地将它定义为一个边长0.1米的正方体。你完全可以根据Livox Mid-70的实际尺寸把它改成更精确的模型甚至导入一个STL网格文件mesh filenamepackage://.../livox_mid70.dae/但对于仿真功能来说一个简单的几何体完全够用性能也更好。3.2 第二步将雷达固定到机器人基座Joint光有零件还不行得把它装到小车上。我们需要创建一个固定关节fixed joint把laser_livox这个link连接到Husky的base_link机器人基座连杆上。joint namelaser_livox_joint typefixed origin xyz0 0 0.5 rpy0 0 0 / parent linkbase_link / child linklaser_livox/ /jointname关节的名字随便取有意义就行。typefixed表示这是一个固定关节雷达和基座之间没有相对运动。origin这是关键xyz0 0 0.5定义了雷达相对于父连杆base_link的安装位置。这里0.5表示安装在基座正上方0.5米处。你可以根据你的实际安装高度和前后左右偏移来调整这三个值。rpy是旋转角度roll, pitch, yaw这里都是0表示朝向与基座一致。parent和child指明了关节连接的两个连杆父连杆是base_link子连杆是我们刚创建的laser_livox。3.3 第三步注入灵魂——添加Gazebo传感器插件现在我们有了一个叫laser_livox的木头盒子固定在车上但它还不会发射激光。接下来就要为这个盒子赋予“雷达”的灵魂这需要通过Gazebo插件来实现。我们需要从之前安装的livox_laser_simulation包中找到它的传感器插件配置。找到livox_laser_simulation包中的模型文件例如livox_mid70.xacro将其中的gazebo插件部分复制出来并粘贴到Husky的URDF文件中放在我们刚定义的joint标签之后。核心结构如下!-- 定义雷达的视场角参数方便后面引用 -- xacro:property namehorizontal_fov value70.4/ xacro:property namevertical_fov value70.4/ gazebo referencelaser_livox sensor typeray namelaser_livox pose0 0 0 0 0 0/pose visualizetrue/visualize update_rate10/update_rate plugin namegazebo_ros_laser_controller filenameliblivox_laser_simulation.so ray scan horizontal samples100/samples resolution1/resolution min_angle${-horizontal_fov/360*M_PI}/min_angle max_angle${horizontal_fov/360*M_PI}/max_angle /horizontal vertical samples50/samples resolution1/resolution min_angle${-vertical_fov/360*M_PI}/min_angle max_angle${vertical_fov/360*M_PI}/max_angle /vertical /scan range min0.1/min max200/max resolution0.002/resolution /range noise typegaussian/type mean0.0/mean stddev0.01/stddev /noise /ray visualizetrue/visualize samples10000/samples downsample1/downsample csv_file_namepackage://livox_laser_simulation/scan_mode/mid70.csv/csv_file_name ros_topic/scan/ros_topic /plugin /sensor /gazebo这段代码是仿真的核心我们来拆解一下关键参数gazebo referencelaser_livox这行至关重要它告诉Gazebo接下来的插件配置是应用于我们之前创建的那个名为laser_livox的连杆。sensor typeray声明这是一个射线激光传感器。update_rate10/update_rate传感器更新频率10Hz。plugin filenameliblivox_laser_simulation.so指定加载我们编译好的Livox专用仿真插件。horizontal和vertical定义了激光雷达的水平与垂直扫描属性。samples是采样点数min_angle和max_angle定义了视场角FOV。这里的计算${-horizontal_fov/360*M_PI}是将角度70.4度转换为弧度。range定义了雷达的测距范围最小0.1米最大200米分辨率0.002米。noise添加高斯噪声使仿真数据更接近真实传感器stddev是标准差。csv_file_name这是Livox仿真的特色它指向一个CSV文件这个文件定义了Livox雷达非重复扫描的精确点云模式。不同的Livox型号如Mid-40, Mid-70, Avia有不同的扫描模式文件。ros_topic/scan/ros_topic插件发布点云数据所使用的ROS话题名称。你可以根据需要修改比如改成/livox/points以符合你的算法接口。4. 启动与调试让你的仿真机器人“看见”世界完成URDF文件的修改并保存后就可以启动仿真进行测试了。建议你为修改后的Husky描述文件单独创建一个启动文件launch file这样不会影响原始的Husky包。创建一个新的launch文件例如husky_livox.launch内容如下launch !-- 启动Gazebo仿真世界例如一个空的世界 -- include file$(find gazebo_ros)/launch/empty_world.launch arg nameworld_name value$(find husky_gazebo)/worlds/playpen.world/ arg namepaused valuefalse/ arg nameuse_sim_time valuetrue/ arg namegui valuetrue/ arg nameheadless valuefalse/ arg namedebug valuefalse/ /include !-- 加载我们修改后的Husky机器人模型 -- param namerobot_description command$(find xacro)/xacro $(find husky_description)/urdf/husky.urdf.xacro / !-- 将机器人模型放入Gazebo -- node namespawn_husky_model pkggazebo_ros typespawn_model args-urdf -param robot_description -model husky -x 0 -y 0 -z 0.5 / !-- 启动机器人状态发布和关节控制 -- node pkgrobot_state_publisher typerobot_state_publisher namerobot_state_publisher / node pkgjoint_state_publisher typejoint_state_publisher namejoint_state_publisher / !-- 启动Husky的基础控制节点 -- include file$(find husky_control)/launch/control.launch / include file$(find husky_control)/launch/teleop.launch / /launch在终端中运行这个launch文件roslaunch your_package_name husky_livox.launch如果一切顺利Gazebo界面会打开里面出现一个带有小方盒我们的Livox的Husky机器人。4.1 验证雷达数据接下来我们需要检查Livox雷达是否真的在工作。打开一个新的终端。查看话题列表运行rostopic list你应该能在列表中看到我们在插件中定义的话题/scan或者你自定义的话题名。监听点云数据运行rostopic echo /scan -n 1这会打印出该话题最新的一条消息。如果能看到包含header、angle_min、ranges距离数组等字段的数据说明雷达插件正在发布数据。可视化点云更直观的方式是用Rviz。在终端运行rviz在Rviz中将Fixed Frame设置为base_link或laser_livox。点击左下角Add添加一个LaserScan显示类型。在LaserScan的Topic选项中选择/scan。如果配置正确你应该能在Rviz中看到由激光点构成的扇形或特定图案取决于Livox的扫描模式。4.2 常见问题与排查如果启动失败或者看不到数据别慌按以下步骤排查Gazebo启动黑屏或报错首先检查模型是否成功生成。在Gazebo的Insert标签页看看能否找到你的机器人模型。如果找不到很可能是URDF文件有语法错误。使用check_urdf命令检查check_urdf /path/to/your.urdf。更常见的是在Gazebo终端输出中查找红色错误信息通常能精确定位到XML解析错误。插件加载失败Gazebo输出中提示Failed to load plugin liblivox_laser_simulation.so。这通常是编译问题。请确保你正确修改了CMakeLists.txt中的C标准为c17。使用catkin_make编译livox_laser_simulation包时没有报错。编译后使用source ~/livox_ws/devel/setup.bash确保Gazebo能找到这个插件。你可以通过echo $GAZEBO_PLUGIN_PATH查看插件路径是否包含了你的工作空间的devel/lib目录。Rviz中看不到点云首先检查rostopic hz /scan看是否有数据以设定的频率如10Hz发布。如果没有回到Gazebo选中你的机器人模型在右侧的Model选项卡中展开传感器列表查看laser_livox传感器是否被正确列出并且其Visualize选项是否勾选这会在Gazebo中显示激光射线有助于调试。5. 参数调优与高级配置让仿真更逼真成功运行只是第一步要让仿真数据对你的算法研发真正有用我们还需要根据实际需求调整仿真参数让它更贴近真实传感器。5.1 关键参数详解与调整回到我们添加的那段Gazebo插件配置里面有几个参数对仿真结果影响巨大视场角FOV与采样点horizontal_fov和vertical_fov这定义了雷达的“视野”范围。Livox Mid-70的水平FOV是70.4度垂直FOV也是70.4度形成一个锥形视场。如果你用的是Mid-40圆形视场或Horizon更大的水平FOV需要在这里修改。samples这个值决定了在每个维度上发射多少条激光射线。采样点越多点云越密集仿真计算量也越大。原文中水平100垂直50总共5000个点对于Mid-70的仿真模式可能偏低。你可以参考mid70.csv文件中的点数来设置或者逐步增加直到点云密度满足你的算法要求同时兼顾性能。扫描模式文件csv_file_name这个路径指向的CSV文件是Livox仿真的精髓。它不是一个简单的参数文件而是一个包含了数万个点的坐标列表精确描述了Livox雷达在单位时间内激光束击中的位置序列模拟了其非重复扫描的特性。livox_laser_simulation包提供了几种型号的扫描文件。确保你使用的文件与你想仿真的雷达型号匹配。噪声模型noise真实雷达数据是有噪声的。gaussian高斯噪声是常用的模型。stddev标准差决定了噪声的强度。值越大数据越“毛糙”。你可以根据雷达手册上的测距精度来设置这个值比如设置为0.01意味着在1米距离上噪声标准差是1厘米。更新频率与性能update_rate传感器仿真更新频率。提高频率会让数据流更平滑但也会增加CPU负担。10Hz是一个常用值对于低速移动的机器人够用。如果你的算法对实时性要求高可以尝试提高到20Hz或30Hz但要监控Gazebo的实时因子Real Time Factor确保仿真能跑在实时速度。5.2 为不同Livox型号进行适配Livox产品线有多款雷达它们的扫描模式、FOV、点云特性都不同。在livox_laser_simulation包的scan_mode目录下通常有mid40.csvmid70.csvavia.csv等文件。要切换型号你需要做两件事修改csv_file_name的路径指向对应的CSV文件。根据该型号的数据手册调整horizontal_fov、vertical_fov、samples等参数。例如Livox Avia的FOV可能不同并且其扫描模式是固态扫描参数设置需要调整。5.3 集成到你的SLAM或导航算法中仿真数据的最终目的是喂给算法。现在你的Husky机器人已经可以通过/scan话题或你自定义的话题发布Livox格式的点云了。接下来对于SLAM你可以直接使用支持Livox点云输入的SLAM算法如LIO-SAM、FAST-LIO等。在启动这些算法的launch文件时将其输入话题通常是/points或/livox/points重映射remap到你的/scan话题即可。对于导航ROS 1中的导航栈Navigation Stack默认使用sensor_msgs/LaserScan消息类型的2D激光数据。Livox仿真的默认输出也是这种类型取决于插件配置所以可以直接被move_base的成本地图使用。如果你需要3D点云用于更复杂的3D导航或避障可能需要配置插件发布sensor_msgs/PointCloud2消息并调整导航算法的相关参数。整个过程就像搭积木现在你已经拥有了一个带“眼睛”的仿真Husky。我建议你在修改任何参数后都系统地测试一下在简单的环境中比如一个空房间加几个方盒子让机器人静止或缓慢移动观察Rviz中的点云是否稳定、是否符合预期。然后尝试运行你的感知或定位算法看看效果如何。仿真调试的乐趣就在于你可以快速迭代大胆尝试各种参数和场景而成本几乎为零。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2412775.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!