全国大学生智能车创意组陕西理工大学校内选拔赛

全国大学生智能车创意组陕西理工大学校内选拔赛


章节

  1. Gazebo环境部署
  2. 建图功能包的创建
  3. 导航功能包的创建
  4. 赛事模板程序使用教程

1.Gazebo环境部署

1.1加载小车仿真环境

请按照下面链接文章安装ubuntu18.04以及ROS(点击右上角剪切板图标即可复制)
后面所需文件的下载链接在文章结尾附录处

1
https://blog.nonenpc.cn/2025/04/02/Ubuntu%E8%99%9A%E6%8B%9F%E6%9C%BA%E4%B8%8EROS1%E5%AE%89%E8%A3%85/

1.1.1 打开ros的任意工作空间,,或者创建一个新的工作空间:
桌面右键打开终端(或者同时按住ctrl+alt+T)依次输入

1
mkdir -p gazebo_test_ws/src
1
cd gazebo_test_ws
1
catkin_make

1.1.2 将下载后的压缩包解压,并将gazebo_pkg功能包复制到工作空间src目录下
1.1.3 编译
1.1.3.1 为了防止启动时编码报错,更改python2 的默认编码解决方案:

  1. 打开终端输入如下指令:
1
sudo gedit /usr/lib/python2.7/site.py
  1. 找到 setencoding() 函数
  2. 修改pyhton默认编码类型
修改完保存并退出
1
将第一个 encoding= "ascii" 修改为 encoding= "utf-8"
  1. 重启电脑

1.1.4 加载任务初始点
没有打开过gazebo的同学,请在终端中输入gazebo运行一次
将models文件夹复制到.gazebo中(打开文件,同时按住Ctrl和H,可查看.gazebo隐藏文件)
1.1.5 运行gazebo模拟环境:
打开主文件夹,查看隐藏文件.bashrc
在最后添加工作空间的环境变量:

1
source ~/gazebo_test_ws/devel/setup.bash

保存后关闭.bashrc
在工作环境下打开终端输入:

1
source ~/gazebo_test_ws/devel/setup.bash
1
roslaunch gazebo_pkg race.launch

1.1.5.1 其他情况
如果在终端中出现“Gazebo [Err] [REST.cc:205] Error in REST request”
解决办法:在终端中输入

1
sudo gedit ~/.ignition/fuel/config.yaml

用以下url替换“url :https://api.ignitionfuel.org”

1
url: https://api.ignitionrobotics.org 

1.2查看发布的话题

打开一个新的终端并且已经确定正确加载小车仿真环境,在终端中输以下代码用于查看已经发布的话题

1
rostopic list

确保以下话题被正确发布

1
2
3
4
5
6
7
8
9
10
11
12
2.1 激光雷达 
• 话题:/scan
• 坐标系:laser_frame
2.2 摄像头
• 话题:/cam
• 坐标系:camera_link
2.3 IMU
• 话题:/imu
• 坐标系:imu_link
2.4 里程计
• 话题:/odom
• 坐标系:odom

1.3控制小车运动安装软件包

安装键盘控制组件
1
sudo apt install ros-melodic-teleop-twist-keyboard ros-melodic-rqt-graph
启动小车
1
rosrun teleop_twist_keyboard teleop_twist_keyboard.py

2.建图功能包的创建

请按照先前教程完成ros的安装、工作空间(gazebo_test_ws)的创建和仿真环境的搭建。

2.1 在gazebo_test_ws/src下创建建图功能包gazebo_map

打开终端依次输入以下命令

进入工作空间源码存放文件夹
1
cd gazebo_test_ws/src 
创建建图功能包
1
catkin_create_pkg gazebo_map  
进入上级目录
1
cd .. 
编译
1
catkin_make 

完成编译后,确认是否将该路径添加到source中打开终端输入如下指令:

1
sudo gedit ~/.bashrc

下拉文件至末查看是否有如下路径

1
source ~/gazebo_test_ws/devel/setup.bash 

若不存在,输入如下指令:

1
echo "source ~/gazebo_test_ws/devel/setup.bash" >> ~/.bashrc
使设置的环境变量立即生效
1
source ~/.bashrc   

