一步一步自己动手实现一台阿克曼ROS无人车

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 [email protected]      # 以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 [email protected]      # 以Nvidia 设备为例 密码 cooneo

cd catkin_ws
source devel/setup.bash    # source 工作空间
roslaunch ros_arduino_python arduino.launch

2、第二个终端

ssh -X [email protected]      # 以Nvidia 设备为例 密码 cooneo

cd catkin_ws
source devel/setup.bash    # source 工作空间

roslaunch linetrack balltrack_color.launch

然后将绿色小球放到机器人云台摄像头前面,云台就会在一定范围内跟随移动。

默认是跟踪绿色,代码里面还提供了红色、黄色、绿色物体跟踪所需的 HSV 空间范围值。

4 基于颜色的火焰识别

在本地 ubuntu 中打开两个终端。

1.第一个终端

ssh [email protected]      # 以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 [email protected]      # 以Nvidia 设备为例 密码 cooneo
cd catkin_ws
source devel/setup.bash

roslaunch ros_arduino_python arduino.launch

将车放置到我们的赛道上,摄像头朝向车道中线(黄色)

2. 第二个终端

ssh [email protected]      # 以Nvidia 设备为例 密码 cooneo
cd catkin_ws
source devel/setup.bash

roslaunch linetrack linetrack_color.launch

运行之后,云台摄像头会自动朝下转动固定角度,使得摄像头对准前方赛道。

6 纯激光雷达建图

在本地 ubuntu 打开三个终端:

1. 第一个终端

# ssh
ssh [email protected]   #  以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 [email protected]   #  以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 [email protected]   # 英伟达主机,密码是: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

参考推文

实测!ROS机器人400平米环形楼层不同方法建图解析

搭建ROS机器人之——激光雷达2D建图方法总览

7 纯激光雷达导航

在 ubuntu 本地端,打开两个终端:

1. 第一个终端

# ssh 进jetson nnao
ssh [email protected]    # 输入密码为 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,如上图左上角所示,它们分别是:

  1. 之前建图保存下来的地图,该地图作为全局路径规划的主要依据,所以在规划路径之前,需要将小车的位置放好,这才能规划出正确的路径。

  2. 全局代价地图和局部代价地图,分别辅助全局和局部路径规划,其中,全局路径可以使用A* 和 Dijkstra 算法;局部路径是实际控制小车行进的算法,因此和车型有关,我们的车型是阿克曼类型,所以使用的是 teb_local_planner 算法。

  3. 地图轮廓附近的深色点,是膨胀层,该层存在的意义是让机器人在规划路径的过程中尽量避免开障碍物,使得小车处于安全的行进位置。

那么,如何开始导航??

上图 Rviz 中,最上一栏有两个比较重要的按钮,分别是:2D Pose Estimate2D Nav Goal

2D Pose Estimate :鼠标点击之后,就会出现一个箭头,该箭头的作用就是手动指定小车当前在地图中的实际位置的,当激光点云和地图不重合的时候,可以手动纠正一下。其中,箭头的尾部表示位置,箭头的方向表示朝向。

2D Nav Goal :手动指定导航的目标点,鼠标点击之后,可以在地图中空白的位置处,选择一个点作为导航的目标点,同样该箭头包含了位置和朝向。

,时长01:45

随后,即可看见两条路径,其中绿色的表示全局路径,红色的表示的是局部路径。

最后,该算法使用的是 ROS 的导航框架 move_base,所有的节点配置文件,均存储在机器人主机中。路径如下:

home/cooneo/catkin_ws/src/mini_navigation/config/

8 展望

我们准备了完备的搭建教程和代码,不管是想要自己动手搭建的小伙伴儿还是想买来学习的同学,均有合适的文档和教程,代码全部都给你,不怕你学不会。

后续会继续在阿克曼底盘的基础上,做贴近小型自动驾驶场景的一些demo供大家参考,感兴趣的同学记得收藏哟!尽请期待!!

猜你喜欢

转载自blog.csdn.net/COONEO/article/details/126135441