前言

  从现在起我将会分享我在做讯飞智能车线下赛的一些心得体会啦,顺便记录一下我这一次比赛的过程。我也是刚拿到车,所以进度可能会有些慢,有什么好的建议希望大家可以一起讨论分享。

正文

  经过老久老久的等待我们的车终于到了,大中午睡着午觉被快递打电话叫醒,火急火燎的去拿了快递。不得不说,确实很帅!

根据教程烧录好程序以及测试完成后,正式开始艰苦的调车生涯(爷青回)

主从机配置

  我看群里有不少人反应主从配置有问题,从机无法向主机发送控制信号或者是无法获取主机发布的消息。我将我配置的方法分享一下,经过测试我这边是没问题的,可以对小车进行控制。设置小车为主机,PC端为从机。

  首先,分别在两个设备终端输入hostname。小车的hostname为ucar-mini,PC端为lzw-Lenovo-Legion-R7000-2020(每个人不一样)。现在将小车和PC端连接到同一局域网内,并且终端输入ifconfig获取ip地址。

可以看到我的PC的ip地址为192.168.0.152,小车端也进行同样操作获取小车的IP地址。获取完地址后,两端分别打开bashrc,输入

export ROS_HOSTNAME=本机IP
export ROS_MASTER_URI=http://主机IP:11311

也就是说主机端,这俩IP地址是相同的,从机端master的地址为主机的IP,hostname为本机的IP地址。

  其次,两端分别打开/etc/hosts 文件,若没有修改权限,先输入 sudo chmod +777 hosts 修改权限。注意,这里建议主机从机都要将对方的IP hostname添加到自己的/etc/hosts 中,如果不填加,将无法反向控制。如:主机的hosts文件中没有添加从机的信息,从机只能接收到从主机发来的信息,而无法向主机发送信息。

上图为从机的hosts,主机的hosts只需将ucar-mini那一行改为从机的IP以及hostname即可。设置完以后通过小乌龟的例子进行测试。主机端打开

roscore
rosrun turtlesim turtlesim_node 

从机打开键盘控制,通过键盘控制主机端的小乌龟,如果可以控制这说明配置成功。

测试

  配置完小车以后,开始第一步测试工作,开启小车连接wifi以后,PC端终端输入 ssh ucar@IP地址 ,输入密码后(初始密码一般为ucar)远程连接小车。小车端输入

roslaunch ucar_controller base_driver.launch

开启底盘。很多人没有开启底盘就发布cmd的topic,所以小车才不会运动。开启后发布

rostopic pub -r 20 /cmd_vel geometry_msgs/Twist "linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 1.0"

小车会自转则表示测试成功。

建图

  测试完成以后,咱们就开始建图了。小车终端输入  

roslaunch ucar_map ucar_mapping.launch

PC端输入

rviz

并且add雷达数据 tf树的数据以及map数据。

开启键盘控制使小车建图,建图的时候尽量避免小车自转,倒退,停止,使小车的线路连续,建图的效果会更好点。

  经过多种建图方法的实际测试,其实这里更推荐使用gmapping算法,效果要更好点,因为在参数不知道怎么调整的情况下,gmapping的默认效果还是好点的。具体包的配置自行查阅。

ps:另辟蹊径方法:在gazebo或者sw里建好地图,然后仿真的方法将图建好,这样的图片效果是最好的,但是比赛要不要现场建图就不得而知了。

导航

    地图建好后,就开始我们的导航步骤了。我这里使用的是teb算法,我看有不少TEB选手已经背叛选择DWA了,TEB最后的荣耀由我来守护!首先我们打开ucar_navigation.launch 将里面的DWA改为TEB,具体改动代码如下。

<launch>

  <!-- Run the map server -->
   
  <include file="$(find ucar_controller)/launch/base_driver.launch" > </include>

  <include file="$(find ydlidar)/launch/ydlidar.launch" > </include>

  <node name="map_server" pkg="map_server" type="map_server" args="$(find ucar_nav)/maps/map_418_002.yaml" output="screen">
   <param name="frame_id" value="map" />
  </node> 

<!-- <param name="base_global_planner" value="voronoi_planner/VoronoiPlanner"/>  -->

  <include file="$(find ucar_nav)/launch/config/amcl/amcl_omni.launch" > </include>
  <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 ucar_nav)/launch/config/move_base/costmap_common_params.yaml" command="load" ns="global_costmap" />
    <rosparam file="$(find ucar_nav)/launch/config/move_base/costmap_common_params.yaml" command="load" ns="local_costmap" />
    <rosparam file="$(find ucar_nav)/launch/config/move_base/global_planner_params.yaml" command="load" />

    <!--rosparam file="$(find ucar_nav)/launch/config/move_base/dwa_local_planner_params.yaml" command="load" /-->

    <rosparam file="$(find ucar_nav)/launch/config/move_base/teb_local_planner_params.yaml" command="load" />
    <rosparam file="$(find ucar_nav)/launch/config/move_base/local_costmap_params.yaml" command="load" />
    <rosparam file="$(find ucar_nav)/launch/config/move_base/global_costmap_params.yaml" command="load" />

    <param name="base_global_planner" value="global_planner/GlobalPlanner" />
    <param name="planner_frequency" value="10" />
    <param name="planner_patience" value="15" />
    <!--param name="use_dijkstra" value="false" /-->
    <param name="base_local_planner" value="teb_local_planner/TebLocalPlannerROS" />
    <param name="controller_frequency" value="10.0" />
    <param name="controller_patience" value="10.0" />
    <param name="clearing_rotation_allowed" value="false" />
  </node>



</launch>

小车运行此launch文件后,在PC端打开rviz加载地图,雷达等需要的参数。点击2D Pose Estimate设置小车初始位置,并且将其保存在amcl文件里,就不用每次都设置了。

<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="initial_pose_x"            value="$(arg initial_pose_x)"/>
  <param name="initial_pose_y"            value="$(arg initial_pose_y)"/>
  <param name="initial_pose_a"            value="$(arg initial_pose_a)"/>

  <!-- <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="true"/>  
  <!-- //设置为false阻止amcl发布全局坐标系和里程计坐标系之间的tf变换 -->
</node>
</launch>

设置完成以后发布目标点即可导航。

待解决的问题

1:定位不准确,在跑的过程中会出现里程计偏移导致路线规划失败。后续可能会加入多传感器融合(刚好这门课的汇报有了~)

2:TEB参数还需调整

3:语音和视觉后续将加入

4:可能会对全局路径进行平滑处理。

总结

    个人觉得本次比赛的难点就在定位是否准确以及车子姿态导致图像的畸变处理问题,剩下俩月主攻这些。不定时更新我的做车进度以及自己的一些想法,希望一起探讨,希望可以国赛见。放一段我小车第一次跑的视频,参数和线上赛基本上没有变化,就改了一下速度。 ps:西部赛区大佬别卷了。