2.2 在gazebo_map文件夹下创建cfg,launch,map三个文件夹

打开终端输入如下指令:

1
cd gazebo_test_ws/src/gazebo_map
1
mkdir cfg launch map

cfg文件夹用于存放配置文件,launch文件夹用于存放节点启动文件,map用于存放建图完成后的图片和配置文件(.yaml结尾文件)

2.3 安装建图功能包

1
sudo apt-get install ros-melodic-cartographer-ros

复制cartograhper功能包中的demo_revo_lds.launch文件至gazebo_map/launch
复制cartograhper功能包中的revo_lds.lua文件至gazebo_map/cfg目录下

1
cp /opt/ros/melodic/share/cartographer_ros/launch/demo_revo_lds.launch gazebo_test_ws/src/gazebo_map/launch
1
cp /opt/ros/melodic/share/cartographer_ros/configuration_files/revo_lds.lua gazebo_test_ws/src/gazebo_map/cfg 

2.4 修改行相应文件

1.4.1 在gazebo_map/launch目录下打开demo_devo_lds.launch文件
打开终端输入如下指令:

1
sudo  gedit gazebo_test_ws/src/gazebo_map/launch/demo_revo_lds.launch
1
2
3
4

-configuration_directory $(find cartographer_ros)/configuration_files
修改为
-configuration_directory $(find gazebo_map)/cfg
1
2
3
4

<remap from="scan" to="horizontal_laser_2d" />
修改为
<remap from="scan" to="scan" />
1
2
3
4
5

<node name="rviz" pkg="rviz" type="rviz" required="true" args="-d $(find cartographer_ros)/configuration_files/demo_2d.rviz" />
修改为
<node name="rviz" pkg="rviz" type="rviz" required="true"
args="-d $(find gazebo_map)/cfg/demo.rviz" />
1
2
删除
<node name="playbag" pkg="rosbag" type="play" args="--clock $(arg bag_filename)" />

1.4.2 在gazebo_map/cfg目录下打开revo_lds.lua文件
打开终端输入如下指令:

1
sudo gedit gazebo_test_ws/src/gazebo_map/cfg/revo_lds.lua
1
2
3
4
5
6

tracking_frame = "horizontal_laser_link",
published_frame = "horizontal_laser_link",
修改为
tracking_frame = "base_link",
published_frame = "base_link",

2.5 启动小车建图

打开终端输入如下指令:

1
roslaunch gazebo_pkg race.launch
1
roslaunch gazebo_map demo_revo_lds.launch

1.5.1 保存Rviz配置
rviz启动后点击左下角add,在topic中选择laserscan,map,在display中选择robotmodel。添加完毕后,点击左上角file—>save config as 文件命名为 demo.rviz存储在gazebo_map/cfg目录下
关闭所有终端,重新执行:

1
roslaunch gazebo_pkg race.launch
1
roslaunch gazebo_map demo_revo_lds.launch
1
rosrun teleop_twist_keyboard teleop_twist_keyboard.py

1.5.2 保存地图
观察rviz中显示的图像,完成建图后使用以下命令保存地图:

1
rosrun map_server map_saver -f mapname

若所建地图不够好,请自行调整阈值参数。–occ为无法通行的阈值,–free 为可通行的阈值。
若–occ过高,则可能出现墙体边缘出现灰色未探索地块;若–occ过低,则无墙体部分可能会被凭空建墙。
若–free过高,则可能出现墙体被认为是自由区域;若–free过低,则自由区域可能出现灰色未探索地块。
以上情况皆可能影响定位效果,请选手们核对所建地图中墙体(黑)、自由区域(白)、未探索区域(灰)是否正确,若不正确,请自行调整阈值重新建图。
具体可见官方wikihttp://wiki.ros.org/map_server
eg:

1
rosrun map_server map_saver --occ 70 --free 30 -f mapname 

若无法执行则是map_server没有安装,打开终端安装map_server:

1
sudo apt-get install ros-melodic-map-server
1
source ~/.bashrc

重启终端,执行保存建图指令完成建图,保存的地图(xxx.pgm与xxx.yaml文件)一般是保存在根目录下,手动移动至gazebo_map/map目录下,完成建图操作。


