
ROS2的每个版本都有对应的Ubuntu版本如果本机的Linux系统和ROS2要求的版本不一致还得重新安装但是如果使用Docker镜像就不用关心本机的Linux版本了。本文讲述如何使用ROS2的官方镜像来进行开发。本人的本地Linux是WSL2 Debian一 下载镜像本文写作时ROS2处于LTS状态的有三个版本humble2022-05发布支持到2027-05jazzy2024-05发布支持到2029-05lyrical2026-05发布支持到2031-05这里以jazzy举例进入ROS2的docker hub地址https://hub.docker.com/r/osrf/ros/tags找到jazzy-desktop-full如下然后copy红框中的docker指令最后进入Linux终端执行这个指令。下载完毕后通过docker images查看二 测试镜像执行指令dockerrun--rm-it--envDISPLAY$DISPLAY-v/tmp/.X11-unix:/tmp/.X11-unix osrf/ros:jazzy-desktop-fullbash进入容器后需要执行source/opt/ros/jazzy/setup.bash这样才能执行ros2指令。然后运行ROS2自带的小乌龟例子ros2 run turtlesim turtlesim_node然后弹出界面此时在宿主机里开启另外一个终端并使用docker ps来查看容器ID然后使用docker指令在当前终端接入这个容器dockerexec-it919ff4e779a0bash进入后还需再执行source /opt/ros/jazzy/setup.bash最后执行下面指令开启按键控制节点ros2 run turtlesim turtle_teleop_key开启按键的终端必须保持选中激活然后按方向键来操作小乌龟移动三 使用VSCode基于ROS2容器开发配置 由AI生成在宿主机里创建一个目录ros2_test然后里面添加一个docker-compose.yml内容如下services:ros2_jazzy:image:osrf/ros:jazzy-desktop-fullstdin_open:truetty:trueenvironment:DISPLAY:${DISPLAY}TZ:Asia/Shanghaivolumes:-/tmp/.X11-unix:/tmp/.X11-unix# 当前项目目录挂载到容器 /root/ros2_ws-.:/root/ros2_ws:cached这个配置是把当前工程目录挂载到容器里的/root/ros2_ws/下。然后创建目录.devcontainer最后在里面添加devcontainer.json内容如下{name:ROS2 Jazzy Dev,dockerComposeFile:../docker-compose.yml,service:ros2_jazzy,workspaceFolder:/root/ros2_ws,customizations:{vscode:{extensions:[ms-vscode.cpptools,ms-python.python,twxs.cmake,eamodio.gitlens,redhat.vscode-yaml,Ranch-Hand-Robotics.rde-pack]}},runArgs:[--cap-addSYS_PTRACE,--security-opt,seccompunconfined],containerEnv:{ROS_DOMAIN_ID:0}}最后创建src目录里面的结构如下package.xml内容如下?xml version1.0??xml-model hrefhttp://download.ros.org/schema/package_format3.xsd schematypenshttp://www.w3.org/2001/XMLSchema?packageformat3namecpp_demo/nameversion0.0.0/versiondescriptionROS2 C simple demo/descriptionmaintaineremailusertodo.todouser/maintainerlicenseApache-2.0/licensebuildtool_dependament_cmake/buildtool_dependdependrclcpp/dependdependstd_msgs/dependbuildtool_dependament_cmake_auto/buildtool_dependexportbuild_typeament_cmake/build_type/export/packageCMakeLists.txt内容如下cmake_minimum_required(VERSION3.8)project(cpp_demo)if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHESClang)add_compile_options(-Wall-Wextra-Wpedantic)endif()#finddependenciesfind_package(ament_cmake REQUIRED)find_package(rclcpp REQUIRED)find_package(std_msgs REQUIRED)#----------------talker----------------add_executable(talker src/talker.cpp)ament_target_dependencies(talker rclcpp std_msgs)#----------------listener----------------add_executable(listener src/listener.cpp)ament_target_dependencies(listener rclcpp std_msgs)# 安装可执行文件install(TARGETS talker listener DESTINATION lib/${PROJECT_NAME})ament_package()listener.cpp内容如下#includerclcpp/rclcpp.hpp#includestd_msgs/msg/string.hppclassListenerNode:publicrclcpp::Node{public:ListenerNode():Node(listener){subscription_this-create_subscriptionstd_msgs::msg::String(/chatter,10,std::bind(ListenerNode::callback,this,std::placeholders::_1));}private:voidcallback(conststd_msgs::msg::String::SharedPtr msg)const{RCLCPP_INFO(this-get_logger(),[接收] %s,msg-data.c_str());}rclcpp::Subscriptionstd_msgs::msg::String::SharedPtr subscription_;};intmain(intargc,char*argv[]){rclcpp::init(argc,argv);rclcpp::spin(std::make_sharedListenerNode());rclcpp::shutdown();return0;}talker.cpp内容如下#includerclcpp/rclcpp.hpp#includestd_msgs/msg/string.hpp#includechronousingnamespacestd::chrono_literals;classTalkerNode:publicrclcpp::Node{public:TalkerNode():Node(talker),count_(0){// 创建发布者话题名 /chatterpublisher_this-create_publisherstd_msgs::msg::String(/chatter,10);timer_this-create_wall_timer(500ms,std::bind(TalkerNode::timer_callback,this));}private:voidtimer_callback(){automsgstd_msgs::msg::String();msg.dataHello ROS2! count: std::to_string(count_);RCLCPP_INFO(this-get_logger(),[发布] %s,msg.data.c_str());publisher_-publish(msg);}rclcpp::Publisherstd_msgs::msg::String::SharedPtr publisher_;rclcpp::TimerBase::SharedPtr timer_;size_t count_;};intmain(intargc,char*argv[]){rclcpp::init(argc,argv);rclcpp::spin(std::make_sharedTalkerNode());rclcpp::shutdown();return0;}进入容器按CtrlShiftp弹出命令框选择Reopen in ContainerVSCode会自动根据docker-compose.yml和devcontainer.json来创建容器连接成功之后可以看下左下角如下编译在VSCode里开启一个终端然后执行下面指令echosource /opt/ros/jazzy/setup.bash~/.bashrc这样在容器里开启终端就可以自动source最后执行编译指令colcon build --symlink-install显示如下编译成功后把这个项目package添加到系统路径里sourceinstall/setup.bash此时再开启一个终端也执行一下上面的source install/setup.bash这样准备工作就做好了。测试现在容器里开启了2个终端第一个终端执行命令ros2 run cpp_demo talker显示如下第二个终端执行命令ros2 run cpp_demo listener显示如下验证成功四 总结本文讲述如何使用Docker镜像进行ROS2开发利用了镜像的方便之处免除了环境准备的工作非常方便。