1 准备工作
本小车使用了 ROS1 Melodic 中的主从机通讯,机器人被设置为了主机(master),可以在同局域网下的从机(slave)中订阅或者发布ROS数据。其简要思想如下:
因此,需要连接树莓派 / Nvidia / 工控机 的 WiFi 热点,然后参照《02-视觉套餐/02-ROS主从机网络配置》完成ROS网络配置。随之带来两个对新手比较棘手的问题,本地主机使用:双系统 Win + ubuntu 还是虚拟机 Win + ubuntu 。如果是使用虚拟机的话,我们配套的资料里面有一份,需要自行参照资料《02-视觉套餐/01-虚拟机网络配置》配置虚拟机网络。
对于初次接触小阿克曼的同学来说有点陌生,这里将整个小车的架构做一个描述如下图:
解释:
上位机 :树莓派 或者 Jetson nano 或者 工控机等;
下位机:由 Arduino mega 2560 + 自研扩展板 + 电机 + 舵机 + 灯光 + 航模遥控 + 云台等构成的综合体;
电源充放电:
电源开关:目前整车电源来自3节18650电池串联构成12.6 v 电源,电源由一枚单刀双置开关构成,开关一端导通整车电源,另外一端导通充电电路;
电源充电:使用 12.6V / 1A 防过冲充电器充电,充电时需将单刀双置开关掰到充电电路一侧,此时整车断电,充电器显示红灯,充满之后会显示绿灯;
Jetson nano 有配备额外的 12V / 5A 充电器,方便小车在充电的时候,也可以使用机器人主机。
Raspberry Pi 则需要有 5V / 2.5A 的电源,比较常见,默认没有额外配置。
打开本地ubuntu,连接机器人主机的 Wifi ,可以是树莓派或者是 Jetson nano 均可,只是两者的ip段不一致,示意图如下:
附带程序中的代码文件 :
代码:
Local_PC/catkin_ws : 放置在本地端 ubuntu 的 home 目录下;
Robot_PC/catkin_ws : 放置在机器人主机的 home 目录下;
2 通过 cmd_vel 控制小车移动
在本地 ubuntu 中打开两个终端。
1.第一个终端
ssh cooneo@10.42.1.1 # 以Nvidia 设备为例 密码 cooneo
cd catkin_ws
catkin_make -j # 编译程序
source devel/setup.bash # source 工作空间
roslaunch ros_arduino_python arduino.launch
2.第二个终端
rosrun rqt_robot_steering rqt_robot_steering
# 如果提示找不到的话,需要安装一个这个包
sudo apt-get install ros-melodic-rqt-robot-steering
在弹出的面板中,两个进度条分别表示控制小车前进倒退的线速度和转弯的角速度:
3 云台+摄像头跟随
在本地 ubuntu 中打开两个终端。
1.第一个终端
ssh cooneo@10.42.1.1 # 以Nvidia 设备为例 密码 cooneo
cd catkin_ws
source devel/setup.bash # source 工作空间
roslaunch ros_arduino_python arduino.launch
2、第二个终端
ssh -X cooneo@10.42.1.1 # 以Nvidia 设备为例 密码 cooneo
cd catkin_ws
source devel/setup.bash # source 工作空间
roslaunch linetrack balltrack_color.launch
然后将绿色小球放到机器人云台摄像头前面,云台就会在一定范围内跟随移动。
默认是跟踪绿色,代码里面还提供了红色、黄色、绿色物体跟踪所需的 HSV 空间范围值。
4 基于颜色的火焰识别
在本地 ubuntu 中打开两个终端。
1.第一个终端
ssh cooneo@10.42.1.1 # 以Nvidia 设备为例 密码 cooneo
cd catkin_ws
source devel/setup.bash
roslaunch fire_detect fire_detect.launch
2. 第二个终端
cd catkin_ws # 没有这个目录的话,记得将附带代码文件中的 Local_PC/catkin_ws 放置在本地 ubuntu 的 home 目录下
catkin_make -j # 编译程序
source devel/setup.bash
roslaunch remote_gmapping joy_fire_detect.launch
当有火焰靠近的时候,程序会根据设定的火焰的颜色和大小,自行识别:
需要注意的是,在弹出的 rqt_image_view 工具中,需要手动调整左上方的订阅话题名 处,然后选择: fire_detect_image/Compressed ,才会有对应的视频显示。
5 摄像头巡线
打开三个终端:
1. 第一个终端
ssh cooneo@10.42.1.1 # 以Nvidia 设备为例 密码 cooneo
cd catkin_ws
source devel/setup.bash
roslaunch ros_arduino_python arduino.launch
将车放置到我们的赛道上,摄像头朝向车道中线(黄色)
2. 第二个终端
ssh cooneo@10.42.1.1 # 以Nvidia 设备为例 密码 cooneo
cd catkin_ws
source devel/setup.bash
roslaunch linetrack linetrack_color.launch
运行之后,云台摄像头会自动朝下转动固定角度,使得摄像头对准前方赛道。
6 纯激光雷达建图
在本地 ubuntu 打开三个终端:
1. 第一个终端
# ssh
ssh cooneo@10.42.1.1 # 以Nvidia 设备为例 密码 cooneo
cd catkin_ws
source devel/setup.bash
roslaunch mini_gmapping hector_mapping.launch
2. 第二个终端
cd catkin_ws # 没有这个目录的话,记得将附带代码文件中的 Local_PC/catkin_ws 放置在本地 ubuntu 的 home 目录下
catkin_make -j
source devel/setup.bash
rosrun remote_gmapping joy_gmapping.launch
然后会在本地端弹出如下所示的窗口:
接下来就可以通过控制面板上面的进度条,控制小车前进倒退,左转右转啦,需要注意的是,建图的过程中,记得以比较慢和均匀的速度进行。
另外:需要检查 rqt_robot_steering 这个功能包界面的速度话题名字,上图中是:“ joy_teleop/cmd_vel ” 需要修改为:cmd_vel ,否则车动不了哟。
3. 第三个终端(保存地图)
# ssh
ssh cooneo@10.42.1.1 # 以Nvidia 设备为例 密码 cooneo
cd catkin_ws/src/mini_gmapping/map/
rosrun map_server map_saver -f hector_map # hector_map 是保存的地图的名字。
# 随后在该路径下会产生 两个文件 ,分别是 地图文件(hector_map.pgm) 和 地图描述文件(hector_map.yaml)
上述保存的地图将在后续导航的时候,作为先验地图加载进 ROS movebase 中。
4. rf2o_laser_odometry 激光里程计 + gmappig 建图
# ssh
ssh cooneo@10.42.1.1 # 英伟达主机,密码是:cooneo
# cd 进ROS 工作空间
cd catkin_ws
source devel/setup.bash
roslaunch mini_gmapping laser_odom_gmapping.launch
5. 紧接着,在本地运行 建图实时查看程序,和上面方法一样:
# 打开虚拟机中的一个终端
cd catkin_ws
source devel/setup.bash
roslaunch remote_gmapping joy_gmapping.launch
参考推文
7 纯激光雷达导航
在 ubuntu 本地端,打开两个终端:
1. 第一个终端
# ssh 进jetson nnao
ssh cooneo@10.42.1.1 # 输入密码为 cooneo
cd catkin_ws
catkin_make #只需要编译一次
source devel/setup.bash
roslaunch mini_navigation navigation_steer_mini_sensors_rf2o.launch
这个 launch 文件会默认会加载之前的 hector_map 作为先验地图。
2. 第二个终端
#在终端中 打开本地 catkin_ws
cd catkin_ws
source devel/setup.bash
roslaunch remote_gmapping joy_navigation.launch
需要注意的是:
运行导航程序之前,需要将小车放置到建图时候的起始位置和朝向,这个是导航程序中默认的位置设定,后续小车慢慢移动起来之后,amcl会起作用,激光雷达点云会逐渐和之前建好的地图重合。
上图中,红色点云是激光雷达实时的测距信息可视化;
上图中,一共有三个地图层 map,如上图左上角所示,它们分别是:
-
之前建图保存下来的地图,该地图作为全局路径规划的主要依据,所以在规划路径之前,需要将小车的位置放好,这才能规划出正确的路径。
-
全局代价地图和局部代价地图,分别辅助全局和局部路径规划,其中,全局路径可以使用A* 和 Dijkstra 算法;局部路径是实际控制小车行进的算法,因此和车型有关,我们的车型是阿克曼类型,所以使用的是 teb_local_planner 算法。
-
地图轮廓附近的深色点,是膨胀层,该层存在的意义是让机器人在规划路径的过程中尽量避免开障碍物,使得小车处于安全的行进位置。
那么,如何开始导航??
上图 Rviz 中,最上一栏有两个比较重要的按钮,分别是:2D Pose Estimate 和 2D Nav Goal 。
2D Pose Estimate :鼠标点击之后,就会出现一个箭头,该箭头的作用就是手动指定小车当前在地图中的实际位置的,当激光点云和地图不重合的时候,可以手动纠正一下。其中,箭头的尾部表示位置,箭头的方向表示朝向。
2D Nav Goal :手动指定导航的目标点,鼠标点击之后,可以在地图中空白的位置处,选择一个点作为导航的目标点,同样该箭头包含了位置和朝向。
,时长01:45
随后,即可看见两条路径,其中绿色的表示全局路径,红色的表示的是局部路径。
最后,该算法使用的是 ROS 的导航框架 move_base,所有的节点配置文件,均存储在机器人主机中。路径如下:
home/cooneo/catkin_ws/src/mini_navigation/config/
8 展望
我们准备了完备的搭建教程和代码,不管是想要自己动手搭建的小伙伴儿还是想买来学习的同学,均有合适的文档和教程,代码全部都给你,不怕你学不会。
后续会继续在阿克曼底盘的基础上,做贴近小型自动驾驶场景的一些demo供大家参考,感兴趣的同学记得收藏哟!尽请期待!!