3.导航功能包创建教程

请按照先前教程完成ros的安装、工作空间(gazebo_test_ws)的创建和建图环境(gazebo_map)的搭建。

3.1 安装 ros-melodic-navigation 功能包

打开终端输入如下指令:

1
sudo apt-get install ros-melodic-navigation

3.2 在gazebo_test_ws/src下创建导航能包gazebo_nav

打开终端依次输入如下指令:

进入工作空间源码存放目录
1
cd gazebo_test_ws/src
创建导航功能包
1
catkin_create_pkg gazebo_nav
进入上级目录
1
cd ..
编译
1
catkin_make

3.3 在gazebo_nav文件夹下创建launch,map两个文件夹

进入gazebo_nav并且创建launch,map两个文件夹
1
cd gazebo_test_ws/src/gazebo_nav && mkdir launch map

launch文件夹用于存储节点启动文件,map用于存储建图完成后的图片和配置文件(yaml)
创建完毕后,进入launch文件夹,在launch文件夹下打开终端依次输入如下指令:

创建config文件夹用于存放配置文件
1
mkdir config 
创建节点启动文件
1
touch navi_demo.launch
进入config文件夹并创建amcl,move_base,rviz文件夹
1
cd config && mkdir amcl move_base rviz

amcl 存储定位参数文件,move_base 存储路径规划参数文件,rviz 存储rviz配置文件

3.4 配置机器人定位启动文件

创建amcl定位launch文件
1
cd amcl && touch amcl_omni.launch

将如下代码粘贴到amcl_omni.launch文件中

xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<launch> 
<node pkg="amcl" type="amcl" name="amcl">
<!-- Publish scans from best pose at a max of 10 Hz -->
<param name="odom_model_type" value="omni"/>
<param name="odom_alpha5" value="0.1"/>
<param name="transform_tolerance" value="0.2" />
<param name="gui_publish_rate" value="10.0"/>
<param name="laser_max_beams" value="50"/>
<param name="use_map_topic" value="false"/>
<!-- //当设置为true时,AMCL将会订阅map话题,而不是调用服务返回地图。也就是说,当设置为true时,有另外一个节点实时的发布map话题,也就是机器人在实时的进行地图构建,并供给amcl话题使用;当设置为false时,通过map server,也就是调用已经构建完成的地图。在navigation 1.4.2中新加入的参数。 -->
<param name="first_map_only" value="true"/>
<!-- //当设置为true时,AMCL将仅仅使用订阅的第一个地图,而不是每次接收到新的时更新为一个新的地图,在navigation 1.4.2中新加入的参数。
-->


<param name="min_particles" value="1000"/>
<param name="max_particles" value="10000"/>
<param name="kld_err" value="0.05"/>
<param name="kld_z" value="0.99"/>
<param name="odom_alpha1" value="0.2"/>
<param name="odom_alpha2" value="0.2"/> <!-- translation std dev, m -->
<param name="odom_alpha3" value="0.8"/>
<param name="odom_alpha4" value="0.2"/>
<param name="laser_z_hit" value="0.5"/>
<param name="laser_z_short" value="0.05"/>
<param name="laser_z_max" value="0.05"/>
<param name="laser_z_rand" value="0.5"/>
<param name="laser_sigma_hit" value="0.2"/>
<param name="laser_lambda_short" value="0.1"/>
<param name="laser_lambda_short" value="0.1"/>
<!-- <param name="laser_model_type" value="likelihood_field"/> -->
<param name="laser_model_type" value="beam"/>
<param name="laser_likelihood_max_dist" value="2.0"/>
<param name="update_min_d" value="0.2"/>
<param name="update_min_a" value="0.5"/>
<param name="odom_frame_id" value="odom"/>
<param name="resample_interval" value="1"/>
<param name="transform_tolerance" value="0.1"/>
<param name="recovery_alpha_slow" value="0.0"/>
<param name="recovery_alpha_fast" value="0.0"/>
<!-- <param name="odom_frame_id" value="odom"/> -->
<!-- //里程计默认使用的坐标系 -->
<!-- <param name="base_frame_id" value="base_link"/> -->
<!-- //用作机器人的基坐标系 -->
<!-- <param name="global_frame_id" value="map"/> -->
<!-- //由定位系统发布的坐标系名称 -->
<!-- <param name="tf_broadcast" value="false"/> -->
<!-- //设置为false阻止amcl发布全局坐标系和里程计坐标系之间的tf变换 -->
</node>
</launch>

3.5 配置导航配置文件

打开终端依次输入如下指令:

1
cd .. && cd move_base && touch costmap_common_params.yaml dwa_local_planner_params.yaml global_costmap_params.yaml   global_planner_params.yaml local_costmap_params.yaml

3.5.1 将如下代码贴入到costmap_common_params.yaml文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#Description:
# 代价地图通用参数配置文件,就是全局代价地图和局部代价地图
# 共同都需要配置的参数,各参数意义如下:
# robot_radius: 机器人的半径
# "obstacle_range" 参数确定最大范围传感器读数,这将导致障碍物被放入代价地图中。
# 在这里,我们把它设置在3米,这意味着机器人只会更新其地图包含距离移动基座3米以内的障碍物的信息。
# “raytrace_range”参数确定了用于清除指定范围外的空间。
# 将其设置为3.0米,这意味着机器人将尝试清除3米外的空间,在代价地图中清除3米外的障碍物。

#robot_radius: 0.2

footprint: [[0.171, -0.128], [0.171, 0.128],[-0.171, 0.128], [-0.171, -0.128]]

obstacle_range: 2.5
raytrace_range: 3.0

static_layer:
enabled: true

inflation_layer: #膨胀层
enabled: true
inflation_radius: 0.30 # 代价地图膨胀半径 0.03 0.05 0.15 0.20 0.25
cost_scaling_factor: 10.0

obstacle_layer:
enabled: true
track_unknown_space: true
combination_method: 1

obstacle_range: 2.5
raytrace_range: 3.0

observation_sources: scan
scan: {
data_type: LaserScan,
topic: /scan,
marking: true,
clearing: true
}

3.5.2 将如下代码贴入到dwa_local_planner_params.yaml文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#Description: 
# dwa_local_planner提供一个能够驱动底座的控制器,该控制器连接了路径规划器和机器人.
# 使用地图,规划器产生从起点到目标点的运动轨迹,在移动时,规划器在机器人周围产生一个函数,
# 用网格地图表示。控制器的工作就是利用这个函数来确定发送给机器人
# 的速度dx, dy, dtheta
#
# >> DWA算法的基本思想 <<
# 1.在机器人控制空间离散采样(dx, dy, dtheta)
# 2.对每一个采样的速度进行前向模拟,看看在当前状态下,使用该采样速度移动一小段时间后会发生什么.
# 3.评价前向模拟得到的每个轨迹,是否接近障碍物,是否接近目标,是否接近全局路径以及速度等等.舍弃非法路径
# 4.选择得分最高的路径,发送对应的速度给底座
#
# DWA与Trajectory Rollout的区别主要是在机器人的控制空间采样差异...
latch_xy_goal_tolerance: true

DWAPlannerROS:
# Robot Configuration Parameters - stdr robot
acc_lim_x: 0.5
acc_lim_y: 0.0
acc_lim_th: 0.3

# max_trans_vel: 0.4 # choose slightly less than the base's capability
# min_trans_vel: 0.1 # this is the min trans velocity when negligible rotational velocity

max_vel_trans: 1.0 # choose slightly less than the base's capability
min_vel_trans: -0.1 # this is the min trans velocity when negligible rotational velocity

trans_stopped_vel: 0.1
theta_stopped_vel: 0.1
max_vel_x: 1.2 # 0.8
min_vel_x: -0.2
max_vel_y: 1.2 # 0.2 diff drive robot, don't need set vel_y
min_vel_y: -0.2

# max_rot_vel: 0.5 # choose slightly less than the base's capability
# min_rot_vel: 0.1 # min angular velocity when negligible translational velocity

max_vel_theta: 0.6 # choose slightly less than the base's capability
min_vel_theta: -0.6 # min angular velocity when negligible translational velocity

# Goal Tolerance Parameters
yaw_goal_tolerance: 0.1 # 0.1 rad = 5.7 degree
xy_goal_tolerance: 0.3
latch_xy_goal_tolerance: true

# Forward Simulation Parameters
sim_time: 1.0 # 1.7
sim_granularity: 0.025
vx_samples: 3 # default 3
vy_samples: 3 # diff drive robot, there is only one sample
vth_samples: 7 # 20
controller_frequency: 5.0

# Trajectory Scoring Parameters
path_distance_bias: 32.0 # weighting for sticking to global path
goal_distance_bias: 20.0 # weighting for reaching local goal
occdist_scale: 0.2 # weighting for obstacle avoidance
forward_point_distance: 0.125
stop_time_buffer: 0.2
scaling_speed: 0.20
max_scaling_factor: 0.2
publish_cost_grid: false

# Oscillation Prevention Parameters
oscillation_reset_dist: 0.05

hdiff_scale: 1.0 # 全局和局部角度判断
heading_points: 1

# Global Plan Parameters
prune_plan: true

publish_traj_pc: false
publish_cost_grid_pc: false
global_frame_id: map

3.5.3 将如下代码贴入到global_costmap_params.yaml文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#Description: 
# 全局代价地图参数配置文件,各参数的意义如下:
# global_frame: 在全局代价地图中的全局坐标系
# robot_base_frame: 机器人的基坐标系

global_costmap:
global_frame: map
robot_base_frame: dummy #base_footprint
transform_tolerance: 0.5

update_frequency: 10.0
publish_frequency: 10.0

plugins:
- {name: static_layer, type: "costmap_2d::StaticLayer"}
- {name: obstacle_layer, type: "costmap_2d::ObstacleLayer"}
- {name: inflation_layer, type: "costmap_2d::InflationLayer"}

3.5.4 将如下代码入贴到global_planner_params.yaml文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#Description:
# * allow_unknown:是否允许规划器规划穿过未知区域的路径,
# 只设计该参数为true还不行,还要在costmap_commons_params.yaml
# 中设置track_unknown_space参数也为true才行.
# * default_tolerance:当设置的目的地被障碍物占据时,需要以该参数
# 为半径寻找到最近的点作为新目的地点.
# * visualize_potential:是否显示从PointCloud2计算得到的势区域.
# * use_dijkstra:设置为true,将使用dijkstra算法,否则使用A*算法.
# * use_quadratic:设置为true,将使用二次函数近似函数,否则使用更加
# 简单的计算方式,这样节省硬件计算资源.
# * use_grid_path:如果设置为true,则会规划一条沿着网格边界的路径,
# 偏向于直线穿越网格,否则将使用梯度下降算法,路径更为光滑点.
# * old_navfn_behavior:若在某些情况下,想让global_planner完全复制navfn
# 的功能,那就设置为true,但是需要注意navfn是非常旧的ROS系统中使用的,
# 现在已经都用global_planner代替navfn了,所以不建议设置为true.
# * lethal_cost:致命代价值,默认是设置为253,可以动态来配置该参数.
# * neutral_cost:中等代价值,默认设置是50,可以动态配置该参数.
# * cost_factor:代价地图与每个代价值相乘的因子.
# * publish_potential:是否发布costmap的势函数.
# * orientation_mode: 如何设置每个点的方向(None = 0,Forward = 1,
# Interpolate = 2,ForwardThenInterpolate = 3,Backward = 4,
# Leftward = 5,Rightward = 6)(可动态重新配置)
# * orientation_window_size:根据orientation_mode指定的位置积分来得到
# 使用窗口的方向.默认值1,可以动态重新配置.
GlobalPlanner:
allow_unknown: true
default_tolerance: 0.05
use_dijkstra: true
use_quadratic: true
use_grid_path: false
outline_map: false
old_navfn_behavior: false
visualize_potential: false
publish_potential: true

lethal_cost: 253
neutral_cost: 50
cost_factor: 3.0

orientation_mode: 0
orientation_window_size: 1

