前言

本篇为自定义四轮小车的ROS导航仿真,与前面自定义机器人导航类似。该篇源码非原创,特此说明,作者博客地址在这里:https://blog.csdn.net/wangchao7281/article/details/53691351,本想转载,但是没找到快捷键。。。所以再记录一下吧。

一、创建编译功能包

切换到catkin_ws/src目录下,如下:

catkin_create_pkg nav_sim urdf xacro

切换到catkin_ws目录下,编译该功能包,如下:

catkin_make nav_sim

在该功能包下创建include、src、launch、urdf文件夹,在urdf文件下创建urdf文件夹和xacro文件夹。

二、代价地图配置

新建costmap_common_params.yaml配置文件(即共享文件配置),内容如下:

obstacle_range: 2.5
raytrace_range: 3.0
footprint: [[-0.2,-0.2],[-0.2,0.2], [0.2, 0.2], [0.2,-0.2]]
#robot_radius: ir_of_robot
inflation_radius: 0.6
cost_scaling_factor: 10.0
observation_sources: scan
scan: {sensor_frame: hokuyo_link,  observation_persistence: 0.0, max_obstacle_height: 0.4, min_obstacle_height: 0.0, data_type: LaserScan, topic: /scan, marking: true, clearing: true}

新建global_costmap_params.yaml配置文件(即全局代价地图配置),内容如下:

global_costmap:
  global_frame: /map
  robot_base_frame: /base_footprint
  update_frequency: 1.0
  static_map: true

新建local_costmap_params.yaml配置文件(即局部代价地图配置),内容如下:

local_costmap:
  global_frame: /map
  robot_base_frame: /base_footprint
  update_frequency: 5.0
  publish_frequency: 1.0
  static_map: false
  rolling_window: true
  width: 5.0
  height: 5.0
  resolution: 0.05
  tranform_tolerance: 1.0
  planner_frequency: 1.0
  planner_patiente: 5.0
#plugins:
# {name: obstacles, type: "costmal_2d::ObstacleLayer",
# name: inflation, type: "costmal_2d::InflationLayer"}

三、基本局部规划器配置

新建base_local_planner_params.yaml配置文件(即本地代价地图配置),用于产生一个速度命令来移动机器人,内容如下:

TrajectoryPlannerROS:
  controller_frequency: 3.0
  max_vel_x: 0.3
  min_vel_x: 0.05
  max_rotational_vel: 0.5
  min_in_place_rotational_vel: 0.01
  min_in_place_vel_theta: 0.5
  escape_vel: -0.1
  max_vel_theta: 1.0
  min_vel_theta: -1.0
  acc_lim_theta: 3.2
  acc_lim_x: 2.5
  acc_lim_y: 2.5
  yaw_goal_tolerance: 0.1
  xy_goal_tolerance: 0.1
  pdist_scale: 0.8
  gdist_scale: 0.4
  holonomic_robot: false
  meter_scoring: true

四、创建导航包的启动文件

新建myrobot_world.launch启动文件,内容如下:

<launch>
  <!-- these are the arguments you can pass this launch file, for example paused:=true -->
  <arg name="paused" default="true"/>
  <arg name="use_sim_time" default="true"/>
  <arg name="gui" default="true"/>
  <arg name="headless" default="false"/>
  <arg name="debug" default="false"/>
  <remap from="robot/laser/scan" to="/scan"/>

  <include file="$(find gazebo_ros)/launch/empty_world.launch">
    <arg name="world_name" value="$(find nav_sim)/urdf/wall.world"/>
    <arg name="use_sim_time" value="$(arg use_sim_time)"/>
    <arg name="debug" value="$(arg debug)" />
    <arg name="gui" value="$(arg gui)" />
  </include>
  
  <!-- Load the URDF into the ROS Parameter Server -->
  <arg name="model" default="$(find nav_sim)/urdf/myrobot.xacro" />
  <param name="robot_description" command="$(find xacro)/xacro.py $(arg model)" />
 
  <!-- Run a python script to send a service call the gazebo_ros to spawn a URDF robot -->
  <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
	args="-urdf -model robot -param robot_description -z 0.05"/> 
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find nav_sim)/urdf/navigation.rviz"/>

  <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher"/>

</launch>

新建move_base.launch启动文件,内容如下:

<?xml version="1.0"?>

<launch>

  <!-- Run the map server -->
   <node name="map_server" pkg="map_server" type="map_server" args="$(find nav_sim)/maps/map.yaml" output="screen"/>

  <include file="$(find amcl)/examples/amcl_diff.launch" >
  </include> 

  <node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen">
    <param name="controller_frequency" value="10.0"/>
    <param name="controller_patiente" value="15.0"/>
    <rosparam file="$(find nav_sim)/launch/costmap_common_params.yaml" command="load" ns="global_costmap" />
    <rosparam file="$(find nav_sim)/launch/costmap_common_params.yaml" command="load" ns="local_costmap" />
    <rosparam file="$(find nav_sim)/launch/local_costmap_params.yaml" command="load" />
    <rosparam file="$(find nav_sim)/launch/global_costmap_params.yaml" command="load" />
    <rosparam file="$(find nav_sim)/launch/base_local_planner_params.yaml" command="load" />
  </node>

</launch>

使用如下命令依次执行启动文件:

roslaunch nav_sim myrobot_world.launch
roslaunch nav_sim move_base.launch

五、导航仿真

单击2D Nav Goal按钮,设置导航目标,可以观察到路径规划,四轮小车向目标点移动,如图:

六、总结

再次声明,本篇源码非原创,作者链接见前言,四轮小车成功移动到目标点。