ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ROS2 Humble激光雷达仿真工程:多线雷达+Gazebo模块化架构

ROS2 Humble激光雷达仿真工程:多线雷达+Gazebo模块化架构 简介本资源是一个面向ROS2初学者与机器人仿真开发者的实践型工程包聚焦多线激光雷达在Gazebo中的建模与仿真应用解决SLAM、定位与环境感知等任务的前期验证难题。压缩包共30个文件62KB涵盖12个xacro宏定义文件用于模块化构建fishbot机器人URDF模型、4个Python节点脚本实现传感器数据发布与基础控制、2个YAML配置文件管理参数与插件加载、1个world场景文件及1个SDF模型文件并包含launch启动脚本、RVIZ可视化配置、README说明与LICENSE协议等完整工程要素。已有46人学习下载配套的说明文件.txt与附赠资源.docx详细列出了Ubuntu22.04ROS2 Humble环境下的编译、启动与调试全流程特别对xacro到URDF转换逻辑、Gazebo插件绑定机制及多线激光雷达参数映射做了关键注解显著降低仿真环境搭建门槛。1. 这不是“跑通一个Demo”而是一套可复用的激光雷达仿真工程骨架你搜“ROS2 Humble Gazebo 激光雷达”刷出来的大多是零散命令、报错截图、半截配置文件——要么卡在gazebo_ros_pkgs编译失败要么/scan话题永远空再或者fishbot_description一加载就报robot tag not found。我去年带三个实习生做SLAM算法验证时光是搭出一个能稳定输出16线点云、支持TF树完整、能和Nav2联动的仿真环境前后踩了27个坑重装系统4次最后发现核心问题根本不在代码而在工程结构设计的底层逻辑缺陷把URDF、SDF、Gazebo插件、ROS2 Launch、参数文件全揉在一个包里改一个参数要重启整个仿真调试效率低得像用算盘跑神经网络。这个标题里的“Gazebo多线激光雷达仿真示例工程”表面看是个教学Demo实际是一套经过生产环境验证的模块化仿真架构。它用fishbot_description作为机器人描述基座但真正价值在于其分层设计description包只管几何与物理属性gazebo包专注传感器仿真与插件集成launch包解耦启动逻辑config包集中管理所有可调参数。这种结构让后续接入SLAM、导航、甚至多机协同都变成“替换配置文件修改Launch参数”的操作而不是重写整个仿真流程。关键词里反复出现的ROS2Humble和Ubuntu22_04不是随便写的版本号。Humble是ROS2首个LTS长期支持版本其gazebo_ros_pkgs对Gazebo Classic11.x的适配已趋稳定但和Gazebo FortressROS2 Iron之后默认存在ABI不兼容Ubuntu22.04的libignition库版本与Gazebo 11.3.0深度绑定换到24.04会直接触发ignition-msgs链接错误——这解释了为什么网上那些“Ubuntu24.04 Gazebo Nav2”的教程90%在ros2 launch gazebo_ros gazebo.launch.py这一步就挂掉。而本工程从根目录的CMakeLists.txt到每个Launch文件的find_package()调用全部锁定ignition-msgs6、ignition-transport8等具体小版本杜绝了“版本漂移”导致的隐性崩溃。至于多线激光雷达标题没写具体型号但结合fishbot的常见硬件选型和热词中的velodyne16线实际采用的是gazebo_ros_ray_sensor插件模拟的16线垂直扫描模式。它不像2D单线雷达那样只生成平面点云而是通过vertical ray嵌套配置在Z轴方向生成16个离散扫描层每层独立控制角度分辨率、最小/最大距离、噪声模型。这种配置直接对应真实Velodyne VLP-16的物理特性让后续的点云滤波、地面分割、障碍物聚类算法能在仿真中获得接近实车的数据分布特征——这才是“仿真有效”的核心而不是仅仅让RViz里飘出一堆点。适合谁参考如果你正面临这些场景需要快速验证自研SLAM算法在不同激光雷达配置下的鲁棒性为新采购的16线雷达做驱动适配前的功能预演或是给高校课程设计一套可扩展的移动机器人实验平台——那么这个工程不是“抄作业”的模板而是你构建自己仿真体系的第一块标准砖。它不教你ROS2基础语法但会告诉你为什么robot_state_publisher必须用--use-sim-time参数启动为什么gazebo_ros的spawn_entity.py脚本里-topic参数必须指向/robot_description而非/description以及当/tf树里突然多出base_link到lidar_link的变换时该去哪个Xacro文件里检查origin偏移量。2. 工程结构拆解为什么要把一个机器人拆成5个包2.1 核心分层逻辑从物理世界到ROS2话题的映射链这个工程最反直觉的设计是把一个看似简单的“鱼博特激光雷达”拆成了fishbot_description、fishbot_gazebo、fishbot_bringup、fishbot_control、fishbot_slam五个独立ROS2包。新手常问“不就一个机器人吗放一个包里不行”——行但代价是每次改激光雷达安装高度你得同时改URDF、改Gazebo插件配置、改Launch文件里的TF发布参数最后还要手动重启所有节点。而分层后修改仅发生在单一包内fishbot_description纯静态描述。只包含urdf/和meshes/目录定义机器人本体几何、关节、惯性参数以及lidar_link在base_link坐标系下的固定偏移origin xyz0 0 0.2 rpy0 0 0/。这里绝不出现任何ROS2相关标签比如gazebo或ros2_control确保描述文件可被MoveIt2、Webots、甚至SolidWorks直接读取。fishbot_gazebo仿真专属层。包含models/Gazebo原生SDF模型、plugins/自定义传感器插件、worlds/仿真场景。关键在models/fishbot/model.sdf里通过include引用fishbot_description生成的URDF并注入gazebo_ros_ray_sensor插件。这里定义激光雷达的物理参数水平视场角180°、垂直视场角30°16线均匀分布、角分辨率0.2°、最大测距100m、高斯噪声标准差0.01m——这些数值直接来自VLP-16数据手册不是随意填写的。fishbot_bringup启动中枢。launch/目录下有gazebo.launch.py和simulation.launch.py两个主入口。前者只启动Gazebo服务器和spawn_entity后者则串联robot_state_publisher、joint_state_publisher_gui、gazebo_ros插件节点。这种分离让调试更精准若Gazebo崩溃先单独运行gazebo.launch.py确认模型加载无误若TF树缺失再检查simulation.launch.py中robot_state_publisher的use_sim_time参数是否设为True。fishbot_control运动控制层。包含config/下的diff_drive_controller.yaml定义差速轮PID参数、轮间距、最大线速度。这里有个易忽略的细节publish_rate: 50.0必须与Gazebo仿真步长physics typeode max_step_size0.001/max_step_size匹配——0.001秒步长对应1000Hz仿真频率但控制器只需50Hz发布速度指令避免CPU过载。若设为100HzGazebo会因频繁状态更新而卡顿。fishbot_slam算法验证层。提供slam_toolbox的预配置mapper_params_online_sync.yaml其中map_frame: map、odom_frame: odom、base_frame: base_link三者构成标准TF链。特别注意scan_topic: /scan参数它强制SLAM节点订阅gazebo_ros_ray_sensor插件发布的原始点云话题而非经过laser_filters处理后的数据——这是为了验证算法对原始噪声的鲁棒性。2.2fishbot_description包的URDF精要解析fishbot_description/urdf/fishbot.urdf.xacro是整个工程的基石。它采用Xacro宏语言而非纯URDF原因在于可复用性xacro:include filename$(find-pkg-share fishbot_description)/urdf/common_properties.xacro/引入的common_properties.xacro定义了所有轮子、底盘、传感器的通用材质material nameBlack、摩擦系数mu11.0/mu1、阻尼damping0.1/damping。当需要更换为四轮麦轮底盘时只需修改fishbot.urdf.xacro中xacro:macro namechassis部分无需重写整个URDF。激光雷达的安装定义在xacro:macro namelidar中link namelidar_link visual geometry cylinder radius0.05 length0.1/ /geometry material nameRed/ /visual collision geometry cylinder radius0.05 length0.1/ /geometry /collision inertial mass value0.5/ inertia ixx0.001 iyy0.001 izz0.001/ /inertial /link joint namelidar_joint typefixed parent linkbase_link/ child linklidar_link/ origin xyz0 0 0.2 rpy0 0 0/ /joint这里xyz0 0 0.2表示激光雷达中心距底盘上表面20cm符合FishBot实物安装高度。rpy0 0 0确保Z轴与机器人前进方向一致避免点云坐标系旋转导致SLAM建图扭曲。inertial块虽小却影响Gazebo物理仿真精度若质量设为0激光雷达在碰撞时会穿透障碍物若惯性张量过大机器人急停时雷达会因惯性继续“飞出去”。fishbot_description还包含meshes/目录存放STL格式的3D模型。但工程中实际使用的是geometrycylinder//geometry这类简单几何体——因为Gazebo对复杂STL的碰撞检测计算开销极大尤其在多机器人仿真时。只有当需要精确模拟传感器外壳遮挡效果时才启用meshes/lidar.stl并设置collisionmeshurimodel://fishbot/meshes/lidar.stl/uri/mesh/collision。2.3fishbot_gazebo包的SDF与插件深度配置fishbot_gazebo/models/fishbot/model.sdf是连接URDF与Gazebo的桥梁。其核心是include块include urimodel://fishbot_description/uri pose0 0 0 0 0 0/pose /include这里model://是Gazebo的资源协议指向GAZEBO_MODEL_PATH环境变量指定的路径。工程在setup.bash中预置了export GAZEBO_MODEL_PATH$GAZEBO_MODEL_PATH:/opt/ros/humble/share/gazebo_plugins/models:$COLCON_PREFIX_PATH/share确保Gazebo能同时找到官方模型库和本工程的fishbot_description。激光雷达插件配置在plugin标签内plugin filenamelibgazebo_ros_ray_sensor.so namegazebo_ros_lidar robot_namespace/fishbot/robot_namespace frame_namelidar_link/frame_name min_range0.1/min_range max_range100.0/max_range range_noise_mean0.0/range_noise_mean range_noise_stddev0.01/range_noise_stddev horizontal samples900/samples resolution1/resolution min_angle-1.5708/min_angle max_angle1.5708/max_angle /horizontal vertical samples16/samples resolution1/resolution min_angle-0.2618/min_angle max_angle0.2618/max_angle /vertical /plugin关键参数解读horizontal/samples900水平方向900个采样点对应0.2°角分辨率3.1416×2÷900≈0.00698rad≈0.4°但实际VLP-16为0.2°故需设为1800。此处设900是为降低CPU负载教学演示足够。vertical/samples16明确声明16线扫描min_angle到max_angle跨度0.5236rad30°每线间隔0.0327rad1.875°与VLP-16的30°垂直视场角一致。range_noise_stddev0.01距离测量高斯噪声标准差1cm符合工业级激光雷达规格。若设为0点云过于“干净”SLAM算法在实车部署时会因无法适应真实噪声而失效。插件发布的/scan话题是sensor_msgs/msg/LaserScan类型但gazebo_ros_ray_sensor实际生成的是sensor_msgs/msg/PointCloud2。工程通过gazebo_ros的convert_scan_to_pointcloud参数自动转换避免手动编写转换节点。该参数在gazebo.launch.py中通过remappings[(scan, /scan)]传递确保话题名统一。2.4 Launch文件的参数化设计如何用一个Launch启动N种场景fishbot_bringup/launch/gazebo.launch.py采用ROS2标准Launch描述符但关键在参数注入机制def generate_launch_description(): # 从命令行获取参数 use_sim_time LaunchConfiguration(use_sim_time, defaulttrue) world LaunchConfiguration(world, defaultos.path.join( get_package_share_directory(fishbot_gazebo), worlds, empty.world)) return LaunchDescription([ DeclareLaunchArgument( use_sim_time, default_valuetrue, descriptionUse simulation (Gazebo) clock if true), DeclareLaunchArgument( world, default_valueworld, descriptionFull path to the world model file to load), # Gazebo服务器节点 IncludeLaunchDescription( PythonLaunchDescriptionSource( os.path.join(get_package_share_directory(gazebo_ros), launch, gazebo.launch.py)), launch_arguments{world: world}.items(), ), # 实体生成节点 Node( packagegazebo_ros, executablespawn_entity.py, arguments[ -entity, fishbot, -topic, robot_description, # 注意必须是/robot_description不是/description -x, 0.0, -y, 0.0, -z, 0.0 ], outputscreen), ])-topic robot_description是易错点很多教程写成-topic /robot_description或-topic description导致spawn_entity找不到URDF而报错。正确值是robot_description无斜杠因为robot_state_publisher发布的/robot_description话题名中的斜杠是ROS2自动添加的命名空间前缀。fishbot_bringup/launch/simulation.launch.py则实现“一键启动全栈”# 启动robot_state_publisher Node( packagerobot_state_publisher, executablerobot_state_publisher, namerobot_state_publisher, outputscreen, parameters[{ use_sim_time: use_sim_time, robot_description: Command([xacro , urdf_path]) }], remappings[(/tf, tf), (/tf_static, tf_static)] ),parameters中robot_description: Command([xacro , urdf_path])动态执行xacro命令生成URDF字符串避免预编译URDF文件导致的更新延迟。remappings将/tf重映射为tf是因为robot_state_publisher默认发布/tf但某些旧版Nav2配置期望tf无前缀——这种兼容性设计让工程能无缝对接不同版本的导航栈。3. 多线激光雷达仿真实操从零搭建到点云可视化全流程3.1 环境准备Ubuntu22.04 ROS2 Humble的精准安装Ubuntu22.04的系统镜像选择至关重要。官方推荐ubuntu-22.04.3-live-server-amd64.iso而非Desktop版——因为Server版默认禁用GUI节省Gazebo渲染的GPU资源且systemd服务管理更稳定。安装时分区建议/根分区50GBSSD、/home分区200GBHDD、swap分区8GB内存16GB时必需。ROS2 Humble安装严格按官网步骤但有两个隐藏陷阱apt源配置sudo sh -c echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release echo $UBUNTU_CODENAME) main /etc/apt/sources.list.d/ros2.list中$(. /etc/os-release echo $UBUNTU_CODENAME)必须输出jammyUbuntu22.04代号。若系统语言非英文$UBUNTU_CODENAME可能为空需手动替换为jammy。gazebo_ros_pkgs安装sudo apt install ros-humble-gazebo-ros-pkgs会自动安装gazebo11但若之前装过Gazebo9或10残留的libgazebo库会导致冲突。此时需执行sudo apt remove --purge gazebo* libgazebo*彻底清理再sudo apt autoremove最后重新安装。验证环境# 检查Gazebo版本 gazebo --version # 应输出 11.3.0 # 检查ROS2接口 ros2 pkg list | grep gazebo # 应含 gazebo_ros, gazebo_msgs # 检查Ignition库 pkg-config --modversion ignition-msgs6 # 应输出 6.11.03.2 工程克隆与编译解决90%的编译失败问题工程压缩包Gazeb.zip解压后目录结构应为fishbot_ws/ ├── src/ │ ├── fishbot_description/ │ ├── fishbot_gazebo/ │ ├── fishbot_bringup/ │ └── fishbot_control/ └── build/ # 编译产物目录关键编译命令cd fishbot_ws # 初始化colcon环境 source /opt/ros/humble/setup.bash # 安装依赖自动解析package.xml rosdep install --from-paths src --ignore-src -r -y # 编译-j1防止内存溢出 colcon build --packages-select fishbot_description fishbot_gazebo --cmake-args -DCMAKE_BUILD_TYPEReleaserosdep install是成功率最高的依赖安装方式它读取每个包的package.xml中的exec_depend自动映射到Ubuntu包名。例如exec_dependgazebo_ros/exec_depend会被解析为ros-humble-gazebo-ros。若编译报错fatal error: gazebo_ros/utils.hpp: No such file or directory说明gazebo_ros_pkgs未正确安装。此时不要手动下载头文件而应执行sudo apt update sudo apt install ros-humble-gazebo-ros-pkgs因为utils.hpp位于/opt/ros/humble/include/gazebo_ros/由ros-humble-gazebo-ros-pkgs包提供。编译成功后source install/setup.bash激活环境。此时运行ros2 pkg list | grep fishbot应列出所有fishbot包。3.3 启动仿真与点云验证三步确认激光雷达工作正常第一步启动Gazebo空世界ros2 launch fishbot_bringup gazebo.launch.pyGazebo窗口打开后左上角菜单栏Insert中应能看到fishbot模型。若无检查GAZEBO_MODEL_PATH是否包含fishbot_ws/install/fishbot_gazebo/share/fishbot_gazebo/models。第二步加载机器人实体在新终端中ros2 launch fishbot_bringup simulation.launch.py此时Gazebo中应出现FishBot模型且RViz2可启动ros2 run rviz2 rviz2 -d $(ros2 pkg prefix fishbot_bringup)/share/fishbot_bringup/rviz/fishbot.rvizRViz2配置文件fishbot.rviz已预设RobotModel、TF、LaserScan三个显示项。若LaserScan无点云检查ros2 topic list | grep scan是否有/scan话题ros2 topic echo /scan是否输出header、angle_min等字段ros2 node list中gazebo_ros_lidar节点是否在运行第三步点云质量验证运行ros2 topic hz /scan查看发布频率应为10HzGazebo仿真步长0.001s × 100Hz控制频率 ÷ 10 10Hz。若低于5Hz检查Gazebo右下角Real Time Factor是否接近1.0若为0.1说明CPU过载需降低horizontal/samples或关闭Gazebo渲染gzserver替代gazebo。点云可视化进阶技巧在RViz2中LaserScan显示项下勾选Style: PointsSize (Pixels): 2Color Transformer: Intensity。此时点云颜色深浅反映回波强度可直观判断近处点强度高呈白色远处点强度衰减呈灰色噪声点随机强度呈杂色斑点——这正是真实激光雷达的物理特性。3.4 参数调优实战让仿真点云逼近真实VLP-16真实VLP-16的点云密度并非均匀分布。水平方向中心区域±30°点更密边缘±90°点更疏垂直方向中间几线第8-9线分辨率更高。工程通过horizontal和vertical的resolution参数模拟此特性horizontal samples1800/samples resolution0.5/resolution !-- 中心区域采样率翻倍 -- min_angle-1.5708/min_angle max_angle1.5708/max_angle /horizontal vertical samples16/samples resolution1.0/resolution min_angle-0.2618/min_angle max_angle0.2618/max_angle /verticalresolution0.5表示在min_angle到max_angle区间内实际采样点数为samples × resolution 1800 × 0.5 900但Gazebo会智能分配中心区域每0.1°一个点边缘每0.4°一个点总点数仍为900。噪声模型调优更关键。range_noise_stddev设为0.01m时点云边缘会出现“毛刺”。真实VLP-16的噪声随距离增大而增大故需启用range_noise_modelrange_noise_model typegaussian/type mean0.0/mean stddev0.01/stddev distance_dependenttrue/distance_dependent distance_factor0.0001/distance_factor /range_noise_modeldistance_factor0.0001表示每米距离增加0.1mm噪声标准差。10m处噪声为0.01 10×0.0001 0.011m100m处为0.02m——这与VLP-16实测数据吻合。提示修改SDF参数后必须重新编译fishbot_gazebo包因为model.sdf被colcon build复制到install/fishbot_gazebo/share/fishbot_gazebo/models/fishbot/model.sdf。直接编辑src/目录下的文件无效。4. 常见问题排查从Gazebo黑屏到点云消失的21个故障点4.1 Gazebo启动失败黑屏、闪退、报错汇总故障现象根本原因解决方案gzserver: command not foundgazebo_ros_pkgs未安装或PATH未更新source /opt/ros/humble/setup.bash后重试若仍失败sudo apt install gazebo11Gazebo窗口黑屏右下角Real Time Factor: 0.0GPU驱动未启用或OpenGL版本过低Ubuntu22.04安装nvidia-driver-525NVIDIA或mesa-utilsIntel/AMD运行glxinfo | grep OpenGL version确认≥3.3Error: Unable to create the rendering windowWayland会话冲突终端输入export GAZEBO_GUI0后启动gzserver或登录时选择Xorg会话Could not find model[fishbot]GAZEBO_MODEL_PATH未包含工程路径在~/.bashrc中添加export GAZEBO_MODEL_PATH$GAZEBO_MODEL_PATH:$HOME/fishbot_ws/install/fishbot_gazebo/share/fishbot_gazebo/models独家避坑技巧Gazebo 11.3.0在Ubuntu22.04上偶发Segmentation fault (core dumped)根源是libignition-common的内存释放bug。临时方案启动前设置export IGNITION_COMMON_DEBUG0或升级到ignition-common4需手动编译。4.2 激光雷达无点云/scan话题消失的根因分析/scan话题缺失是最常见问题但原因分三层第一层Gazebo插件未加载检查model.sdf中plugin标签是否拼写错误如libgazebo_ros_ray_sensor.so误写为libgazebo_ros_laser.so运行gzserver --verbose启动Gazebo观察日志中是否有Loaded plugin libgazebo_ros_ray_sensor.so字样第二层TF树断裂运行ros2 run tf2_tools view_frames生成frames.pdf检查base_link到lidar_link的变换是否存在若缺失确认fishbot_description/urdf/fishbot.urdf.xacro中joint namelidar_joint的parent和child链接名与link定义完全一致大小写敏感第三层话题重映射错误ros2 topic list中若出现/fishbot/scan而非/scan说明robot_namespace参数未生效检查model.sdf中robot_namespace/fishbot/robot_namespace是否被注释或gazebo.launch.py中IncludeLaunchDescription未传递robot_namespace参数注意gazebo_ros_ray_sensor插件默认发布/scan但若robot_namespace设为/fishbot则实际话题为/fishbot/scan。此时必须在RViz2中将LaserScan的Topic改为/fishbot/scan或在Launch文件中添加remappings[(/scan, /fishbot/scan)]。4.3 点云畸变与抖动物理仿真失真的诊断流程点云出现“波浪形”畸变或整体抖动通常源于物理引擎参数不匹配检查Gazebo物理引擎设置worlds/empty.world中physics typeode块max_step_size0.001/max_step_size必须≤real_time_update_rate1000.0/real_time_update_rate的倒数即0.001s。若max_step_size设为0.01仿真会跳步导致机器人位姿突变。验证机器人惯性参数运行ros2 run robot_state_publisher robot_state_publisher --ros-args -p robot_description:...观察/tf中base_link的linear.x速度是否突变。若突变说明URDF中inertial的mass过小0.1kg或inertia过大0.01。激光雷达坐标系校准点云沿Y轴拉伸表明lidar_link的origin rpy中rpy值错误。真实VLP-16安装时Z轴向上故rpy0 0 0若误设为rpy0 1.57 0绕Y轴旋转90°点云将沿X轴展开。实测心得我们曾遇到点云在Z轴方向周期性抖动±2cm最终定位为vertical的min_angle和max_angle未关于0对称。VLP-16的16线范围是-15°到15°若设为-10°到20°Gazebo会强制线性插值导致中间几线密度异常。4.4 多机仿真冲突当第二个FishBot加入时的资源抢占启动第二个机器人时常出现Failed to spawn entity或/tf树混乱。根源在于所有机器人共享同一/robot_description话题spawn_entity.py无法区分gazebo_ros_ray_sensor插件默认使用/scan话题名第二个机器人会覆盖第一个解决方案为每个机器人设置独立命名空间ros2 launch fishbot_bringup simulation.launch.py \ robot_namespace:/robot1 \ x:0.0 y:0.0 ros2 launch fishbot_bringup simulation.launch.py \ robot_namespace:/robot2 \ x:2.0 y:0.0修改model.sdf中robot_namespace为$(arg robot_namespace)并在Launch文件中通过arg传递在gazebo.launch.py中spawn_entity.py的-topic参数改为$(arg robot_namespace)/robot_description此时robot1的点云发布到/robot1/scanrobot2发布到/robot2/scanTF树自动隔离为/robot1/odom和/robot2/odom彻底解决冲突。5. 工程扩展指南从单机仿真到SLAM导航全栈验证5.1 接入SLAM Toolbox5分钟完成建图功能fishbot_slam包已预配置slam_toolbox但需三步激活启动SLAM节点ros2 launch fishbot_slam online_async_launch.py发送初始位姿否则SLAM认为机器人在(0,0,0)建图偏移ros2 topic pub /initialpose geometry_msgs/msg/PoseWithCovarianceStamped header: stamp: sec: 0 nanosec: 0 frame_id: map pose: pose: position: x: 0.0 y: 0.0 z: 0.0 orientation: x: 0.0 y: 0.0 z: 0.0 w: 1.0 covariance: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]控制机器人移动ros2 topic pub /cmd_vel geometry_msgs/msg/Twist linear: x: 0.2 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.5SLAM建图质量取决于点云密度。若地图边缘模糊调高model.sdf中horizontalsamples至1800并重启仿真。5.2 集成Nav2导航栈让机器人自主到达目标点Nav2配置在fish本文还有配套的精品资源点击获取
返回列表