3.5.5 将如下代码贴入到local_costmap_params.yaml文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#Description:
# 本地代价地图需要配置的参数,各参数意义如下:
# global_frame:在本地代价地图中的全局坐标系;
# robot_base_frame:机器人本体的基坐标系;

local_costmap:
global_frame: odom
global_frame: map
robot_base_frame: dummy #base_footprint
transform_tolerance: 0.5

update_frequency: 10.0
publish_frequency: 10.0
update_frequency: 4.0
publish_frequency: 4.0
rolling_window: true
width: 3.0
height: 3.0
resolution: 0.05


plugins:
# - {name: static_layer, type: "costmap_2d::StaticLayer"}
- {name: obstacle_layer, type: "costmap_2d::ObstacleLayer"}
- {name: inflation_layer, type: "costmap_2d::InflationLayer"}


导航配置文件创建完毕,退出config文件夹
3.5.6 配置navi_demo.launch文件
将如下代码贴入到navi_demo.launch文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<launch>
<node name="map_server" pkg="map_server" type="map_server"
args="$(find gazebo_nav)/map/mymap1.yaml" output="screen">
<param name="frame_id" value="map" />
</node>

<include file="$(find gazebo_nav)/launch/config/amcl/amcl_omni.launch" />

<node pkg="move_base" type="move_base" respawn="false"
name="move_base" output="screen">

<param name="base_global_planner" value="global_planner/GlobalPlanner"/>
<param name="base_local_planner" value="dwa_local_planner/DWAPlannerROS"/>

<rosparam file="$(find gazebo_nav)/launch/config/move_base/costmap_common_params.yaml"
command="load" ns="global_costmap" />
<rosparam file="$(find gazebo_nav)/launch/config/move_base/costmap_common_params.yaml"
command="load" ns="local_costmap" />
<rosparam file="$(find gazebo_nav)/launch/config/move_base/global_planner_params.yaml"
command="load" />
<rosparam file="$(find gazebo_nav)/launch/config/move_base/dwa_local_planner_params.yaml"
command="load" />
<rosparam file="$(find gazebo_nav)/launch/config/move_base/local_costmap_params.yaml"
command="load" />
<rosparam file="$(find gazebo_nav)/launch/config/move_base/global_costmap_params.yaml"
command="load" />
</node>

<node name="rviz" pkg="rviz" type="rviz" required="true"
args="-d $(find gazebo_nav)/launch/config/rviz/demo2.rviz" />
</launch>

3.6 将存于gazebo_map中的地图文件复制到gazebo_nav/map目录下,若要修改读取的地图文件,修改navi_demo.launch即可

关闭所有终端,重新执行

1
roslaunch gazebo_pkg race.launch

不要关闭上面这个终端,再开一个新终端执行

1
roslaunch gazebo_nav navi_demo.launch

3.7 保存Rviz配置

rviz启动后点击左下角add,在topic中选择/laserscan,/map,/PointStamped/move_base/,/GlobalPlanner/plan/path,在display中选择 robotmodel。

添加完毕后,点击左上角file—>save config as文件命名为demo2.rviz,存储在gazebo_nav/launch/config/rviz目录下

在rviz中选择navi goal在地图中选定地点即可开始导航


4.赛事模板程序使用教程

首先确认ros安装,按照先前教程完成工作空间(gazebo_test_ws)创建,建图功能包(gazebo_map)、导航功能包(gazebo_nav)的搭建

4.1 安装依赖

1
sudo apt install ros-melodic-cartographer* ros-melodic-navigation ros-melodic-teleop-twist-keyboard ros-melodic-rqt-graph

4.2 若已完成之前教程,仅需把start_game移动至gazebo_test_ws/src 在gazebo_test_ws目录下

进入工作空间编译
1
cd ~/gazebo_test_ws && catkin_make 

在脚本目录下,首先执行命令

1
cd ~/gazebo_test_ws/src/start_game

将YourAccountName 替换成自己的ubuntu用户名

给予文件夹权限
1
sudo chown YourAccountName *
给予所有python文件权限
1
chmod u+x *.py

