1、运行小乌龟
docker的安装可以参考: [linux小白] Ubuntu22安装Docker
避免每次输入docker命令都要用sudo: sudo usermod -aG docker $USER
如果出现拉取镜像失败Error response from daemon 参考 Docker拉取镜像报错:Error response from daemon,问题解决,记住要重启电脑否则可能暂时不会生效。
首先拉取基础镜像:
docker pull osrf/ros:humble-desktop-full
用docker run 基于镜像创建容器并且运行:
docker run -it --name ros2-humble --net=host --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" osrf/ros:humble-desktop-full /bin/bash
docker run -it --name ros2-humble --net=host --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" -v /home/lwh/code:/home/lwh/code osrf/ros:humble-desktop-full /bin/bash
设置环境变量:
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
启动小乌龟…
ros2 run turtlesim turtlesim_node
接着再开启一个终端,此时因为容器已经运行,所以用docker start开启容器:
docker start ros2-humble
进入该容器的bash终端:
docker exec -it ros2-humble /bin/bash
启动键盘控制:
ros2 run turtlesim turtle_teleop_key
这里再介绍一下正在运行的容器如何停止以及删除,这个实际操作中肯定能用得到。
首先通过下述命令查看当前存在哪些容器:
docker ps -a // 查看有哪些docker容器,正在运行+历史运行
docker ps // 查看正在运行的容器
接着:
docker stop containerId // 停止容器
docker rm containerId // 删除一个已停止的容器
docker rm -f containerId // 删除一个正在运行的容器,否则会占内存 -f强制
如果出现下面问题:
root@lwh-Lenovo-XiaoXin-CHAO7000-13:/code/robot_ws# ros2 run turtlesim turtlesim_node
No protocol specified
qt.qpa.xcb: could not connect to display :0
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.
[ros2run]: Aborted
请退出docker 执行
xhost +local:`docker inspect --format='{{ .Config.Hostname }}' ros2-humble`
如果执行这条命令出现没有权限的问题,请执行,并且重启动电脑。
vscode的dev-container 也可能出现连接不到docker容器的情况,同样这样处理。
2、载入基础工程
将本地的基础工程导入到容器中,为开发做准备…
docker cp local_path containerId:file_path // host到docker
接着尝试编译一下…
编译不通过,这是很正常的,这只是一个初始的容器,接下来我们需要自行安装依赖。
3、安装依赖
安装依赖的同时也需要把dockerfile
写一下,安装一个依赖补充一句dockerfile,dockerfile的编写应该持续到整个工程部署运行结束。
todo:
为什么在docker容器中开发,使用vscode(dev-container插件)编辑代码时,一旦代码编译成功再继续修改代码就没用了,cmake将不会用修改的代码进行编译,但是如果用vim编辑代码的话就不会有这个问题。