ROS導航-向cost-map中新增超聲波障礙圖層
阿新 • • 發佈:2019-02-12
兩種思路:
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將得到超聲波加入後新增的障礙物圖層: