ROS 全国大学生智能车创意组陕西理工大学校内选拔赛 Zero 2025-09-11 2025-10-20 全国大学生智能车创意组陕西理工大学校内选拔赛
章节
Gazebo环境部署
建图功能包的创建
导航功能包的创建
赛事模板程序使用教程
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.1.2 将下载后的压缩包解压,并将gazebo_pkg功能包复制到工作空间src目录下 1.1.3 编译 1.1.3.1 为了防止启动时编码报错,更改python2 的默认编码解决方案:
打开终端输入如下指令:
1 sudo gedit /usr/lib/python2.7/site.py
找到 setencoding() 函数
修改pyhton默认编码类型
修改完保存并退出 1 将第一个 encoding= "ascii" 修改为 encoding= "utf-8"
重启电脑
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 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 catkin_create_pkg gazebo_map
进入上级目录
编译
完成编译后,确认是否将该路径添加到source中打开终端输入如下指令:
下拉文件至末查看是否有如下路径
1 source ~/gazebo_test_ws/devel/setup.bash
若不存在,输入如下指令:
1 echo "source ~/gazebo_test_ws/devel/setup.bash" >> ~/.bashrc
使设置的环境变量立即生效
2.2 在gazebo_map文件夹下创建cfg,launch,map三个文件夹 打开终端输入如下指令:
1 cd gazebo_test_ws/src/gazebo_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
重启终端,执行保存建图指令完成建图,保存的地图(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 catkin_create_pkg gazebo_nav
进入上级目录
编译
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文件夹用于存放配置文件
创建节点启动文件
进入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 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 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 latch_xy_goal_tolerance: true DWAPlannerROS: acc_lim_x: 0.5 acc_lim_y: 0.0 acc_lim_th: 0.3 max_vel_trans: 1.0 min_vel_trans: -0.1 trans_stopped_vel: 0.1 theta_stopped_vel: 0.1 max_vel_x: 1.2 min_vel_x: -0.2 max_vel_y: 1.2 min_vel_y: -0.2 max_vel_theta: 0.6 min_vel_theta: -0.6 yaw_goal_tolerance: 0.1 xy_goal_tolerance: 0.3 latch_xy_goal_tolerance: true sim_time: 1.0 sim_granularity: 0.025 vx_samples: 3 vy_samples: 3 vth_samples: 7 controller_frequency: 5.0 path_distance_bias: 32.0 goal_distance_bias: 20.0 occdist_scale: 0.2 forward_point_distance: 0.125 stop_time_buffer: 0.2 scaling_speed: 0.20 max_scaling_factor: 0.2 publish_cost_grid: false oscillation_reset_dist: 0.05 hdiff_scale: 1.0 heading_points: 1 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 global_costmap: global_frame: map robot_base_frame: dummy 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 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 local_costmap: global_frame: odom global_frame: map robot_base_frame: dummy 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: 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文件权限
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 │ └── 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 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