如何为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和导航包使用:
步骤:
创建新ROS包(比如
yd_lidar_converter),依赖sensor_msgs、你的自定义消息包(如yd_lidar_msgs)、roscpp/rospy。编写转换代码(以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; }编译包后,在launch文件中启动转换节点,再按照方法1的步骤,将Gmapping和导航包的订阅话题改为
/converted_scan即可。
额外注意事项
- 确保自定义消息的坐标系与Gmapping、导航包配置的激光坐标系一致,否则会出现建图/定位偏移问题。
- 使用转换节点时,要保证字段映射逻辑准确,比如角度范围、距离单位需与标准
LaserScan完全匹配。
内容的提问来源于stack exchange,提问作者nit-ash
相关产品推荐
相关产品推荐

