1. 程式人生 > >ROS導航-向cost-map中新增超聲波障礙圖層

ROS導航-向cost-map中新增超聲波障礙圖層

兩種思路:
1.將超聲波反饋資訊作為一個新的layer新增到cost-map當中;
2.將超聲波資料(ros_msgs/Range)轉換為move_base包需要的輸入格式(LaserScan或者PointCloud;
這裡重點講解方式一,因為方式二尚未嘗試。

步驟(以ros_by_example書中第八章例程為基礎):
1 編譯range_sensor_layer外掛並新增到ROS環境
主要參考
為ROS新增外掛
http://wiki.ros.org/range_sensor_layer
1.1)根據ROS分支下載對應git包:
https://github.com/DLu/navigation_layers.git


1.2)編譯range_sensor_layer
注意可只編譯range_sensor_layer,將該包拎出來單獨建立一個工作空間(當然也可以扔到已有工程專案的工作空間中)進行編譯,記得source(當時被這個坑了好久,結果就是一直無法識別這個層)。
1.3)檢查該外掛是否加入ROS系統
rospack plugins --attrib=plugin costmap_2d
若未加入成功:那麼輸出將是這樣:
這裡寫圖片描述
這個時候需要確認一下是否source devel資料夾下的setup.bash檔案了。成功的話,將是下面的樣子,即除了ROS系統自帶的cost-map圖層,還有剛剛編譯的外掛:
這裡寫圖片描述

2 傳送超聲波資料到ROS(模擬)
根據ros定義的Range topic型別傳送模擬資料sensor_msgs/Range
2.1)新建工作空間,新建包,依賴roscpp,sensor_msg,tf.
2.2) 程式碼段:

#include "ros/ros.h"
#include "sensor_msgs/Range.h"
#include "std_msgs/Header.h"
#include <time.h>
#include <sstream>
#include <tf/transform_broadcaster.h>
int main(int argc, char **argv) { ros::init(argc, argv, "talkerUltraSound"); ros::NodeHandle n; ros::Publisher ultrasound_pub = n.advertise<sensor_msgs::Range>("UltraSoundPublisher", 10); ros::Rate loop_rate(10); int count = 0; while (ros::ok()) { sensor_msgs::Range msg; std_msgs::Header header; header.stamp = ros::Time::now(); header.frame_id = "/ultrasound"; msg.header = header; msg.field_of_view = 1; msg.min_range = 0; msg.max_range = 5; msg.range = rand()%3;//rand()%3; tf::TransformBroadcaster broadcaster; broadcaster.sendTransform( tf::StampedTransform( tf::Transform(tf::Quaternion(0, 0, 0, 1), tf::Vector3(0.1, 0.0, 0.2)), ros::Time::now(),"base_link", "ultrasound")); ultrasound_pub.publish(msg); loop_rate.sleep(); ++count; } return 0; }

3 配置導航包引數檔案,新增range_data_layer
ROS導航包中有關於cost-map的配置檔案有三個, 由於只是作為測試,我之配置了local_costmap_params.yaml檔案,即只是讓超聲波作用於區域性避障規劃,配置如下;

local_costmap:
   global_frame: /odom
   robot_base_frame: /base_link
   update_frequency: 5.0
   publish_frequency: 5.0
   static_map: false
   rolling_window: true
   width: 6.0
   height: 6.0
   resolution: 0.05
   transform_tolerance: 5.0 

   # 需要新增的配置:
   plugins:
   #- {name: obstacle_layer, type: "costmap_2d::VoxelLayer"}     - {name: sonar,   type: "range_sensor_layer::RangeSensorLayer"}

   sonar:
     topics: ["/UltraSoundPublisher"]#注意替換成自己的topic名字
     no_readings_timeout: 0.0

4 觀察新加層是否起作用

roslaunch rbx1_nav test_ultrasound_nav.launch(換成自己的launch) 

在rviz中開啟map和Range,RobotModel後可以得到下圖所示的結果:
機器人傳送的錐型面就是模擬的超聲波資料
在左邊map選單的topic選擇loca_cost_map將得到超聲波加入後新增的障礙物圖層:
如圖機器人前方黑色部分就是超聲波返回的障礙物資訊