ROS2 Docker 命令行 环境安装
osrf提供了官方的ros1和ros2的Docker环境https://hub.docker.com/_/ros
在上述地址中查看相关的tutorial。
Docker下载
本地主机环境:MacOS 10.13.6
brew install docker
- 在Application中运行docker,此时docker会出现在状态栏中
- 可以参考 菜鸟教程-Docker 来进行初步的docker操作
方法一,配置Docker环境,在container中下载git代码
这个方式是我第一次接触Docker方式开发ROS采用的方式,这种方式就是把Docker当成一个虚拟机来使用。缺点当然是没有虚拟机好使,但是资源消耗比虚拟机小太多。
- Dockerfile:
直接从官方镜像生成一个本地镜像:
1 | FROM ros:dashing-ros-core |
保存命名成Dockerfile
.
如果没有RUN语句,在后边编译的时候会出现找不到ament-cmake
这个语句可能会出现/bin/sh: 1: /opt/ros/dashing/setup.bash: Bad substitution
报错,这是因为你的localhost使用的是sh而不是bash。所以改为setup.sh就可以了
docker build 创建镜像:
docker build -t myros2:dashing .
这里注意上下文路径.
不能省略,-t
表示创建镜像的tag名称(全部要求小写)。运行成功后:
创建容器,运行命令行工具进入容器
docker run -it myros2:dashing /bin/bash
这时容器中已经包含了ros2的最小开发环境,可以在命令行中使用
ros2
来查看。ros2安装目录位于/opt/ros/dashing
创建自己的workspace:
mkdir -p /home/ros2_ws/src
在src中clone已经编辑好的cpp_pubsub包。https://github.com/FloodShao/ros2_ws.git (这是我自己按照official tutorial写的)
编译包,并运行
1
2
3
4
5
6
7
8当前路径为/home/ros2_ws/
colcon build cpp_pubsub
source ./install/setup.bash
查看ros2是否已经添加包
ros2 pkg list | grep cpp_pubsub
运行listener和talker。因为只能开一个命令行工具,所以listener要后台运行
ros2 run cpp_pubsub listener &
ros2 run cpp_pubsub talker运行结果:
方法二,使用多个container,部署在同一个网络中,每一个container对应一个node
- 创建docker image与方法一相同。
- 不同的是,并不是在container中下载git源代码(首先,你的container生命周期结束之后,这个代码就不存在了。其次,如果你采用了在Dockerfile中写RUN命令来将代码直接download进文件系统,那么可以,但是代价是你创建的image可能会很大,因为每云运行一次RUN命令,镜像文件就会多加一层。镜像文件应该保证最基本的运行环境,而不应该将代码直接加载)
- 将localhost中的目录挂载在container的目录中,通过
-v
参数,将localhost中绝对路径/<dir>
挂载在container中的/workspace
中docker run -it --name talker -v /<dir>:/workspace myros2:dashing /bin/bash
- 在删除了container之后,挂载的目录并不会消失。
- 这里使用了–name来命名这个container。
- 删除这个container可以使用
docker rm /talker
- 使用
-d
让container在后台运行 - 使用
docker exec -it /talker /bin/bash
进入container环境
- 使用launch file来进行node的创建和监控同时在CMakelists中添加:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#pkg/launch/my_script.launch.py
import launch
import launch.actions
import launch.substitutions
import launch_ros.actions
def generate_launch_description():
return launch.LaunchDescription([
launch.actions.DeclareLaunchArgument(
'node_prefix',
default_value=[launch.substitutions.EnvironmentVariable('USER'), '_'],
description='Prefix for node names'),
launch_ros.actions.Node(
package='cpp_pubsub', node_executable='listener', output='screen',
node_name=[launch.substitutions.LaunchConfiguration('node_prefix'), 'listener']),
launch_ros.actions.Node(
package='cpp_pubsub', node_executable='talker', output='screen',
node_name=[launch.substitutions.LaunchConfiguration('node_prefix'), 'talker']),
])1
2
3
4
5# Install launch files.
install(DIRECTORY
launch
DESTINATION share/${PROJECT_NAME}/
) - 进入container之后,
colcon build
编译。 - launch
ros2 launch cpp_pubsub my_script.launch.py
node所有的输出会保存在/root/.ros/log/