阿克曼-幻宇机器人系列教程4- 建图
在之前的文章中,我们介绍了如何登录机器人,如何实现上位机与下位机之间的互通,还介绍了机器人的topic和message,以及如何通过命令行对topic、message进行对应的操作。
接下来,我们就要运用前面所学的所有知识进行综合操作:运行机器人实现建图。
通过Gmapping能力进行建图,使用RVIZ可视化工具(ROS专用可视化工具)将数据进行可视化。
因为RVIZ可视化工具只能运行在Linux系统上,所以需要分别考虑具备了Linux系统条件和仅有Windows系统的情况。
考虑到Windows系统上建图的准备工作较多,所以我们首先介绍Windows系统上的情况。
1.Windows系统建图
1.1 构建包含Linus操作系统的容器
1.1.1 构建原因
为了实现上位机(Windows电脑)对下位机(机器人上的树莓派)的操控,需要在上位机上安装ROS系统。
又因为ROS系统是基于Linus系统开发和测试的,所以我们需要在Windows电脑中构建Linus系统,阿克曼-幻宇机器人是基于Linus系统中的Ubuntu系统进行开发和测试,所以我们构建的是Ubuntu系统环境
1.1.2 构建过程
为了简化构建过程,我们借助Docker进行环境构建。
在本地电脑中创建文件,命名为Dockerfile,文档内容:
docker pull 对于某些独立显卡的,采用强制软解码(直接使用包含RVIZ等全功能的容器)
1.2 运行容器并与树莓派联通
1.2.1 运行容器
运行命令
docker run -it --rm tiryoh/ros-kinetic-desktop:latest
在这种模式下,容器与宿主机共享网络,容器将使用宿主机的IP地址,并直接访问宿主机的网络资源。
使用宿主机网络命令
docker run -it --rm --network host tiryoh/ros-kinetic-desktop:latest
1.2.2 实现容器与树莓派联通
1.2.2.1 确保容器的宿主机和机器人树莓派处于同一局域网
-
将机器人作为热点,宿主机连接机器人网络
-
声明树莓派上的ROS服务地址
export ROS_MASTER_URI=http://192.168.12.1:11311/ # 树莓派上的 URI
-
声明容器的IP地址
export ROS_HOSTNAME=192.168.12.170 # docker 内机器的 ip
- 执行命令验证是否联通
rostopic list
1.3 为Docker Ubuntu赋予GUI能力
1.3.1 把宿主机的图像权限赋予给Docker
xhost +local:docker
说明:当不需要时,取消权限命令为:
xhost -local:docker
1.3.2 启动带有GUI能力的容器并启动RVIZ
docker run -it --rm \--network host \ 将宿主机网络赋予给容器--env="DISPLAY" \--env="QT_X11_NO_MITSHM=1" \ 和上一行代码共同作用,把宿主机的显示能力赋予给容器--env="ROS_MASTER_URI=http://192.168.12.1:11311" \--env="ROS_HOSTNAME=192.168.12.78" \--env="LIBGL_ALWAYS_SOFTWARE=1" \ 对于某些独立显卡的,采用强制软解码--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ tiryoh/ros-kinetic-desktop:latestrviz
即可看到 RVIZ 可视化工具已经启动,通过添加话题和选择话题名称就可以查看相应话题数据。
1.4 Gmapping建图
通过上述步骤完成环境准备、上下位机之间的联通和可视化准备后,就可以开始准备Gmapping建图。
还差在宿主机中执行的最后三个操作以实现对机器人的操控:运行机器人、打开机器人键盘控制节点和运行Gmapping建图包。
1.4.1 运行机器人
终端 1
ssh huike@192.168.12.1 # 登陆树莓派
roslaunch huanyu_robot_start Huanyu_robot_start.launch # 运行机器人
1.4.2 打开机器人键盘控制节点
终端 2
ssh huike@192.168.12.1 # 登陆树莓派
roslaunch turtlebot_teleop keyboard_teleop.launch # 打开机器人键盘控制节点
打开机器人键盘控制节点返回的信息我们主要关注以下信息
Control Your Turtlebot!
---------------------------
Moving around:
u i o
j k l
m , .
这一信息提供了机器人操作说明
1.4.3 运行Gmapping建图包
终端 3
ssh huike@192.168.12.1 # 登陆树莓派
roslaunch huanyu_robot_start gmapping_slam.launch # 运行 Gmapping 建图包
说明:SSH是为了访问树莓派,并为在机器人里执行操作做准备。
在数据窗口内查看地图和机器人姿态数据。RVIZ中的消息和话题选择如下:即可看到地图、激光点、机器人的 tf 位姿数据:
完成上述三步准备工作后,按照第二部返回的操作说明移动机器人,尽量走一个闭合的曲线,使显示地图能满足整体建图需要。
2. Linux系统建图
学习了Windows系统建图后,Linux系统建图因为省去了很多环境准备、可视化等准备工作就相对容易得多了。
2.1 环境准备
-
确保Linux系统是Ubuntu系统,如果不是手动换成此系统。
-
执行命令安装包含kinetic版本、RVIZ可视化工具包:
apt install -y ros-kinetic-desktop-full
2.2 Gmapping建图
将Linux系统电脑连上机器人热点,然后打开三个终端Launch三个相关包,打开RVIZ,完成话题和消息选择。
通过键盘指令移动机器人,尽量走一个闭合的曲线,使显示地图能满足整体建图需要。
3. 扩展知识
我们详细介绍下Dockerfile命令行的确认过程,并以全功能和仅含有kinetic版本的ROS系统的拉取容器对象不同分别说明容器制作命令行的不同。
Dockerfile命令行的确认过程
-
确认机器人树莓派中运行的ROS系统版本
-
在Docker找到与之匹配的容器,然后在页面上找到对应的拉取命令
以我所使用的阿克曼-幻宇机器人ROS系统为例:
当拉取的是包含了RVIZ全功能的容器
版本为kinetic,我在Docker中找到对应的包含RVIZ可视化工具、kinetic版本ROS系统的全功能容器,找到容器构建命令。
容器地址:
https://hub.docker.com/r/tiryoh/ros-kinetic-desktop/
构建语句
docker pull tiryoh/ros-kinetic-desktop(直接使用包含RVIZ等全功能的容器)
当拉取的是仅包含kinetic版本ROS系统的的容器
拉取容器之后,需要执行定制化操作,比如安装RVIZ可视化工具
容器地址:
https://hub.docker.com/_/ros/tags?name=kine
拉取语句:
docker pull ros:kinetic
执行上述命令构建的是不包含RVIZ可视化工具的容器,所以我们还需要下载对应的应用
RUN apt update && apt install -y iputils-ping net-tools && apt install -y ros-kinetic-desktop-full 更新软件包索引,安装一些网络调试工具和完整的 ROS Kinetic 桌面版本。
docker build -t my/ros_kinetic:app 构建Docker镜像
这样就可以在Linux系统中运行RVIZ工具了。