4.3 文件结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
. 
├── gazebo_map # 建图部分
├── cfg
└── launch
└── map
└── CMakeLists.txt
└── package.xml
├── gazebo_nav # 导航部分
├── map # 导航所需地图
└── launch
├── navi_demo.launch # 导航所需地图位置在此处修改
└── config # 参数配置文件
└── CMakeLists.txt
└── package.xml
├── start_game # 脚本部分
├── main.py # 执行脚本
└── initialize.py # 修改工作空间和urdf路径
└── interactive.py
└── ros_module.py
└── pose.json # 导航点
└── log.txt
└── vital_log.txt
└── resources
└──ucar_plane
└── gazebo_pkg

4.4 功能讲解

4.4.1 地图位置及命名
导航所需地图在:

1
~/gazebo_test_ws/src/gazebo_nav/launch/navi_demo.launch

地图路径:

1
2
3
4
<node name="map_server" pkg="map_server" type="map_server" 
args="$(find gazebo_map)/map/game_map.yaml" output="screen">
<param name="frame_id" value="map" />
</node>

说明:
gazebo_map 为功能包名称
map 为功能包目录下文件夹
game_map 为地图名称
若地图文件位置不同,请在 args 中修改路径。
若希望命名统一:
将 地图.png 与 地图.yaml 移动到 ~/gazebo_test_ws/src/gazebo_map/map/
修改文件名为 game_map.png 与 game_map.yaml

4.4.2 导航目标点配置
目标点配置文件位置:

1
~/gazebo_test_ws/src/start_game/pose.json

内容示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"position": {
"x": -0.25,
"y": -5.3,
"z": 0.0
},
"orientation": {
"x": 0.0,
"y": 0.0,
"z": 1.0,
"w": 0.0
}
}

修改方法:
position 下的 x, y, z 控制目标位置
orientation 下的 x, y, z, w 控制目标朝向

4.3 启动脚本修改

文件位置:

1
~/gazebo_test_ws/src/start_game/main.py

函数:launch_pkg()
示例:

1
2
3
4
5
nav_cmd = [
'roscore',
'sleep 5; roslaunch gazebo_pkg race.launch',
'sleep 5; roslaunch gazebo_nav navi_demo.launch'
]

说明:
roslaunch gazebo_pkg race.launch:启动仿真环境
roslaunch gazebo_nav navi_demo.launch:启动导航模块
选手可替换导航模块为自己的 launch 文件,例如:

1
2
3
4
5
nav_cmd = [
'roscore',
'sleep 5; roslaunch gazebo_pkg race.launch',
'sleep 5; roslaunch ucar_nav your_navigation.launch'
]

4.5注意事项

4.5.1 脚本使用要求
禁止 root 权限运行(不要加 sudo)
修改 Python2 默认编码为 UTF-8(方法见前序教程)
文件路径检查:

在 initialize.py 第 13 行补全 urdf 文件路径
1
model_path = '~/gazebo_test_ws/src/gazebo_pkg/urdf'  # 修改此处
在 initialize.py 第 14 行补全工作空间路径
1
workspace_path = 'source ~/gazebo_test_ws/devel/setup.bash'  # 修改此处

4.5.2 运行模板程序
进入目录并运行

1
cd ~/gazebo_test_ws/src/start_game
1
python2 main.py
1
2
3
4
5
6
7
8
9
10
11
脚本功能:

运行前提示是否开启录屏

校验 gazebo_pkg/urdf 的 MD5

自动打开 3 个终端标签页并执行:

roscore
sleep 5; roslaunch gazebo_pkg race.launch
sleep 5; roslaunch gazebo_nav navi_demo.launch
1
2
3
4
5
6
7
8
9
10
11
运行提示:

“上述命令是否已全部在其他窗口正确执行?” → 输入 Y

“是否开始比赛计时?” → 输入 Y

比赛过程中:

仿真正式开始

每 30s 打印一次 Topic list

4.5.3 收尾工作

记录运行时间

将屏幕移动到小车位置并截图

校验小车参数(禁止修改 URDF 参数,赛后会进行校验)


附录

所需压缩包下载地址

1
https://alist.nonenpc.cn/d/ROS2/src.zip?sign=ZWS0osKq4MJwDoWIYE7htcbeDKXas_i1yEbsiavgUSo=:0