预备:
在ros中, 我们可以将自定义层加入到costmap当中,以此来辅助机器人进行避障,
目前主要的层, 包括static_map静态地图层, obstacles障碍物层, inflation 膨胀层,其他层: 比如自创建range_layer来加入测距传感器。
在使用中, 先通过plugin在配置中加入一个新的传感器数据层, 比如foo_layer,
然后,通过foo_layer: configuration_param来配置层的参数,如话题,角度等等,这取决于foo_layer的代码设计。
代码实现参考 :
ros中应用插件库: http://wiki.ros.org/pluginlib,
costmap开发教程: http://wiki.ros.org/costmap_2d/Tutorials,
在ros中创建一个新的层: http://wiki.ros.org/costmap_2d/Tutorials/Creating%20a%20New%20Layer
正文:
首先,先发布 超声波传感器的数据话题。
以大家常用的python为例, 注意设置传感器所在的坐标系。
rospy.loginfo("r0: " + str(r0)+"r1: " + str(r1)+"r2: " + str(r2)+"r3: " + str(r3)+"r4: " + str(r4))
#rospy.loginfo("r0: " + str(r0) + "r3: " + str(r3))
sonar0_range=Range()
sonar0_range.header.stamp=now
sonar0_range.header.frame_id="/sonar0"
sonar0_range.radiation_type=Range.ULTRASOUND
sonar0_range.min_range=0.05
sonar0_range.max_range=4.0
sonar0_range.range=r0/100.0
self.sonar0_pub.publish(sonar0_range)
发布sonar0 超声波话题,并设置 radiation_type参数。
然后,创建range_layer ,想了解具体过程 可以参考 官网的链接,
http://wiki.ros.org/range_sensor_layer
下载附件代码, https://pan.baidu.com/s/1i53UCj7 链接: 密码: bqmk 放到ros工作区间下,进行编译 catkin_make .
在终端输入rospack plugins --attrib=plugin costmap_2d
如果产生一个 range_layer 说明 该插件 生成成功。
最后, 在导航包的配置文件中,添加层的配置参数以及层下的超声波的配置参数。
1)nav/config/odom/costmap_common_params.yaml
增加
sonar_layer:
enabled: true
clear_threshold: 0.46
mark_threshold: 0.98
topics: ["/sonar0", "/sonar1", "/sonar2", "/sonar3", "/sonar4"] 订阅超声波主题,添加到sonar_layer到 costmap中
clear_on_max_reading: true
2)nav/config/odom/local_costmap_params.yaml中的
plugins:
- {name: static_layer, type: "costmap_2d::StaticLayer"}
- {name: obstacle_layer, type: "costmap_2d::ObstacleLayer"}
下面增加
- {name: sonar_layer, type: "range_sensor_layer::RangeSensorLayer"} //加入到局部导航的配置文件