智能车竞赛——室外光电创意组仿真之脱缰的野马

1282
41
2020年5月7日 17时58分

一、前言

 

操作系统:ubuntu16.04

ROS版本:kinetic

Gazebo版本:7.0.0

本文介绍在MIT的racecar模型基础上搭建slam,仿真实现2019年室外光电创意组比赛。

 

二、效果

 

 

 

 

三、准备工作

 

3.1安装仿真环境

 

参考教程:北邮智能车仿真培训(一)—— 安装仿真环境

 

3.2 创建工作区间

 

mkdir -p ~/racecar_ws/src

cd ~/racecar_ws/src

catkin_init_workspace

git clone https://github.com/xmy0916/racecar.git

cd ..

catkin_make

 

 

创建成功如下:

 

p2

 

 

四、仿真介绍

 

4.1 阿克曼模型介绍

 

这个其实也没什么高大上的,就是我们常见的车模的样子,通过舵机改变前面两个转向轮的方向,后面的驱动轮方向始终不变,模型如下图(图片原文:http://www.rcfans.com/bbs/forum.php?mod=viewthread&tid=358236&ordertype=1 ):

 

p3

 

其中阿克曼角就是图中的 b – a,当阿克曼角越接近0的时候车子最适合漂移(老司机划重点),这种模型的设计就是为了让汽车在转向的过程中更加顺滑。而我们室外光电的车模就是基于这种车辆模型,但是钢铁侠官方给的驱动方式是差速控制,显然不是最合理的控制手段。

 

4.2 仿真文件介绍

 

4.2.1 racecar_contrl文件夹

这个文件主要是配置了车辆的关节运动,为什么说关节呢,这里设计racecar转向其实和机械臂的关节设计是一样的,他们的类型都是joint_state_controller

 

4.2.2 racecar_contrl/config文件夹

这个是关节参数的具体配置文件,里面有转向PID的参数配置,仿真其实就实际一样的。常用的舵机转向相当于是自带了位置环所以我们一般不去设计他的PID;但是仿真的转向没有位置环,因为我们是仿真世界的主人,我们可以知道关节转动了多少角度,也能控制转向速度,所以用角度作为反馈来控制转向速度从而让关节快速的转到我们所需要的角度,所以这里就必须配置关节的PID了,具体实现gazebo已经帮我们做好了,只要自己调参数就行。

 

4.2.3 racecar_contrl/launch文件夹

这个是配置了一些关节控制的启动文件。

 

4.2.4 racecar_contrl/scripts文件夹

这里面存放了一些控制的脚本,可以直接运行keyboard_teleop.py就可以控制小车运动。

 

4.2.5 racecar_description文件夹

这个是整个车模的描述文件夹,含有小车的xacro模型文件,和场地的模型文件,还有场地外观的材料文件。

 

4.2.6 racecar_gazebo文件夹

gazebo有关的文件

 

4.2.7 racecar_gazebo/config文件夹

里面是slam的配置文件,以及rviz启动的文件,gazebo文件夹下其他几个文件夹类似就不累述了

 

4.2.8 system文件夹

这里面主要用上的就是阿克曼消息的转换,文件中还有一些与硬件有关的驱动

 

五、启动仿真

 

5.1 使能环境变量:

echo "source ~/racecar_ws/devel/setup.bash" >> ~/.bashrc

source ~/.bashrc

 

5.2 启动地图:

roslaunch racecar_gazebo racecar_runway.launch

 

p4

 

六、建图

 

6.1 启动slam和rviz:

roslaunch racecar_gazebo slam_gmapping.launch

 

p6

 

6.2 控制车辆(左侧有个控制窗口,图标是问号点开),WASD控制前左后右的运动就可以建图了:

 

p7

 

p8

 

大家建图可以把锥桶先删了在建图的时候!!!

 

6.3 保存地图:

rosrun map_server map_saver -f ~/racecar_ws/src/racecar_gazebo/map/map_runway

 

p10

 

6.4 关闭建图:

ctrl + c关闭所有窗口

 

七、导航

 

7.1 启动导航和环境地图:

roslaunch racecar_gazebo racecar_runway_navigation.launch

 

7.2 启动rviz:

roslaunch racecar_gazebo racecar_rviz.launch

 

p11

 

7.3 用2D Nav Goal发布目标:

 

p12

 

7.4 启动导航脚本

rosrun racecar_gazebo path_pursuit.py

或者

cd ~/racecar_ws/src/racecar_gazebo/scripts

python path_pursuit.py

 

p13

 

开始导航!

 

八、总结

 

本文完整源代码地址:github.com/xmy0916/racecar

 

感谢古月居老师邀请写这个教程,室外光电创意组的至此全部完成,当然大家直接git clone下来的工程运行起来没什么难度……在MIT的github官网只有车辆的gazebo文件没有配置amcl和gmapping,自己配置一遍参数才知道过程是多么的艰辛,之前在网上看到有2019年参加过室外光电创意组的同学实现了这个仿真,但是没有开源教程和代码,我自己费劲千辛万苦弄了三四天才搭建好完整的框架开源给大家,点个赞支持下呗~后续会推出其他组别(除了电磁组)的阿克曼车模仿真教程

 


九、后文

 

介绍下怎么自己场地建模

 

ground

 

9.1 ctrl + alt + t打开新的终端输入命令打开空的gazebo:

gazebo

 

9.2 点击左上角的Edit选择Building Edit:

 

p1

 

9.3 点击Create Walls下面的Wall:

 

p2

 

9.4 根据场地模型在白色区域绘制地图(我这里画过了就随便画下):

 

p3

 

9.5 画完后点击左上角的File选择save as:

 

p4

 

9.6 修改名字runway,路径随便放一个先:

 

p5

 

9.7 可以看见对应目录下有了模型的描述文件:

 

p6

 

9.8 重启gazebo,点击左上角的Insert可以看到刚刚建立的模型,点击一下拖到gazebo中:

 

p7

 

9.9 这里最好把坐标轴放到我们车的起点,如图画圈处(不改也没关系,可以在启动文件里定义车模的坐标):

 

p8

 

9.10 插入锥桶,点击Insert选择Construction Cone拖入gazebo(如果没下载锥桶模型,参考这里:下载教程):

 

p10

 

9.11 保存世界文件,点击左上角File选择Save World As放在刚才的目录下叫runway_world.world就行:

 

p11

 

9.12 文件内容如下:

 

p12

 

 

发表评论

后才能评论

评论列表(41条)

  • thuur_8070 2020年5月29日 下午11:42

    老师您好,请问导航2Dgoal点击后,运行python文件,小车不动,导航的终端中出现这个错,Failed to create the teb_local_planner/TebLocalPlannerROS planner,怎么解决呢?是要安装一个teb的包吗?这个怎么安装,麻烦帮忙看下可以吗?

    • 布剪刀石头 回复 thuur_8070 2020年5月30日 下午4:45

      没碰到过哦自己百度百度吧试试sudo apt-get install ros-kinetic-teb-local-planner ?

  • m1hfb_7518 2020年5月20日 下午3:57

    请问导航时小车的速度应该怎么控制呢?不知道什么原因我在导航时小车运动得特别慢,跑完全程大概需要8、9分钟的样子……

    • 布剪刀石头 回复 m1hfb_7518 2020年5月20日 下午10:30

      不该吧….我上传的代码跑完就50s最多了

    • 布剪刀石头 回复 m1hfb_7518 2020年5月21日 上午12:23

      你可以检查下你电脑gazebo底下有一个仿真时间和实际时间的比例系数,可能是你电脑性能不行,程序里已经写好了寻线的代码,你可以自己参考的修改参数新增算法,我也就是帮你弄了个仿真平台,怎么提速是你自己的事,这不就是比赛的目的么。。。。。。

    • m1hfb_7518 回复 布剪刀石头 2020年5月21日 下午1:22

      好的,感谢,我再看着找一下问题。

  • Sunny 2020年5月17日 上午9:10

    老师,我想问一下在下载并成功编译您的源码后,在启动gazebo地图时报了几个这种形式的错误:
    [ERROR]: Could not load controller ‘joint_state_controller’ because controller type ‘joint_state_controller/JointStateController’ does not exist.
    [ERROR] : Use ‘rosservice call controller_manager/list_controller_types’ to get the available types
    [ERROR]: Failed to load joint_state_controlle
    并且在控制窗口点击WASD后gazebo和rviz的模型并没有动作,我在用echo看/racecar/left_front_wheel_velocity_controller/command等控制消息时发现其中的内容是可以正常变化的,但好像并没有成功接收到。
    非常希望和感谢老师能帮忙解惑!!!

    • 布剪刀石头 回复 Sunny 2020年5月17日 下午1:50

      重新git clone下代码,然后controller报错有关参考github工程下的readme文件有解决办法:https://github.com/xmy0916/racecar,可以关注下github仓库代码的更新和说明文件

    • Sunny 回复 布剪刀石头 2020年5月17日 下午2:39

      好的,多谢!!!问题已经解决了,但是readme解决方案的两句指令好像有点问题,说定位不到软件包,我是通过这两句解决的:
      sudo apt-get install ros-kinetic-effort-controllers
      sudo apt-get install ros-kinetic-joint-state-controller

    • 布剪刀石头 回复 Sunny 2020年5月17日 下午4:42

      可能我敲错了,有空再改过来

  • 3o481_1608 2020年5月15日 下午12:50

    老师您好,源码编译后报错racecar_ws/src/racecar-master/racecar_gazebo/src/findLine.cpp:7:43: fatal error: ackermann_msgs/AckermannDrive.h: No such file or directory
    compilation terminated.
    racecar-master/racecar_gazebo/CMakeFiles/findLine.dir/build.make:62: recipe for target ‘racecar-master/racecar_gazebo/CMakeFiles/findLine.dir/src/findLine.cpp.o’ failed
    make[2]: *** [racecar-master/racecar_gazebo/CMakeFiles/findLine.dir/src/findLine.cpp.o] Error 1
    CMakeFiles/Makefile2:4029: recipe for target ‘racecar-master/racecar_gazebo/CMakeFiles/findLine.dir/all’ failed
    make[1]: *** [racecar-master/racecar_gazebo/CMakeFiles/findLine.dir/all] Error 2
    Makefile:138: recipe for target ‘all’ failed
    make: *** [all] Error 2
    Invoking “make -j12 -l12” failed
    为什么会找不到头文件呢,devel/ackermann_msgs下有头文件

    • 3o481_1608 回复 3o481_1608 2020年5月15日 下午2:38

      老师已解决编译问题,现在是没有在建图时候rviz地图信息

    • 布剪刀石头 回复 3o481_1608 2020年5月15日 下午7:30

      rviz打开后拖到左上角找找?我这里是有的,参考此博客第六节第一张图

    • 布剪刀石头 回复 3o481_1608 2020年5月15日 下午7:32

      实在建不了直接用我留在工程里面的map目录下的图呗,反正都一样的

    • 布剪刀石头 回复 3o481_1608 2020年5月16日 下午3:09

      抱歉,前段时间在忙毕设,弄之前写四轮的博客把激光雷达给关了。。。所以收不到雷达数据建不了图。。。。~/racecar_ws/src/racecar_description/urdf/racecar.gazebo在这个文件中61行改成false即可。。。我傻逼了

  • ukq26_6484 2020年5月12日 上午10:59

    老师您好,请问一下我在melodic运行这个为什么无法建图,topic里面有image的信息,却没有laser的相关话题

    • 布剪刀石头 回复 ukq26_6484 2020年5月13日 上午12:20

      抱歉,不清楚哦,我用的是kinetic的ros

    • 布剪刀石头 回复 布剪刀石头 2020年5月16日 下午3:10

      抱歉,前段时间在忙毕设,弄之前写四轮的博客把激光雷达给关了。。。所以收不到雷达数据建不了图。。。。~/racecar_ws/src/racecar_description/urdf/racecar.gazebo在这个文件中61行改成false即可。。。我傻逼了

  • 57m6q_1097 2020年5月10日 下午10:20

    老师您好,我用了您的模型跑了一下hectorslam建图,能够建图,但是小车在rviz中不同位置一直闪烁,我的hector代码的base_frame 和odom_frame的值都给的是base_link,会是这个设置的问题吗?能否请您帮忙解答一下,非常感谢🙏!!!!

    • 布剪刀石头 回复 57m6q_1097 2020年5月11日 上午11:33

      抱歉,没有研究过

    • 布剪刀石头 回复 57m6q_1097 2020年5月17日 下午1:52

      我最近看一些资料看到如果你建图的同时开启了amcl就会有两个定位信息,从而导致小车在rviz闪烁的问题,仅供参考

    • 布剪刀石头 回复 57m6q_1097 2020年5月17日 下午1:55

      我代码里面写了两个launch文件一个是开启仿真环境不开启导航功能(racecar_runway.launch),这是给建图用的,还一个是开启导航和仿真环境这个是给自主导航用的,你是不是启动了racecar_gazebo包下的racecar_runway_navigation.launch文件建图呢?

    • 57m6q_1097 回复 布剪刀石头 2020年5月20日 下午12:12

      问题已经解决了,是因为hectormapping 和gazebo odometry node 都发布了baselink➡️map的变换,把后面的那个节点关掉就好啦,谢谢您啦~还有个问题想请教一下,我启动了navigation的launch文件,想在rviz看amcl定位的粒子云怎么配置呢?posearray配置的时候没有找到粒子云话题呀。

    • 布剪刀石头 回复 57m6q_1097 2020年5月21日 上午12:27

      rviz中点击ADD添加PoseArray,然后勾选对应的话题试试,然后保存rviz配置

    • 布剪刀石头 回复 57m6q_1097 2020年5月21日 上午12:29

      如果没有的话你看看修改下hukoyu激光雷达的gazebo配置添加对应的话题啥的,参考你用过的有粒子云话题的配置文件看看有啥不一样的地方

    • 布剪刀石头 回复 57m6q_1097 2020年5月21日 上午12:40

      我看了rviz打开是有的呀,话题是这个:/move_base/TebLocalPlannerROS/teb_poses,虽然我不太懂这个是干嘛用的

    • 57m6q_1097 回复 布剪刀石头 2020年5月21日 上午11:09

      我打开了那个,好像是沿着路径规划的位姿,我想看到amcl的全局定位的过程,但是找不到粒子云的话题……

    • 57m6q_1097 回复 布剪刀石头 2020年5月21日 下午12:18

      我看tf里面没有发布Odom
      ➡️Map的变换,老师您导航程序里有配置amcl吗

    • 布剪刀石头 回复 57m6q_1097 2020年5月21日 下午12:39

      没有哦

    • 57m6q_1097 回复 布剪刀石头 2020年5月21日 下午5:06

      老师,我刚刚启动了known map localization的launch文件,里面是amcl定位,请问为什么在rviz里posearray选中粒子云话题但是没显示粒子呢?

    • 布剪刀石头 回复 57m6q_1097 2020年5月21日 下午5:14

      那不是我写的哦这你估计得去mit racecar的github的issue里问问了,或者你自己研究研究吧

    • 57m6q_1097 回复 布剪刀石头 2020年5月21日 下午5:51

      好的,谢谢你啦

  • vr4r5_8851 2020年5月10日 下午3:09

    老师,你好,雷达信息为什么无法在rviz上显示啊,就是无法建图了?还有启动gazebo以后,那些蓝色的激光扫描线怎么设置啊?非常感谢你能回答

    • vr4r5_8851 回复 vr4r5_8851 2020年5月10日 下午3:12

      已经查了好多资料,用了几种方法还是无法解决,哎

    • 布剪刀石头 回复 vr4r5_8851 2020年5月10日 下午4:27

      蓝色激光被我关了,你可看github上我的commit日志那个关闭gazebo激光的文件里面找找一个参数改成true就行了

    • vr4r5_8851 回复 vr4r5_8851 2020年5月10日 下午4:40

      好的,当时也看到了那个,但是没注意,一直以为是雷达的事,还找了hokuyo的源码,对比了一下,害

    • ukq26_6484 回复 vr4r5_8851 2020年5月12日 上午10:56

      请问一下你的能建图了吗?我的打开之后可以有image,但是topic里面没有关于laser的,rviz里面也没有地图信息

    • 布剪刀石头 回复 ukq26_6484 2020年5月16日 下午3:10

      抱歉,前段时间在忙毕设,弄之前写四轮的博客把激光雷达给关了。。。所以收不到雷达数据建不了图。。。。~/racecar_ws/src/racecar_description/urdf/racecar.gazebo在这个文件中61行改成false即可。。。我傻逼了

  • 古月光翟氵青 2020年5月10日 上午1:02

    老师您好,我用你的源代码试了试,启动slam建图命令roslaunch racecar_gazebo slam_gmapping.launch之后,rviz启动不正常,左侧显示Global Status: Error,界面和文章中roslaunch racecar_gazebo slam_gmapping.launch这句命令正下方第一张图片一样,命令行中会提示以下内容:
    [ERROR] [1589043509.799348316, 844.477000000]: PluginlibFactory: The plugin for class ‘rtabmap_ros/MapGraph’ failed to load. Error: According to the loaded plugin descriptions the class rtabmap_ros/MapGraph with base class type rviz::Display does not exist. Declared types are moveit_rviz_plugin/MotionPlanning moveit_rviz_plugin/PlanningScene moveit_rviz_plugin/RobotState moveit_rviz_plugin/Trajectory rviz/Axes rviz/Camera rviz/DepthCloud rviz/Effort rviz/FluidPressure rviz/Grid rviz/GridCells rviz/Illuminance rviz/Image rviz/InteractiveMarkers rviz/LaserScan rviz/Map rviz/Marker rviz/MarkerArray rviz/Odometry rviz/Path rviz/PointCloud rviz/PointCloud2 rviz/PointStamped rviz/Polygon rviz/Pose rviz/PoseArray rviz/PoseWithCovariance rviz/Range rviz/RelativeHumidity rviz/RobotModel rviz/TF rviz/Temperature rviz/WrenchStamped rviz_plugin_tutorials/Imu
    可以在Gazebo中控制小车,但是在Rviz中显示不了,请问应该如何解决呢?谢谢老师

    • 布剪刀石头 回复 古月光翟氵青 2020年5月10日 下午1:10

      应该是我之前保存的rviz的一些配置无效,rviz不会显示小车。不影响建图呀……我就没改了,你可以自己打开空的rviz然后生成新的.rviz文件然后看你想要啥功能就打开啥功能

    • 布剪刀石头 回复 古月光翟氵青 2020年5月17日 下午1:57

      显示问题已经修复了,可以git clone下载代码,原因是我保存的rviz配置文件和提供的仿真包不匹配,话题的名字多了/racecar