You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为gmapping及导航包使用自定义激光扫描消息?YD LIDAR能否换话题?

让Gmapping与导航包使用自定义激光扫描话题的两种方法

方法1:直接修改订阅话题参数(消息类型为标准sensor_msgs/LaserScan时)

如果你的激光消息是标准的sensor_msgs/LaserScan类型,只是发布在非/scan的自定义话题(比如/yd_lidar/scan),无需额外代码,直接修改配置文件即可:

  • Gmapping配置:
    在gmapping的launch文件中,找到slam_gmapping节点的scan参数,替换为你的自定义话题名:

    <node pkg="gmapping" type="slam_gmapping" name="slam_gmapping">
      <!-- 保留其他原有参数 -->
      <param name="scan" value="/yd_lidar/scan" />
    </node>
    
  • 导航包(move_base)配置:
    在costmap的配置文件(如costmap_common_params.yaml)中,修改激光传感器的topic字段:

    scan_sensor:
      sensor_frame: laser_link
      topic: /yd_lidar/scan
      data_type: LaserScan
      marking: true
      clearing: true
    

    旧版导航配置可能用laser_scan_sensor字段,同样替换其中的话题名即可。


方法2:编写消息转换节点(自定义消息类型时)

如果你的激光消息是完全自定义的ROS消息类型(比如yd_lidar_msgs/LaserScanCustom),需要写一个轻量转换节点,将自定义消息转为标准sensor_msgs/LaserScan,再提供给Gmapping和导航包使用:

步骤:

  1. 创建新ROS包(比如yd_lidar_converter),依赖sensor_msgs、你的自定义消息包(如yd_lidar_msgs)、roscpp/rospy。

  2. 编写转换代码(以C++为例):

    #include <ros/ros.h>
    #include <sensor_msgs/LaserScan.h>
    #include <yd_lidar_msgs/LaserScanCustom.h>
    
    ros::Publisher converted_scan_pub;
    
    void customScanCb(const yd_lidar_msgs::LaserScanCustom::ConstPtr& custom_scan) {
        sensor_msgs::LaserScan std_scan;
        // 复制头部坐标系与时间戳
        std_scan.header = custom_scan->header;
        // 映射自定义字段到标准LaserScan
        std_scan.angle_min = custom_scan->start_angle;
        std_scan.angle_max = custom_scan->end_angle;
        std_scan.angle_increment = custom_scan->angle_step;
        std_scan.time_increment = custom_scan->time_interval;
        std_scan.scan_time = custom_scan->scan_duration;
        std_scan.range_min = custom_scan->min_range;
        std_scan.range_max = custom_scan->max_range;
        std_scan.ranges = custom_scan->ranges;
        std_scan.intensities = custom_scan->intensities; // 如果自定义消息包含强度字段
    
        converted_scan_pub.publish(std_scan);
    }
    
    int main(int argc, char** argv) {
        ros::init(argc, argv, "yd_lidar_converter");
        ros::NodeHandle nh;
    
        ros::Subscriber custom_scan_sub = nh.subscribe("/yd_lidar/custom_scan", 10, customScanCb);
        converted_scan_pub = nh.advertise<sensor_msgs::LaserScan>("/converted_scan", 10);
    
        ros::spin();
        return 0;
    }
    
  3. 编译包后,在launch文件中启动转换节点,再按照方法1的步骤,将Gmapping和导航包的订阅话题改为/converted_scan即可。


额外注意事项

  • 确保自定义消息的坐标系与Gmapping、导航包配置的激光坐标系一致,否则会出现建图/定位偏移问题。
  • 使用转换节点时,要保证字段映射逻辑准确,比如角度范围、距离单位需与标准LaserScan完全匹配。

内容的提问来源于stack exchange,提问作者nit-ash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 18:09:25