树莓派PI5主控的ROS1课程全部至于docker容器内。
5、进入机器人的docker容器5.1、相关概念5.2、如何查询机器人使用的docker镜像版本5.3、绑定外设5.4、查看外设连接情况5.5、编辑脚本5.6、执行脚本5.7、切换车型、雷达和相机5.8、多终端进入同一个docker容器5.9、如何开启已经处于【Exited】关闭状态的容器5.9.1、需要使用摄像头 5.9.2、不需要使用摄像头5.9.3、再次进入【Exited】关闭状态的容器
操作环境及软硬件参考配置如下:
参考车型:ROSMASTER X3
机器人硬件配置:Arm系列主控,思岚A1激光雷达,AstraPro Plus深度相机
机器人系统:Ubuntu(版本无要求)+ docker(20.10.21及以上版本)
PC虚拟机:Ubuntu(18.04)+ ROS(Melodic)
使用场景:在相对干净的2D平面上使用
1、什么是docker的宿主机
宿主机就是我们调用命令使用镜像创建容器的服务器。这里是指我们小车上的主控(jetson或树莓派等),以下提到的宿主机都是指这个。
2、什么是GUI
xxxxxxxxxx
GUI即图形用户界面,这里主要是指:opencv显示的图像窗口、rviz界面、rqt界面等。
3、什么是机器人的docker容器
xxxxxxxxxx
这里的机器人就是Rosmaster小车,也就是已配置好各种开发依赖环境的Rosmaster小车容器
4、在操作本章节教程前,请确保自己已经掌握了下面这些章节的知识,否则可能会感到学起来比较吃力。出现这种情况,请反复查看下面这些预先知识的内容,熟练掌握后会觉得很轻松,Come on,you are the best!
1、机器人使用的docker镜像版本也就是小车上使用的镜像版本,用户在烧录了小车的系统镜像开机启动后,执行:
x
#PI5 ROS1
pi@yahboom:~ $ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yahboomtechnology/ros-melodic 1.4.1 f8c914ba3cff 12 days ago 23.1GB
会看到有多个docker镜像版本,请选择【yahboomtechnology/ros-melodic】名字,tag最高的版本,即为机器人最新的镜像版本。如这里查询到的就使用【yahboomtechnology/ros-melodic:1.4.1】版本
2、为什么不能只放一个docker镜像在小车系统内呢?
如果你看过【07、Docker ------ 3、docker镜像深入理解和发布镜像】这章的教程,应该知道docker镜像是分层机制,也就是后面一个tag的镜像依赖前面一个tag的镜像。所以宿主机中可能会存在多个版本的docker镜像,这些镜像的tag会以递增的方式更新。
后续我们更新了新的课程也会用发布新的docker镜像的方式来更新功能
首先确保小车已经连接好各种外设,以及已经对外设做了端口绑定,端口绑定是在 docker的宿主机(小车)上处理的
常见的外设有:串口设备、激光雷达,RGBD摄像头,语音控制模块,手柄遥控器等
默认小车已经绑定了Astra相机、激光雷达和串口设备,需要绑定其它设备的请参考端口绑定教程操作
关于端口绑定的步骤,请参见【六、 Linux操作系统 ------ 06.绑定设备ID】教程章节
宿主机内已经配置了端口绑定,需要修改的可以查看里面内容修改:
此步骤在宿主机上操作:
1、这里是查看除摄像头之外的外设,这里没有连接语音控制模块,连接了的会显示【myspeech】设备
xxxxxxxxxx
ll /dev | grep ttyUSB*
2、查看AstraPro Plus相机的端口如下:
xxxxxxxxxx
jetson@ubuntu:~$ ll /dev/astra*
lrwxrwxrwx 1 root root 15 May 5 17:42 /dev/astradepth -> bus/usb/001/007
lrwxrwxrwx 1 root root 15 May 5 17:42 /dev/astrauvc -> bus/usb/001/009
由于AstraPro Plus相机插拔之后,很多时候端口号会改变,需要重新编辑脚本配置一下AstraPro Plus相机的端口。
编辑运行docker的脚本,此步骤在宿主机上操作:
1、运行docker的脚本【run_docker.sh】一般会放在小车主目录的根目录下 ,我这里是在下面路径。如何没有,可以自行创建该文件,记得创建后给脚本赋予可执行权限。
xxxxxxxxxx
chmod +x run_docker.sh #给脚本赋予可执行权限
【run_docker.sh】脚本的内容如下:
不带注释的可以直接复制并按需修改
注意:以下添加主机设备给容器时,如果宿主机没有连接该设备,需要去掉相应的添加操作,才能开启容器
树莓派PI5 ROS1
xxxxxxxxxx
xhost +
docker run -it \
--net=host \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
-v /tmp/.X11-unix:/tmp/.X11-unix \
-v /home/pi/temp:/root/temp \
-v /dev/bus/usb/003/006:/dev/bus/usb/003/006 \
-v /dev/bus/usb/003/008:/dev/bus/usb/003/008 \
--device=/dev/myserial \
--device=/dev/rplidar \
--device=/dev/astradepth \
--device=/dev/astrauvc \
--device=/dev/input \
--device=/dev/video0 \
--device=/dev/video1 \
-p 9090:9090 \
-p 8888:8888 \
yahboomtechnology/ros-melodic:1.4.1 /bin/bash
带注释的脚本说明:
注意:以下添加主机设备给容器时,如果宿主机没有连接该设备,需要去掉相应的添加操作,才能开启容器
x#!/bin/bash
xhost + # xhost 是用来支持docker内显示GUI的
docker run -it \ # 交互式运行docker镜像
--net=host \ # 容器网络设置为host模式
--env="DISPLAY" \ # 开启显示GUI界面
--env="QT_X11_NO_MITSHM=1" \ # 采用X11的端口1进行显示
-v /tmp/.X11-unix:/tmp/.X11-unix \ # 映射显示服务节点目录
-v /home/pi/temp:/root/temp \ # 作为宿主机和容器临时传输文件的目录,有需要传输文件,可以使用这个目录
-v /dev/bus/usb/001/010:/dev/bus/usb/001/010 \ # 添加主机设备给容器,这里是astrpro plus设备端口,如何小车没有连接摄像头,请去掉这行
-v /dev/bus/usb/001/011:/dev/bus/usb/001/011 \ # 添加主机设备给容器,这里是astrpro plus设备端口,如何小车没有连接摄像头,请去掉这行
--device=/dev/astradepth \ # 添加主机设备给容器,这里是astrpro plus设备端口,如何小车没有连接摄像头,请去掉这行
--device=/dev/astrauvc \ # 添加主机设备给容器,这里是astrpro plus设备端口,如何小车没有连接摄像头,请去掉这行
--device=/dev/video0 \ # 添加主机设备给容器,这里是astrpro plus设备端口,如何小车没有连接摄像头,请去掉这行
--device=/dev/video1 \ # 添加主机设备给容器,这里是astrpro plus设备端口,如何小车没有连接摄像头,请去掉这行
--device=/dev/myserial \ # 添加主机设备给容器,这里是串口设备端口,如何小车没有连接串口,请去掉这行
--device=/dev/rplidar \ # 添加主机设备给容器,这里是雷达设备端口,如何小车没有连接雷达,请去掉这行
--device=/dev/myspeech \ # 添加主机设备给容器,这里是语音控制设备端口,如何小车没有连接语音控制设备,请去掉这行
--device=/dev/input \ # 添加主机设备给容器,这里是手柄设备端口,如何小车没有连接手柄,请去掉这行
-p 9090:9090 \ # 开放的端口
-p 8888:8888 \
yahboomtechnology/ros-melodic:1.4.1 /bin/bash # 要启动的镜像名称,根据5.2步骤中查询到的修改;在容器内执行/bin/bash命令
#注意:以上添加主机设备给容器时,如果宿主机没有连接该设备,需要去掉相应的添加操作,才能开启容器
2、修改上面脚本中的,这两行是AstraPro Plus相机的端口号,由于相机插拔之后,端口号会改变,需要重新配置一下相机的端口
xxxxxxxxxx
-v /dev/bus/usb/001/010:/dev/bus/usb/001/010 \ # 给容器挂载存储卷,挂载到容器的某个目录,这里挂载的是摄像头的rgb和depth端口
-v /dev/bus/usb/001/011:/dev/bus/usb/001/011 \
为步骤5.4 2中查询到的摄像头端口,这个端口在摄像头插拔后可能会改变,所以每个人的是不同的,需要自己配。
xxxxxxxxxx
-v /dev/bus/usb/001/007:/dev/bus/usb/001/007 \ # 给容器挂载存储卷,挂载到容器的某个目录,这里挂载的是摄像头的rgb和depth端口
-v /dev/bus/usb/001/009:/dev/bus/usb/001/009 \
5.5步骤执行完后,在 docker的宿主机上【即小车,可在VNC上面或者在小车屏幕上】打开终端
注意:这里必须是在小车的VNC上面或者在小车屏幕上执行,不可在通过ssh远程进入的小车终端(如通过MobaXterm进入的小车终端)中执行,否则可能容器中无法显示GUI图像,如下在MobaXterm中进入小车终端执行run_docker.sh进入容器后,无法显示rviz
在小车的VNC界面或者在小车屏幕上执行:
xxxxxxxxxx
./run_docker.sh
即可正确进入容器,并能显示GUI画面,可以再次执行rviz命令测试。
如果执行rviz命令后无法显示GUI,显示如下错误:(一般在树莓派主控中有可能出现)
需要再启动脚本中再加一个参数:
xxxxxxxxxx
--security-opt apparmor:unconfined
树莓派PI5 ROS1
xxxxxxxxxx
xhost +
docker run -it \
--net=host \
--env="DISPLAY" \
--env="QT_X11_NO_MITSHM=1" \
-v /tmp/.X11-unix:/tmp/.X11-unix \
--security-opt apparmor:unconfined \ # 添加了这句参数
-v /home/pi/temp:/root/temp \
-v /dev/bus/usb/003/006:/dev/bus/usb/003/006 \
-v /dev/bus/usb/003/008:/dev/bus/usb/003/008 \
--device=/dev/myserial \
--device=/dev/rplidar \
--device=/dev/astradepth \
--device=/dev/astrauvc \
--device=/dev/input \
--device=/dev/video0 \
--device=/dev/video1 \
-p 9090:9090 \
-p 8888:8888 \
yahboomtechnology/ros-melodic:1.4.1 /bin/bash
然后再次运行脚本即可进入容器,并能显示GUI画面。
说明:由于ROSMASTER系列机器人分为多款机器人以及多款设备,出厂系统已配置多款设备的例程,但由于无法自动识别产品,所以需要手动设置机器类型和雷达型号。
进入容器后:根据小车的车型,雷达类型和camera的类型做如下修改:
xxxxxxxxxx
root@ubuntu:/# cd
root@ubuntu:~# vim .bashrc
修改完成后,保存退出vim,然后执行:
xxxxxxxxxx
root@ubuntu:~# source .bashrc
--------------------------------------------------------
ROS_DOMAIN_ID: 12
my_robot_type: x3 | my_lidar: a1 | my_camera: astraplus
--------------------------------------------------------
root@ubuntu:~#
可以看到当前修改后的小车的车型,雷达类型和camera的类型
机器人项目文件存放在如下目录:
xxxxxxxxxx
/root/yahboomcar_ws
1、在上面的步骤中已经开启了一个docker容器,可以在宿主机(小车)上打开另一个终端查看:
xxxxxxxxxx
docker ps -a
2、现在在这个新打开的终端中进入该docker容器:
xxxxxxxxxx
docker exec -it 5b698ea10535 /bin/bash
成功进入容器,还可以再打开无数个终端进入该容器。
机器人项目文件存放在如下目录:
xxxxxxxxxx
/root/yahboomcar_ws
3、注意:
(1)执行2步骤中的命令时要确保容器处于开启【UP】状态
(2)如果容器处于【Exited】关闭状态,请参见下面1.6步骤操作
这里分两种情况:还需要使用摄像头 和 不再需要使用摄像头
首先需求根据上面【5.3、查看外设连接情况】步骤中的指引,查看AstraPro Plus相机的端口有没有改变。
1、如果Astra Pro相机的端口改变,那无法再次进入该容器。
(1)如果该容器中有一些修改需要保留,可以参考如下命令生成一个新的镜像,
xxxxxxxxxx
从容器中提交一个镜像:
docker commit 容器id 要创建的目标镜像名:[标签名]
例如:docker commit 66c40ede8c68 yahboomtechnology/ros-melodic:1.1 # 标签名根据自己的情况递增
然后再运行这个新的镜像进入容器:参见本章节【5.2 到 5.5】步骤执行
(2)如果没有修改需要保留,那直接参见本章节【5.2 到 5.5】步骤执行进入容器。
2、如果AstraPro Plus相机的端口没有改变,那直接参见【5.7.3、再次进入【Exited】关闭状态的容器】步骤执行。
直接参见【5.7.3、再次进入【Exited】关闭状态的容器】步骤执行。
在 docker的宿主机上【即小车,可在VNC上面或者在小车屏幕上】打开终端
注意:这里必须是在小车的VNC上面或者在小车屏幕上执行,不可在通过ssh远程进入的小车终端(如通过MobaXterm进入的小车终端)中执行,否则可能容器中无法显示GUI图像,当然如何您不需要显示GUI图像,那就可以。
1、首先查看容器的状态
xxxxxxxxxx
docker ps -a
2、开启GUI访问权限
xxxxxxxxxx
xhost +
3、开启容器【这里容器的ID是可以简写的,只要能够唯一识别当前已经存在的容器即可】
xxxxxxxxxx
docker start 5b
4、再次进入该容器
xxxxxxxxxx
docker exec -it 5b /bin/bash
5、打开rviz查看是否已经能够开启GUI画面
xrviz
6、具体执行如下:
x
jetson@ubuntu:~$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5b698ea10535 yahboomtechnology/ros-melodic:1.4.1 "/bin/bash" 3 days ago Exited (0) 8 seconds ago ecstatic_lewin
jetson@ubuntu:~$ xhost +
access control disabled, clients can connect from any host
jetson@ubuntu:~$ docker start 5b
5b
jetson@ubuntu:~$ docker exec -it 5b /bin/bash
--------------------------------------------------------
my_robot_type: x3 | my_lidar: a1 | my_camera: astrapro
--------------------------------------------------------
root@ubuntu:/# rviz
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
[INFO] [1682298616.634096279] [rviz]: Stereo is NOT SUPPORTED
[INFO] [1682298616.634576375] [rviz]: OpenGl version: 3.1 (GLSL 1.4)
[INFO] [1682298617.959654036] [rviz]: Stereo is NOT SUPPORTED