吉林省机器人大赛智能无人仿真车竞速比赛赛后总结
个人总结
对于个人而言,这是我获得的竞赛类最高奖项,省级一等奖,没有国家级的奖项,让我在多项荣誉伴随的同时倍感凄凉。梅西在12/19的凌晨带领球队夺得本届世界杯的冠军,他结束了来自内心的凄凉,拿到了属于自己的最高荣誉,他不在乎他是不是金靴,是不是MVP,因为这不是最高荣誉,只有全金的大力神杯才是他心中想要的,我没法与世界巨星相比较,他昨天的经历仿佛映照在现在的我身上,但是今天的他补足了这份遗憾,功成名就,而我,确实不再可能拿到属于我自己的本科阶段大学生竞赛类国奖。因而对我现在拿到的最高奖项作总结,当作遗憾,也作为纪念。
备赛环节
本次比赛在10月6日印发红头文件,我们收到竞赛通知是在10月11日,最比赛时间定为11月26,27日,可能因为疫情影响,最终时间改到12月4日,这个时间是智能无人仿真车竞速比赛,收到通知后,我们实验室成员首先进行分组商讨,但是有一位同学因疫情原因不能到校,所以分组方面纠结了有一周时间,为此深感羞愧。
组队组委会限制不超出三人,我们最终组名定为“一xin”,三人成一组开始了长达一月半备赛,也不要嘲笑我,这虽然不是我们学院第一次参加这个比赛的这个项目,但是并没有真正做出可以跑动作品的学长,没有了前人栽树,哪有后人乘凉的道理,这一月半就当我为学院栽了棵树,做了微乎其微了贡献。
既然是栽树,那第一件事就是看看树是什么品种,不错,我们连这个比赛是什么都不知道,什么是ROS,什么是Gazebo,什么又是Sim_time等等,其实当时坚持了两周没有一点头绪时组内就不想接着做下去了,有这些时间背几个abandon也是好的,幸好有一天,我们装好系统了,这么点成就也足以成为我们继续做下去的动力。
钉钉群内交流
钉钉群是组委会赛前培训比赛内容,发布比赛规则,解决参赛选手问题的群聊,但是并不会在我们存在问题的时候去指导怎么做,我为自己和组内另一位同学配置完两套系统,(防止赛时我的电脑崩溃,作备用)可以说一样的电脑存在的问题并不相同,所以在群内的error问题和bug问题,组委会是不可能为我们解决的,而且这种也保证了比赛的公平性,当时感觉很无奈,现在想想确实考验参赛选手的各方面素质。
这是摘取的群内部分聊天,可以看到,包括我在内的很多人都存在问题,他们与我分别来自省内的21所大学,我也通过这次比赛结识了许多志同道合的同学。
安装系统
整体的运行环境要在虚拟机上进行,要下载的有VMware,其次是ubuntu,组委会在培训时使用的版本是16.04,但是对于比赛的ubuntu版本不作限制,经过大量版本对比查阅后我们下载了较新版本的20.04,之后就是安装机器人操作系统ROS,最后便是Gazebo和Rviz(如下图标),最后导入组委会提供的小车模型,赛道模型和基本参数。
组委会赛道模型
赛道模型并不复杂,采用“去”“回”模式,也就是对称模型 ,但是对于代码控制的仿真车来讲便是个问题了,组委会禁止向小车发送实时位置坐标,刚开始我还不理解为什么要这么限制,后续做出点眉目的时候才明白,向小车实时发布坐标就等同于上帝视角,驾照都应该学过,如果给我们上帝视角去考试,会有人挂科吗?所以取消这种做法做出来的小车便具有不确定性,我最终最出来的小车在比赛的时间也是在限定五分钟内重跑了一次,庆幸第二次跑成功了,最终公布的成绩单中时间是1分28秒。
绘制赛道
做好环境配置工作后,需要绘制小车运行的地图。
绘制过程中需要手动控制按键WASD,待小车走完全图,地图建立完毕。
地图建立后,需要保存,保存默认在主文件夹,需要将地图放置到工程中的map文件夹下。保存命令为
rosrun map_server map_saver -f test_map//“test_map”是地图名
启动Gazebo,Rviz命令
roslaunch bringup racecar_gazebo_rviz.launch
输入上方命令时,Rviz里没有地图,需要输入地图命令。
运行小车地图命令
roslaunch bringup move_base.launch
源代码下载链接
链接: https://download.csdn.net/download/CauchyKAI/87319786.
小车运行视频成果展示
链接: https://www.bilibili.com/video/BV1zM41127uA/?vd_source=e1a731dd19e7c02baaa22bc85db8648c.
小车三维模型代码
小车的初始位置不能改变!!!
x=-0.5;
y=0.0;
z=0.0;
racecar.launch
<?xml version="1.0"?>
<launch>
<!-- 设置launch文件的参数 -->
<arg name="paused" default="false"/>
<arg name="use_sim_time" default="true"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
<!--模型车的位置不能修改-->
<arg name="x_pos" default="-0.5"/>
<arg name="y_pos" default="0.0"/>
<arg name="z_pos" default="0.0"/>
<!--运行gazebo仿真环境-->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="debug" value="$(arg debug)" />
<arg name="gui" value="$(arg gui)" />
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="headless" value="$(arg headless)"/>
<arg name="world_name" value="$(find racecar_gazebo)/worlds/racetrack.world"/>
<!-- 此处改成参赛者放置.world文件的地址-->
</include>
<!-- 加载机器人模型描述参数 -->
<param name="robot_description" command="$(find xacro)/xacro --inorder '$(find racecar_description)/urdf/racecar.urdf.xacro'"/>
<!--运行joint_state_publisher节点,发布机器人关节状态-->
<node name = "robot_state_publisher" pkg = "robot_state_publisher" type = "state_publisher">
<param name="publish_frequency" type="double" value="20.0" />
</node>
<!-- 在gazebo中加载机器人模型-->
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="-urdf -model shcrobot -param robot_description -x $(arg x_pos) -y $(arg y_pos) -z $(arg z_pos)"/>
</launch>
camera.xacro
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="camera">
<link name="camera_link">
<inertial>
<mass value="0.001" />
<origin xyz="0 0 0" />
<inertia ixx="0.001" ixy="0.0" ixz="0.0"
iyy="0.001" iyz="0.0"
izz="0.001" />
</inertial>
<visual>
<origin xyz=" 0 0 0 " rpy="1.57 0 1.57" />
<geometry>
<mesh filename="package://racecar_description/meshes/S1030-0315.dae" scale="0.1 0.1 0.1" />
</geometry>
</visual>
<collision>
<origin xyz="0.0 0.0 0.0" rpy="0 0 0" />
<geometry>
<box size="0.03 0.16 0.03" />
</geometry>
</collision>
</link>
<gazebo reference="camera_link">
<material>Gazebo/Black</material>
</gazebo>
<gazebo reference="camera_link">
<sensor type="camera" name="camera_node">
<pose>0 0 0 0 0 0</pose>
<update_rate>30.0</update_rate>
<camera name="head">
<horizontal_fov>1.3962634</horizontal_fov>
<image>
<width>1280</width>
<height>720</height>
<format>R8G8B8</format>
</image>
<clip>
<near>0.02</near>
<far>300</far>
</clip>
<noise>
<type>gaussian</type>
<mean>0.0</mean>
<stddev>0.007</stddev>
</noise>
</camera>
<plugin name="gazebo_camera" filename="libgazebo_ros_camera.so">
<alwaysOn>true</alwaysOn>
<updateRate>0.0</updateRate>
<cameraName>/camera</cameraName>
<imageTopicName>image_raw</imageTopicName>
<cameraInfoTopicName>camera_info</cameraInfoTopicName>
<frameName>camera_link</frameName>
<hackBaseline>0.07</hackBaseline>
<distortionK1>0.0</distortionK1>
<distortionK2>0.0</distortionK2>
<distortionK3>0.0</distortionK3>
<distortionT1>0.0</distortionT1>
<distortionT2>0.0</distortionT2>
</plugin>
</sensor>
</gazebo>
</robot>
imu.xacro
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="imu">
<xacro:macro name="imu" params="prefix:=imu">
<!-- Create laser reference frame -->
<link name="${prefix}_link">
<inertial>
<mass value="0.001" />
<origin xyz="0 0 0" />
<inertia ixx="0.001" ixy="0.0" ixz="0.0"
iyy="0.001" iyz="0.0"
izz="0.001" />
</inertial>
<visual>
<origin xyz=" 0 0 0 " rpy="0 0 0" />
<geometry>
<box size="0.04 0.04 0.03" />
</geometry>
<material name