通过学习ROS入门教程，了解ROS机器人操作系统的安装，使用，系统结构，系统命令，包开发等
ROS入门教程 本系列来自：http://wiki.ros.org/cn/ROS/Tutorials 国外网站有时候比较慢，特转摘到这里。访问原文速度快的，建议还是阅读原文！ 非初学者: 如果你已经很熟悉 ROS fuerte(要塞龟)或更早期版本的使用，而只是想使用在groovy(加岛象龟)和hydro(渔龟)中开始采用的最新编译构建系统catkin，那你可以深入学习catkin教程。 但是我们仍然建议所有人学完整个“初级”教程以方便理解新增的功能特性。 如果你是Linux初学者： 也许先学习一些有关linux命令行工具的快速使用教程会对你很有帮助，这里有篇好教程（英文）。 目录 1.核心ROS教程 1.1 初级 1.2 中级 2.ROS标准 3.外部ROS资源 3.1 外部教程 3.2 外部研讨会或课件 4.在机器人上运行ROS 5.其它ROS函数库教程 6.提供ROS接口的函数库教程 1.核心ROS教程 1.1 初级 1.1.1 安装并配置ROS环境 本教程详细描述了ROS的安装与环境配置。 1.1.2 ROS文件系统介绍 本教程介绍ROS文件系统概念，包括命令行工具roscd、rosls和rospack的使用。 1.1.3 创建ROS程序包 本教程介绍如何使用roscreate-pkg或catkin创建一个新程序包,并使用rospack查看程序包的依赖关系。 1.1.4 编译ROS程序包 本教程介绍ROS程序包的编译方法 1.1.5 理解 ROS节点 本教程主要介绍 ROS 图（graph）概念 并讨论roscore、rosnode和 rosrun 命令行工具的使用。 1.1.6 理解ROS话题 本教程介绍ROS话题（topics）以及如何使用rostopic 和 rxplot 命令行工具。 1.1.7 理解ROS服务和参数 本教程介绍了ROS 服务和参数的知识，以及命令行工具rosservice 和 rosparam的使用方法。 1.1.8 使用 rqt_console 和 roslaunch 本教程介绍如何使用rqt_console和rqt_logger_level进行调试，以及如何使用roslaunch同时运行多个节点。早期版本中的rqt工具并不完善，因此，如果你使用的是“ROS fuerte”或更早期的版本，请同时参考这个页面学习使用老版本的“rx”工具。 1.1.9 使用rosed编辑ROS中的文件 本教程将展示如何使用rosed来简化编辑过程。 1.1.10 创建ROS消息和ROS服务 本教程详细介绍如何创建并编译ROS消息和服务，以及rosmsg, rossrv和roscp命令行工具的使用。 1.1.11 编写简单的消息发布器和订阅器 (C++) 本教程将介绍如何编写C++的发布器节点和订阅器节点。 1.1.12 写一个简单的消息发布器和订阅器 (Python) 本教程将通过Python编写一个发布器节点和订阅器节点。 1.1.13 测试消息发布器和订阅器 本教程将测试上一教程所写的消息发布器和订阅器。 1.1.14 编写简单的Service和Client (C++) 本教程介绍如何用C++编写Service和Client节点。 1.1.15 编写简单的Service和Client (Python) 本教程介绍如何用Python编写Service和Client节点。 1.1.16 测试简单的Service和Client 本教程将测试之前所写的Service和Client。 1.1.17 录制与回放数据 本教程将教你如何将ROS系统运行过程中的数据录制到一个.bag文件中，然后通过回放数据来重现相似的运行过程。 1.1.18 roswtf入门 本教程介绍了roswtf工具的基本使用方法。 1.1.19 探索ROS维基 本教程介绍了ROS维基(wiki.ros.org)的组织结构以及使用方法。同时讲解了如何才能从ROS维基中找到你需要的信息。 1.1.20 接下来做什么？ 本教程将讨论获取更多知识的途径，以帮助你更好地使用ROS搭建真实或虚拟机器人。 现在你已经完成了初级教程的学习，请回答这个 问卷来检验一下自己的学习效果。 1.2 中级 大多数客户端API的使用教程可以在相关程序包(roscpp, rospy, roslisp)中找到。 1.2.1 手动创建ROS package 本教程将展示如何手动创建ROS package 1.2.2 管理系统依赖项 本教程将展示如何使用rosdep安装系统依赖项. 1.2.3 Roslaunch在大型项目中的使用技巧 本教程主要介绍roslaunch在大型项目中的使用技巧。重点关注如何构建launch文件使得它能够在不同的情况下重复利用。我们将使用 2dnav_pr2 package作为学习案例。 1.2.4 ROS在多机器人上的使用 本教程将展示如何在两台机器上使用ROS系统，详述了使用ROS_MASTER_URI来配置多台机器使用同一个master。 1.2.5 自定义消息 本教程将展示如何使用ROS Message Description Language来定义你自己的消息类型. 1.2.6 在python中使用C++类 本教程阐述一种在python中使用C++类的方法。 1.2.7 如何编写教程 （概述：）本教程介绍在编辑ros.org维基时可以用到的模板和宏定义，并附有示例以供参考。 ROS标准 2.1 ROS开发者指南 有关代码风格和软件包布局等相关指南。 2.2 标准测量单位和坐标约定。 外部ROS资源 3.1 外部教程 3.1.1 ANU的ROS视频教程 3.1.2 NooTriX的手把手ROS教程 3.1.3 Jonathan Bohren的ROS教程 3.1.4 Clearpath Robotics 的知识库 3.2 外部研讨会或课件 3.2.1 由位于东京的TORK提供的面向企业基础培训的研讨会 在机器人上运行ROS 4.1 创建你自己的URDF文件 创建一个定制的通用机器人格式化描述文件。 4.2 ros_control 使用ROS的标准控制器框架来与硬件连接。 4.3 在Gazebo中使用URDF 在Gazebo机器人模拟器中添加必要的标记。 4.4 搭建 MoveIt! 建立配置程序包（configuration package）来使用MoveIt!运动规划框架。 其它ROS函数库教程 5.1 Robot Model 5.2 Visualization 5.3 actionlib 5.4 pluginlib 5.5 nodelets 5.6 navigation 5.7 TF 提供ROS接口的函数库教程 6.1 Stage 6.2 PCL with ROS
1.安装并配置ROS环境 说明 本教程详细描述了ROS的安装与环境配置。 此为 Ubuntu14.04 + ROS indigo安装说明 注： ubuntu16.04 + ROS Kinetic 版本安装：参考链接 ubuntu18.04 + ROS Melodic 版本安装：参考链接 官方安装ROS说明 在开始学习这些教程之前请先按照ROS安装说明完成安装。 虚拟机安装及说明 VirtualBox虚拟机 VirtualBox虚拟机5.0 (密码:ncnynl.com)| VirtualBox虚拟机下载最新 VMWare Workstation虚拟机 最新版下载 | 安装说明 ubuntu14镜像 本镜像需要安装到电脑或虚拟机 ubuntu14.04镜像下载 镜像1 | 镜像2 Exbot镜像，包含Ubuntu14.04+ROS(indigo)+Turtlebot等 Exbot镜像说明 | 镜像下载地址 ubuntu for ros镜像，包含Ubuntu14.04+ROS(indigo)，64位基础版 | 32位基础版 | 64位开发版 | 32位开发版 | 电脑版安装说明 | 虚拟机版安装说明 Oracle VM VirtualBox OVA镜像 本镜像通过VirtualBox导入 VirtualBox镜像OVA包，包含64位Ubuntu14.04+ROS(indigo)+Turtlebot2 本站提供下载 VirtualBox镜像OVA包, ros+indigo+32位Torrent种子 | ros+indigo+64位Torrent种子 设置： 设置桥接上网 设置固定IP 设置virtualbox中ubuntu和windows共享文件夹 ROS的Indigo版本安装说明 配置Ubuntu仓库，"restricted," "universe," and "multiverse." 可界面软件更新那进行设置。 安装源 sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' 或来自中国的源： sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list' 增加key sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 更新 sudo apt-get update 安装，这里介绍Desktop-Full安装: (Recommended) : ROS, rqt, rviz, robot-generic libraries, 2D/3D simulators, navigation and 2D/3D perception sudo apt-get install ros-indigo-desktop-full 解决依赖 sudo rosdep init rosdep update 环境设置 echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc source ~/.bashrc 安装rosinstall,便利的工具 sudo apt-get install python-rosinstall 卸载Indigo 用apt-get方式安装indigo的，卸载使用如下命令： $ sudo apt-get remove ros-indigo-* 卸载成功的效果：就是/opt下的ROS文件夹indigo被删除 管理环境 在安装ROS期间，你会看到提示说需要 source 多个setup.*sh文件中的某一个，或者甚至提示添加这条'source'命令到你的启动脚本里面。这些操作是必须的，因为ROS是依赖于某种组合空间的概念，而这种概念就是通过配置脚本环境来实现的。这可以让针对不同版本或者不同软件包集的开发更加容易。 如果你在查找和使用ROS软件包方面遇到了问题，请确保你已经正确配置了脚本环境。一个检查的好方法是确保你已经设置了像ROS_ROOT和ROS_PACKAGE_PATH这样的环境变量，可以通过以下命令查看： $ export | grep ROS 如果发现没有配置，那这个时候你就需要'source'某些'setup.*sh’文件了。 ROS会帮你自动生成这些‘setup.*sh’文件，通过以下方式生成并保存在不同地方： 通过类似apt的软件包管理器安装ROS软件包时会生成setup.*sh文件。 在rosbuild workspaces中通过类似rosws的工具生成。 在编译 或 安装 catkin 软件包时自动生成。 注意： 在所有教程中你将会经常看到分别针对rosbuild 和 catkin的不同操作说明，这是因为目前有两种不同的方法可以用来组织和编译ROS应用程序。一般而言，rosbuild比较简单也易于使用，而catkin使用了更加标准的CMake规则，所以比较复杂，但是也更加灵活，特别是对于那些想整合外部现有代码或者想发布自己代码的人。关于这些如果你想了解得更全面请参阅catkin or rosbuild。 如果你是通过ubuntu上的 apt 工具来安装ROS的，那么你将会在'/opt/ros/<distro>/'目录中看到setup.*sh文件，然后你可以执行下面的source命令： # source /opt/ros/<distro>/setup.bash 请使用具体的ROS发行版名称代替<distro>。 比如你安装的是ROS Indigo，则上述命令改为： $ source /opt/ros/indigo/setup.bash 在每次打开终端时你都需要先运行上面这条命令后才能运行ros相关的命令，为了避免这一繁琐过程，你可以事先在.bashrc文件（初学者请注意：该文件是在当前系统用户的home目录下。）中添加这条命令，这样当你每次登录后系统已经帮你执行这些命令配置好环境。这样做也可以方便你在同一台计算机上安装并随时切换到不同版本的ROS（比如fuerte和groovy）。 此外，你也可以在其它系统平台上相应的ROS安装目录下找到这些setup.*sh文件。 catkin方式创建ROS工作空间 这些操作方法只适用于ROS Groovy及后期版本，对于ROS Fuerte及早期版本请选择rosbuild。 下面我们开始创建一个catkin 工作空间： $ mkdir -p ~/catkin_ws/src $ cd ~/catkin_ws/src 即使这个工作空间是空的（在'src'目录中没有任何软件包，只有一个CMakeLists.txt链接文件），你依然可以编译它： $ cd ~/catkin_ws/ $ catkin_make catkin_make命令在catkin 工作空间中是一个非常方便的工具。如果你查看一下当前目录应该能看到'build'和'devel'这两个文件夹。在'devel'文件夹里面你可以看到几个setup.sh文件。source这些文件中的任何一个都可以将当前工作空间设置在ROS工作环境的最顶层，想了解更多请参考catkin文档。接下来首先source一下新生成的setup.sh文件： $ source devel/setup.bash 要想保证工作空间已配置正确需确保ROS_PACKAGE_PATH环境变量包含你的工作空间目录，采用以下命令查看： $ echo $ROS_PACKAGE_PATH /home/youruser/catkin_ws/src:/opt/ros/indigo/share:/opt/ros/indigo/stacks youruser为用户目录 到此你的工作环境已经搭建完成，接下来可以继续学习 ROS文件系统教程.
ROS入门教程-ROS文件系统介绍 说明： 本教程介绍ROS文件系统概念，包括命令行工具roscd、rosls和rospack的使用。 针对rosbuild方式 预备工作 ROS文件系统中的基本概念 文件系统工具 使用rospack和rosstack 使用roscd roscd的特殊用法 使用 rosls Tab Completion 回顾 预备工作 本教程中我们将会用到ros-tutorials程序包，请先安装： $ sudo apt-get install ros-<distro>-ros-tutorials 将替换成你所安装的版本（比如Jade、Indigo、hydro、groovy、fuerte等）。 ROS文件系统中的基本概念 1.Packages: Package是ROS系统中最底层最基本的组织，里面存放各种文件:库、工具、可执行文件等. 2.Manifest: 一个package描述xml文件，定义package之间的依赖关系. 3.Stacks: package的集合，比package这个概念高一级别 4.Stack Manifest: 作用类似package manifest文件，但是它是针对stack的. 在文件系统中很容易识别package和stack: 1.package是一个包含 manifest.xml 文件的目录. 2.stack是一个包含 stack.xml 文件的目录. 文件系统工具 ROS中大量代码分散在众多的packages和stacks之中. 命令工具ls和cd已不能满足检索要求。 因此ROS提供了一套自己的命令工具来完成与这些命令相似的工作. 使用rospack和rosstack rospack和rosstack命令都包含于rospack package中. 两个命令用于获取packages 和stacks的信息. 教程中我们只提及命令的find的参数,作用是返回相应package或者stack的目录路径. 用法: $ rospack find [package_name] $ rosstack find [stack_name] 例子: $ rospack find roscpp 得到结果: YOUR_INSTALL_PATH/stacks/ros_comm/clients/cpp/roscpp 举例，如果在Ubuntu下使用编译好的软件包安装了ROS Electric版本 将会得到如下结果: /opt/ros/electric/stacks/ros_comm/clients/cpp/roscpp 使用roscd roscd包含于 rosbash package中. 该命令用于改变当前目录到指定的package或者stack的目录(cd). 用法: $ roscd [locationname[/subdir]] 例子: $ roscd roscpp 为了验证我们已经切换到了roscpp package 目录. 我们使用unix的命令查看一下pwd: $ pwd 得到结果: YOUR_INSTALL_PATH/stacks/ros_comm/clients/cpp/roscpp 现在可以看到结果: YOUR_INSTALL_PATH/stacks/ros_comm/clients/cpp/roscpp 和先前rospack find得到的是一样的. 命令roscd及其它的ROS命令仅适用于环境变量$ROS_PACKAGE_PATH中存在的目录路径. 使用下面的命令查看环境变量$ROS_PACKAGE_PATH: $ echo $ROS_PACKAGE_PATH 如果还没有编辑过$ROS_PACKAGE_PATH 应该显示结果如下: YOUR_INSTALL_PATH/stacks $ROS_PACKAGE_PATH可以添加任意目录路径，目录路径之间 ':' 分开。 子目录 roscd也能够直接进入一个 package 或 stack的子目录中. 例如: $ roscd roscpp/include $ pwd 得到结果: YOUR_INSTALL_PATH/stacks/ros_comm/clients/cpp/roscpp/include roscd的特殊用法 有几个roscd的特殊用法. roscd 不带任何参数 不带参数时roscd直接进入环境变量 $ROS_ROOT定义的目录. 例如: $ roscd $ pwd 得到结果: YOUR_INSTALL_PATH/ros 这个目录就是环境变量$ROS_ROOT定义的. 例如: $ echo $ROS_ROOT 得到结果: YOUR_INSTALL_PATH/ros roscd log roscd log命令切换到ROS储存日志文件的目录。 注意:如果从未运行过任何ROS程序，命令会返回目录不存在的错误。 例如: $ roscd log 使用 rosls rosls包含于rosbash package中. 作用是列出指定的package或stack中的文件及目录. 用法: $ rosls [locationname[/subdir]] 例子: $ rosls roscpp_tutorials 得到结果: add_two_ints_client listener listener_with_userdata srv add_two_ints_server listener_async_spin Makefile srv_gen add_two_ints_server_class listener_class manifest.xml talker anonymous_listener listener_multiple node_handle_namespaces time_api babbler listener_single_message notify_connect timers bin listener_threaded_spin parameters CMakeLists.txt listener_unreliable ROS_NOBUILD custom_callback_processing listener_with_tracked_object src Tab Completion 在键盘输入ROS命令及目录文件名时，使用tab键可以自动补齐剩余的命令字符。 例如: $ roscd roscpp_tut< now push the TAB key > 按下 TAB 键后, 命令行会自动补齐. $ roscd roscpp_tutorials/ 如果存在有歧义的package时，可以连续按下tab键将会切换显示所有相关的ROS package名称。 例如: $ roscd tur< now push the TAB key > 按下 TAB 键后, 命令行会如下显示: $ roscd turtle 但是，例子中有多个packages开头包含字符turtle. 试着再次按下 TAB 键. 这会切换显示所有的以字符turtle开头的ROS packages。 turtle_actionlib/ turtlesim/ turtle_tf/ 得到结果： $ roscd turtle 现在turtle后面输入s，然后按下 TAB $ roscd turtles< now push the TAB key > 因为只有一个package 以字符turtles开头,所以得到结果如下: $ roscd turtlesim/ 回顾 ROS 工具命令有个固定的命名格式: rospack = ros + pack(age) rosstack = ros + stack roscd = ros + cd rosls = ros + ls 针对catkin方式 预备工作 快速了解文件系统概念 文件系统工具 使用 rospack 使用 roscd roscd log 使用 rosls Tab 自动完成输入 回顾 预备工作 本教程中我们将会用到ros-tutorials程序包，请先安装： $ sudo apt-get install ros-<distro>-ros-tutorials 将替换成你所安装的版本（比如Jade、Indigo、hydro、groovy、fuerte等）。 快速了解文件系统概念 1.Packages: 软件包，是ROS应用程序代码的组织单元，每个软件包都可以包含程序库、可执行文件、脚本或者其它手动创建的东西。 2.Manifest (package.xml): 清单，是对于'软件包'相关信息的描述,用于定义软件包相关元信息之间的依赖关系，这些信息包括版本、维护者和许可协议等。 注意: rosbuild的用户也许会考虑功能包集（stack）去哪了。事实上，为了简化代码量且更好的支持兼容各发行版的功能包，功能包集的概念已经在catkin中被移除。 注意: 在catkin中，你可以定义综合包来集成相似包并实现将多个包驻留在单个VCS库。这两个特征可替换功能包集的功能。 文件系统工具 程序代码是分布在众多ROS软件包当中，当使用命令行工具（比如ls和cd）来浏览时会非常繁琐，因此ROS提供了专门的命令工具来简化这些操作。 使用 rospack rospack允许你获取软件包的有关信息。 在本教程中，我们只涉及到rospack中find参数选项，该选项可以返回软件包的路径信息。 用法： # rospack find [包名称] 示例： $ rospack find roscpp 应输出： YOUR_INSTALL_PATH/share/roscpp 如果你是在Ubuntu Linux操作系统上通过apt来安装ROS，你应该会准确地看到： /opt/ros/groovy/share/roscpp 使用 roscd roscd是rosbash命令集中的一部分，它允许你直接切换(cd)工作目录到某个软件包或者软件包集当中。 用法： # roscd [本地包名称[/子目录]] 示例： $ roscd roscpp 为了验证我们已经切换到了roscpp软件包目录下，现在我们可以使用Unix命令pwd来输出当前工作目录： $ pwd 你应该会看到： YOUR_INSTALL_PATH/share/roscpp 你可以看到YOUR_INSTALL_PATH/share/roscpp和之前使用rospack find得到的路径名称是一样的。 注意：就像ROS中的其它工具一样，roscd只能切换到那些路径已经包含在ROS_PACKAGE_PATH环境变量中的软件包 要查看ROS_PACKAGE_PATH中包含的路径可以输入： $ echo $ROS_PACKAGE_PATH 你的ROS_PACKAGE_PATH环境变量应该包含那些保存有ROS软件包的路径，并且每个路径之间用冒号分隔开来。 一个典型的ROS_PACKAGE_PATH环境变量如下： /opt/ros/groovy/base/install/share:/opt/ros/groovy/base/install/stacks 跟其他路径环境变量类似，你可以在ROS_PACKAGE_PATH中添加更多其它路径，每条路径使用冒号':'分隔。 子目录 使用roscd也可以切换到一个软件包或软件包集的子目录中。 执行： $ roscd roscpp/cmake $ pwd 应该会看到： YOUR_INSTALL_PATH/share/roscpp/cmake roscd log 使用roscdlog可以切换到ROS保存日记文件的目录下。 需要注意的是，如果你没有执行过任何ROS程序，系统会报错说该目录不存在。 如果你已经运行过ROS程序，那么可以尝试： $ roscd log 使用 rosls rosls是rosbash命令集中的一部分，它允许你直接按软件包的名称而不是绝对路径执行ls命令（罗列目录）。 用法： # rosls [本地包名称[/子目录]] 示例： $ rosls roscpp_tutorials 应输出： cmake package.xml srv Tab 自动完成输入 当要输入一个完整的软件包名称时会变得比较繁琐。 在之前的例子中roscpp_tutorials是个相当长的名称，幸运的是，一些ROS工具支持TAB 自动完成输入的功能。 输入： # roscd roscpp_tut< 现在请按TAB键 > 当按TAB键后，命令行中应该会自动补充剩余部分： $ roscd roscpp_tutorials/ 这应该有用，因为roscpp_tutorials是当前唯一一个名称以roscpp_tut作为开头的ROS软件包。 现在尝试输入： # roscd tur<现在请按TAB键 > 按TAB键后，命令应该会尽可能地自动补充完整： $ roscd turtle 但是，在这种情况下有多个软件包是以turtle开头，当再次按TAB键后应该会列出所有以turtle开头的ROS软件包： turtle_actionlib/ turtlesim/ turtle_tf/ 这时在命令行中你应该仍然只看到： $ roscd turtle 现在在turtle后面输入s然后按TAB键： # roscd turtles< 请按TAB键 > 因为只有一个软件包的名称以turtles开头，所以你应该会看到： $ roscd turtlesim/ 回顾 你也许已经注意到了ROS命令工具的的命名方式： rospack = ros + pack(age) roscd = ros + cd rosls = ros + ls 这种命名方式在许多ROS命令工具中都会用到。 到此你已经了解了ROS的文件系统结构，接下来我们开始创建一个工作空间。
ROS入门教程-创建ROS程序包 说明： 本教程介绍如何使用roscreate-pkg或catkin创建一个新程序包,并使用rospack查看程序包的依赖关系。 针对CATKIN方式 目录 1.一个catkin程序包由什么组成? 2.在catkin工作空间中的程序包 3.创建一个catkin程序包 4.程序包依赖关系 5.一级依赖 6.间接依赖 7.自定义你的程序包 8.自定义 package.xml 9.描述标签 10.维护者标签 11.许可标签 12.依赖项标签 13.最后完成的 package.xml 14.自定义 CMakeLists.txt 一个catkin程序包由什么组成? 一个程序包要想称为catkin程序包必须符合以下要求： 1.该程序包必须包含catkin compliant package.xml文件，这个package.xml文件提供有关程序包的元信息。 2.程序包必须包含一个catkin 版本的CMakeLists.txt文件，而Catkin metapackages中必须包含一个对CMakeList.txt文件的引用。 3.每个目录下只能有一个程序包。这意味着在同一个目录下不能有嵌套的或者多个程序包存在。 最简单的程序包也许看起来就像这样： my_package/ CMakeLists.txt package.xml 在catkin工作空间中的程序包 开发catkin程序包的一个推荐方法是使用catkin工作空间，但是你也可以单独开发(standalone)catkin 软件包。 一个简单的工作空间也许看起来像这样： workspace_folder/ -- WORKSPACE工作空间 src/ -- SOURCE SPACE 源码目录 CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin package_1/ CMakeLists.txt -- CMakeLists.txt file for package_1 package.xml -- Package manifest for package_1 ... package_n/ CMakeLists.txt -- CMakeLists.txt file for package_n package.xml -- Package manifest for package_n 在继续本教程之前请先按照创建catkin工作空间教程创建一个空白的catkin工作空间。 创建一个catkin程序包 本部分教程将演示如何使用catkin_create_pkg命令来创建一个新的catkin程序包以及创建之后都能做些什么。 首先切换到之前通过创建catkin工作空间教程创建的catkin工作空间中的src目录下： # You should have created this in the Creating a Workspace Tutorial $ cd ~/catkin_ws/src 现在使用catkin_create_pkg命令来创建一个名为'beginner_tutorials'的新程序包 这个程序包依赖于std_msgs、roscpp和rospy： $ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp 这将会创建一个名为beginner_tutorials的文件夹 这个文件夹里面包含一个package.xml文件和一个CMakeLists.txt文件 这两个文件都已经自动包含了部分你在执行catkin_create_pkg命令时提供的信息。 catkin_create_pkg命令会要求你输入package_name，如果有需要你还可以在后面添加一些需要依赖的其它程序包： # This is an example, do not try to run this # catkin_create_pkg <package_name> [depend1] [depend2] [depend3] catkin_create_pkg命令也有更多的高级功能，这些功能在catkin/commands/catkin_create_pkg中有描述。 程序包依赖关系 一级依赖 之前在使用catkin_create_pkg命令时提供了几个程序包作为依赖包 现在我们可以使用rospack命令工具来查看一级依赖包。 (Jan 9, 2013)groovy版本的rospack 有个已经修复的BUG报告，它会可能要花时间显示包依赖。 如果你看到类似问题，可以忽略如下命令： $ rospack depends1 beginner_tutorials 效果： std_msgs rospy roscpp 就像你看到的rospack列出了在运行catkin_create_pkg命令时作为参数的依赖包 这些依赖包随后保存在package.xml文件中。 $ roscd beginner_tutorials $ cat package.xml 效果： <package> ... <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> ... </package> 间接依赖 在很多情况中，一个依赖包还会有它自己的依赖包，比如rospy还有其它依赖包。 (Jan 9, 2013)groovy版本的rospack 有个已经修复的BUG报告，它会可能要花时间显示包依赖。 如果你看到类似问题，可以忽略如下命令： $ rospack depends1 rospy 效果： genpy rosgraph rosgraph_msgs roslib std_msgs 一个程序包还可以有好几个间接的依赖包，幸运的是使用rospack可以递归检测出所有的依赖包。 例如： $ rospack depends beginner_tutorials 效果： cpp_common rostime roscpp_traits roscpp_serialization genmsg genpy message_runtime rosconsole std_msgs rosgraph_msgs xmlrpcpp roscpp rosgraph catkin rospack roslib rospy 自定义你的程序包 本部分教程将剖析catkin_create_pkg命令生成的每个文件并详细描述这些文件的组成部分以及如何自定义这些文件。 自定义 package.xml 自动生成的package.xml文件应该在你的新程序包中。 现在让我们一起来看看新生成的package.xml文件以及每一个需要你注意的标签元素。 描述标签 首先更新描述标签： <description>The beginner_tutorials package</description> 将描述信息修改为任何你喜欢的内容，但是按照约定第一句话应该简短一些，因为它覆盖了程序包的范围。 如果用一句话难以描述完全那就需要换行了。 维护者标签 接下来是维护者标签： 7 8 9 <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> --> 10 <maintainer email="user@todo.todo">user</maintainer> 这是package.xml中要求填写的一个重要标签，因为它能够让其他人联系到程序包的相关人员。 至少需要填写一个维护者名称，但如果有需要的话你可以添加多个。 除了在标签里面填写维护者的名称外，还应该在标签的email属性中填写邮箱地址： 7 <maintainer email="you@yourdomain.tld">Your Name</maintainer> 许可标签 再接下来是许可标签，同样的也需要： 12 13 14 15 <license>TODO</license> 你应该选择一种许可协议并将它填写到这里。 一些常见的开源许可协议有BSD、MIT、Boost Software License、GPLv2、GPLv3、LGPLv2.1和LGPLv3。 你可以在Open Source Initiative中阅读其中的若干个许可协议的相关信息。 对于本教程我们将使用BSD协议，因为ROS核心组件的剩余部分已经使用了该协议： 8 <license>BSD</license> 依赖项标签 接下来的标签用来描述程序包的各种依赖项，这些依赖项分为: build_depend buildtool_depend run_depend test_depend 关于这些标签的更详细介绍请参考Catkin Dependencies相关的文档。 在之前的操作中，因为我们将std_msgs、roscpp、rospy作为catkin_create_pkg命令的参数，所以生成的依赖项看起来如下： 27 28 29 30 31 <!-- <build_depend>genmsg</build_depend> --> 32 33 <!-- <buildtool_depend>catkin</buildtool_depend> --> 34 35 <!-- <run_depend>python-yaml</run_depend> --> 36 37 <!-- <test_depend>gtest</test_depend> --> 38 <buildtool_depend>catkin</buildtool_depend> 39 <build_depend>roscpp</build_depend> 40 <build_depend>rospy</build_depend> 41 <build_depend>std_msgs</build_depend> 除了catkin中默认提供的buildtool_depend，所有我们列出的依赖包都已经被添加到build_depend标签中。 在本例中，因为在编译和运行时我们需要用到所有指定的依赖包，因此还需要将每一个依赖包分别添加到run_depend标签中： 12 <buildtool_depend>catkin</buildtool_depend> 13 14 <build_depend>roscpp</build_depend> 15 <build_depend>rospy</build_depend> 16 <build_depend>std_msgs</build_depend> 17 18 <run_depend>roscpp</run_depend> 19 <run_depend>rospy</run_depend> 20 <run_depend>std_msgs</run_depend> 最后完成的 package.xml 现在看下面最后去掉了注释和未使用标签后的package.xml文件就显得更加简洁了： 1 <?xml version="1.0"?> 2 <package> 3 <name>beginner_tutorials</name> 4 <version>0.1.0</version> 5 <description>The beginner_tutorials package</description> 6 7 <maintainer email="you@yourdomain.tld">Your Name</maintainer> 8 <license>BSD</license> 9 <url type="website">http://wiki.ros.org/beginner_tutorials</url> 10 <author email="you@yourdomain.tld">Jane Doe</author> 11 12 <buildtool_depend>catkin</buildtool_depend> 13 14 <build_depend>roscpp</build_depend> 15 <build_depend>rospy</build_depend> 16 <build_depend>std_msgs</build_depend> 17 18 <run_depend>roscpp</run_depend> 19 <run_depend>rospy</run_depend> 20 <run_depend>std_msgs</run_depend> 21 22 </package> 自定义 CMakeLists.txt 到此，这个包含程序包元信息的package.xml文件已经按照需要完成了裁剪整理，现在你可以继续下面的教程了。 catkin_create_pkg命令生成的CMakeLists.txt文件将在后续关于编译ROS程序代码的教程中讲述。 针对rosbuild方式 目录 1.使用roscreate 2.创建新的ROS包 3.直接包依赖 4.间接包依赖 5.ROS 客户端库 6.回顾 使用roscreate 在我们创建包之前，看看roscreate-pkg命令行工具，它会创建新的ROS包 所有的ROS包有类似文件结构：manifests, CMakeLists.txt, mainpage.dox, and Makefiles roscreate-pkg创建方法消除手工创建新的包很多繁琐的工作，消除了常见的错误(如：用手打字建立文件和表现引起的)。 创建新包在目前的目录： # roscreate-pkg [package_name] 你能指定包的依赖： # roscreate-pkg [package_name] [depend1] [depend2] [depend3] 创建新ROS包 我们打算进入根目录或项目目录，来创建我们的beginner_tutorials包 这个包依赖std_msgs, roscpp, 和rospy 进入 ~/fuerte_workspace/sandbox 目录: $ cd ~/fuerte_workspace/sandbox 如果是Fuerte以上的版本： $ roscd $ cd sandbox 创建包: $ roscreate-pkg beginner_tutorials std_msgs rospy roscpp 效果: Creating package directory ~/fuerte_workspace/sandbox/beginner_tutorials Creating include directory ~/fuerte_workspace/sandbox/beginner_tutorials/include/beginner_tutorials Creating cpp source directory ~/ros/ros_tutorials/beginner_tutorials/src Creating python source directory ~/fuerte_workspace/sandbox/beginner_tutorials/src/beginner_tutorials Creating package file ~/fuerte_workspace/sandbox/beginner_tutorials/Makefile Creating package file ~/fuerte_workspace/sandbox/beginner_tutorials/manifest.xml Creating package file ~/fuerte_workspace/sandbox/beginner_tutorials/CMakeLists.txt Creating package file ~/fuerte_workspace/sandbox/beginner_tutorials/mainpage.dox 请编辑beginner_tutorials/manifest.xml和mainpage.dox，完成创建包。 需要花时间阅读beginner_tutorials/manifest.xml文件 它在ROS系统里起到重要作用，定义了包如何构建，运行和记录 现在需要确保ROS能找到新包，常常在发生变化之后，使用rospack profile识别新目录。 例如： $ rospack profile $ rospack find beginner_tutorials 效果： YOUR_PACKAGE_PATH/beginner_tutorials 如果失败，意味着ROS不能找到新包，那问题可能出在ROS_PACKAGE_PATH 请查阅SVN的安装说明或来自二进制的(依赖你安装的ROS)。 如果你已经创建或增加包在已存在的包路径之外，你需要修改ROS_PACKAGE_PATH环境变量去包含新的位置。 尝试重source你的工作空间的setup.sh source ~/workspace/devel/setup.sh 尝试移动的包的目录 $ roscd beginner_tutorials $ pwd 效果： YOUR_PACKAGE_PATH/beginner_tutorials 直接依赖 当使用roscreate-pkg，一些包依赖会提供。这些直接依赖通过rospack可以查看 (Jan 9, 2013)groovy版本的rospack 有个已经修复的BUG报告，它会可能要花时间显示包依赖。 如果你看到类似问题，可以忽略如下命令： $ rospack depends1 beginner_tutorials 效果： std_msgs rospy roscpp 正如看到的rospack列出相同的依赖名称(在roscreate-pkg使用的) 这些依赖是存在manifest 文件，浏览manifest.xml $ roscd beginner_tutorials $ cat manifest.xml 内容如下： <package> ... <depend package="std_msgs"> <depend package="rospy"> <depend package="roscpp"> </package> 间接依赖 在很多情况下，依赖包也有自己的依赖包 例如：rospy有其他依赖 (Jan 9, 2013)groovy版本的rospack 有个已经修复的BUG报告，它会可能要花时间显示包依赖。 如果你看到类似问题，可以忽略如下命令： $ rospack depends1 rospy 效果： roslib roslang 一个包有一些间接依赖，幸运的是rospack可以递归所有的嵌套的依赖 $ rospack depends beginner_tutorials 效果： rospack roslib std_msgs rosgraph_msgs rosbuild roslang rospy cpp_common roscpp_traits rostime roscpp_serialization xmlrpcpp rosconsole roscpp 注意：在Fuerte版本，列表更短： std_msgs roslang rospy roscpp ROS客户端库 你可能担心之前例子中的rospy和roscppy依赖。 rospy和roscpp客户端库. 客户端库允许不同编程语言在ROS中实现通讯 rospy是Python的客户端库 roscpp是C++的客户端库 回顾 列出使用的命令： 1.roscreate-pkg = ros+create-pkg : 生成ROS包需要的文件 2.rospack = ros+pack(age) : 提供ROS package相关的信息 3.rosstack = ros+stack : 提供ROS stack 相关的信息 现在你已经创建了一个新的ROS程序包，接下来我们开始编译这个程序包
编译ROS程序包 说明： 本教程介绍ROS程序包的编译方法 针对ROSBUILD方式 目录 1.Building Packages 1.1 使用rosmake 1.2 rosmake 多个ROS package 2.Review 构建包 一旦安装了所需的系统依赖项，我们就可以编译刚刚创建的package了。 使用rosmake rosmake是跟make类似的小工具, 但它会针对ROS做一些相应的处理。 当你执行rosmake beginner_tutorials命令, 编译beginner_tutorials 包,并按照正确的顺序链接所依赖的package。 因为我们在创建的ROS包的时候加入了对 rospy, roscpp, 和std_msgs 的依赖，所以这些package(以及它们的依赖项,等等，如此反复) 都将会被rosmake所编译。 使用方法: rosmake [package] 执行: $ rosmake beginner_tutorials 这条指令的执行需要一些时间。 在这期间，你会看到如下的信息输出： [ rosmake ] No package specified. Building ['beginner_tutorials'] [ rosmake ] Logging to directory [ rosmake ] /home/dbking/.ros/rosmake_output-2009-09-22-03-17-14 [ rosmake ] [ 0 of 18 Completed ] [rosmake-0] >>> genmsg_cpp >>> [ make ] [rosmake-0] <<< genmsg_cpp <<< [PASS] [ 0.39 seconds ] [ rosmake ] [ 1 of 18 Completed ] ... ... ... [ rosmake ] [ 17 of 18 Completed ] [rosmake-0] >>> beginner_tutorials >>> [ make ] [rosmake-0] <<< beginner_tutorials <<< [PASS] [ 0.79 seconds ] 在Fuerte版本, 依赖项被大规模精简，所以几乎会马上输出： [ rosmake ] rosmake starting... [ rosmake ] Packages requested are: ['beginner_tutorials'] [ rosmake ] Logging to directory /home/alex/.ros/rosmake/rosmake_output-20120603-082414 [ rosmake ] Expanded args ['beginner_tutorials'] to: ['beginner_tutorials'] [rosmake-0] Starting >>> std_msgs [ make ] [rosmake-1] Starting >>> roslang [ make ] [rosmake-0] Finished <<< std_msgs ROS_NOBUILD in package std_msgs No Makefile in package std_msgs [rosmake-1] Finished <<< roslang ROS_NOBUILD in package roslang No Makefile in package roslang [rosmake-1] Starting >>> rospy [ make ] [rosmake-2] Starting >>> roscpp [ make ] [rosmake-1] Finished <<< rospy ROS_NOBUILD in package rospy No Makefile in package rospy [rosmake-2] Finished <<< roscpp ROS_NOBUILD in package roscpp No Makefile in package roscpp [rosmake-2] Starting >>> beginner_tutorials [ make ] [rosmake-2] Finished <<< beginner_tutorials [PASS] [ 1.14 seconds ] [ rosmake ] Results: [ rosmake ] Built 5 packages with 0 failures. [ rosmake ] Summary output to directory [ rosmake ] /home/alex/.ros/rosmake/rosmake_output-20120603-082414 rosmake 多个ROS package 同样，我们可以利用 rosmake同时编译多个package。 使用方法: rosmake [package1] [package2] [package3] 回顾 下面，复习一下刚刚使用过的指令： 1.rosdep = ros+dep(endencies) : 安装package所需系统依赖项的小工具 2.rosmake = ros+make : 编译 ROS package 针对CATKIN方式 目录 1.编译程序包 2.使用 catkin_make 3.开始编译你的程序包 编译程序包 一旦安装了所需的系统依赖项，我们就可以开始编译刚才创建的程序包了。 注意: 如果你是通过apt或者其它软件包管理工具来安装ROS的，那么系统已经默认安装好所有依赖项。 记得事先source你的环境配置(setup)文件，在Ubuntu中的操作指令如下： $ source /opt/ros/groovy/setup.bash 使用 catkin_make catkin_make 是一个命令行工具，它简化了catkin的标准工作流程。 你可以认为catkin_make是在CMake标准工作流程中依次调用了cmake 和 make。 使用方法: # 在catkin工作空间下 $ catkin_make [make_targets] [-DCMAKE_VARIABLES=...] CMake标准工作流程主要可以分为以下几个步骤： 注意: 如果你运行以下命令是无效的，因为它只是一个演示CMake工作流程的例子。 # 在一个CMake项目里 $ mkdir build $ cd build $ cmake .. $ make $ make install # (可选) 每个CMake工程在编译时都会执行这个操作过程。 相反，多个catkin项目可以放在工作空间中一起编译，工作流程如下： # In a catkin workspace $ catkin_make $ catkin_make install # (可选) 上述命令会编译src文件夹下的所有catkin工程。想更深入了解请参考REP128。 如果你的源代码不在默认工作空间中（~/catkin_ws/src) 比如说存放在了my_src中，那么你可以这样来使用catkin_make: 注意: 运行以下命令时无效的，因为my_src不存在。 # In a catkin workspace $ catkin_make --source my_src $ catkin_make install --source my_src # (optionally) 对于catkin_make更高级的使用方法，请参考catkin/commands/catkin_make 开始编译你的程序包 对于正要马上编译自己代码的读者，请同时看一下后面的(C++)/(Python)教程 因为你可能需要修改CMakeLists.txt文件。 按照之前的创建一个ROS程序包教程，你应该已经创建好了一个catkin 工作空间 和一个名为beginner_tutorials的catkin 程序包。 现在切换到catkin workspace 并查看src文件夹： $ cd ~/catkin_ws/ $ ls src 效果： beginner_tutorials/ CMakeLists.txt@ 你可以看到一个名为beginner_tutorials的文件夹，这就是你在之前的 catkin_create_pkg教程里创建的。 现在我们可以使用catkin_make来编译它了: $ catkin_make 你可以看到很多cmake和make输出的信息： Base path: /home/user/catkin_ws Source space: /home/user/catkin_ws/src Build space: /home/user/catkin_ws/build Devel space: /home/user/catkin_ws/devel Install space: /home/user/catkin_ws/install #### #### Running command: "cmake /home/user/catkin_ws/src -DCATKIN_DEVEL_PREFIX=/home/user/catkin_ws/devel -DCMAKE_INSTALL_PREFIX=/home/user/catkin_ws/install" in "/home/user/catkin_ws/build" #### -- The C compiler identification is GNU 4.2.1 -- The CXX compiler identification is Clang 4.0.0 -- Checking whether C compiler has -isysroot -- Checking whether C compiler has -isysroot - yes -- Checking whether C compiler supports OSX deployment target flag -- Checking whether C compiler supports OSX deployment target flag - yes -- Check for working C compiler: /usr/bin/gcc -- Check for working C compiler: /usr/bin/gcc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Using CATKIN_DEVEL_PREFIX: /tmp/catkin_ws/devel -- Using CMAKE_PREFIX_PATH: /opt/ros/groovy -- This workspace overlays: /opt/ros/groovy -- Found PythonInterp: /usr/bin/python (found version "2.7.1") -- Found PY_em: /usr/lib/python2.7/dist-packages/em.pyc -- Found gtest: gtests will be built -- catkin 0.5.51 -- BUILD_SHARED_LIBS is on -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- ~~ traversing packages in topological order: -- ~~ - beginner_tutorials -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- +++ add_subdirectory(beginner_tutorials) -- Configuring done -- Generating done -- Build files have been written to: /home/user/catkin_ws/build #### #### Running command: "make -j4" in "/home/user/catkin_ws/build" #### catkin_make首先输出它所使用到的每个空间所在的路径。 更多关于空间的信息，请参考REP128和catkin/workspaces。 需要注意的是由于这些空间存在默认配置的原因，有几个文件夹已经在catkin工作空间自动生成了，使用ls查看: $ ls 效果： build devel src build目录是build space的默认所在位置，同时cmake和make也是在这里被调用来配置并编译你的程序包。 devel目录是devel space的默认所在位置, 同时也是在你安装程序包之前存放可执行文件和库文件的地方。 现在我们已成功编译了一个ROS程序包，接下来我们将介绍ROS节点.
ROS入门教程-理解ROS节点 说明： 本教程主要介绍 ROS 图（graph）概念 并讨论roscore、rosnode和 rosrun 命令行工具的使用。 目录 先决条件 图概念概述 节点 客户端库 roscore 使用rosnode 使用 rosrun 回顾 先决条件 在本教程中我们将使用到一个轻量级的模拟器，请使用以下命令来安装： $ sudo apt-get install ros-<distro>-ros-tutorials 用你使用的ROS发行版本名称(例如electric、fuerte、groovy、hydro等)替换掉''。 图概念概述 Nodes:节点,一个节点即为一个可执行文件，它可以通过ROS与其它节点进行通信。 Messages:消息，消息是一种ROS数据类型，用于订阅或发布到一个话题。 Topics:话题,节点可以发布消息到话题，也可以订阅话题以接收消息。 Master:节点管理器，ROS名称服务 (比如帮助节点找到彼此)。 rosout: ROS中相当于stdout/stderr。 roscore: 主机+ rosout + 参数服务器 (参数服务器会在后面介绍)。 节点 一个节点其实只不过是ROS程序包中的一个可执行文件。 ROS节点可以使用ROS客户库与其他节点通信。 节点可以发布或接收一个话题。 节点也可以提供或使用某种服务。 客户端库 ROS客户端库允许使用不同编程语言编写的节点之间互相通信: rospy = python 客户端库 roscpp = c++ 客户端库 rosjs = javascripts客户端库 rosjava = java客户端库 roscore roscore是你在运行所有ROS程序前首先要运行的命令。 请运行: $ roscore 然后你会看到类似下面的输出信息: ... logging to ~/.ros/log/9cf88ce4-b14d-11df-8a75-00251148e8cf/roslaunch- machine_name-13039.log Checking log directory for disk usage. This may take awhile. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. started roslaunch server http://machine_name:33919/ ros_comm version 1.4.7 SUMMARY ======== PARAMETERS * /rosversion * /rosdistro NODES auto-starting new master process[master]: started with pid [13054] ROS_MASTER_URI=http://machine_name:11311/ setting /run_id to 9cf88ce4-b14d-11df-8a75-00251148e8cf process[rosout-1]: started with pid [13067] started core service [/rosout] 如果roscore运行后无法正常初始化，很有可能是存在网络配置问题。 参见 网络设置——单机设置 如果roscore不能初始化并提示缺少权限，这可能是因为~/.ros文件夹归属于root用户（只有root用户才能访问） 修改该文件夹的用户归属关系： $ sudo chown -R <your_username> ~/.ros 使用rosnode 打开一个新的终端, 可以使用 rosnode 像运行roscore一样看看在 运行什么... 注意: 当打开一个新的终端时，你的运行环境会复位，同时你的~/.bashrc文件会复原。 如果你在运行类似于rosnode的指令时出现一些问题 也许你需要添加一些环境设置文件到你的~/.bashrc或者手动重新配置他们。 rosnode显示当前运行的ROS节点信息。 rosnode list指令列出活跃的节点: $ rosnode list 你会看到: /rosout 这表示当前只有一个节点在运行: rosout。 因为这个节点用于收集和记录节点调试输出信息，所以它总是在运行的。 rosnode info命令返回的是关于一个特定节点的信息。 $ rosnode info /rosout 这给了我们更多的一些有关于rosout的信息, 例如，事实上由它发布/rosout_agg ------------------------------------------------------------------------ Node [/rosout] Publications: * /rosout_agg [rosgraph_msgs/Log] Subscriptions: * /rosout [unknown type] Services: * /rosout/set_logger_level * /rosout/get_loggers contacting node http://machine_name:54614/ ... 现在，让我们看看更多的节点。 为此，我们将使用rosrun弹出另一个节点。 使用 rosrun rosrun允许你使用包名直接运行一个包内的节点(而不需要知道这个包的路径)。 用法: $ rosrun [package_name] [node_name] 现在我们可以运行turtlesim包中的 turtlesim_node。 然后, 在一个 新的终端: $ rosrun turtlesim turtlesim_node 你会看到 turtlesim 窗口: 注意: 这里的 turtle 可能和你的 turtlesim 窗口不同。 别担心，这里有许多版本的turtle ，而你的是一个惊喜! 在一个 新的终端: $ rosnode list 你会看见类似于: /rosout /turtlesim ROS的一个强大特性就是你可以通过命令行重新配置名称。 关闭 turtlesim 窗口停止运行节点 (或者回到rosrun turtlesim终端并使用ctrl -C)。 现在让我们重新运行它，但是这一次使用Remapping Argument改变节点名称: $ rosrun turtlesim turtlesim_node __name:=my_turtle 现在，我们退回使用rosnodelist: $ rosnode list 你会看见类似于: /rosout /my_turtle 注意: 如果你仍看到 /turtlesim在列表中，这可能意味着你在终端中使用ctrl-C停止节点而不是关闭窗口 或者你没有$ROS_HOSTNAME环境变量，这在 Network Setup - Single Machine Configuration中有定义。 你可以尝试清除rosnode 列表，通过: $ rosnode cleanup 我们可以看到新的/my_turtle节点。 使用另外一个rosnode指令,ping来测试: $ rosnode ping my_turtle 效果： rosnode: node is [/my_turtle] pinging /my_turtle with a timeout of 3.0s xmlrpc reply from http://aqy:42235/ time=1.152992ms xmlrpc reply from http://aqy:42235/ time=1.120090ms xmlrpc reply from http://aqy:42235/ time=1.700878ms xmlrpc reply from http://aqy:42235/ time=1.127958ms 回顾 本节所涉及的内容: roscore = ros+core : master (提供为名称服务) + rosout (stdout/stderr) + parameter server (参数服务器) rosnode = ros+node : 获取节点信息的ROS工具 rosrun = ros+run : 运行节点工具 到这里，您已经了解了ROS节点是如何工作的，下一步，我们来了解一下 ROS话题。 如果您想关闭 turtlesim_node，请按下“Ctrl-C”
理解ROS话题 说明： 本教程介绍ROS话题（topics）以及如何使用rostopic 和 rxplot 命令行工具。 目录 roscore turtlesim 通过键盘远程控制turtle ROS Topics 使用 rqt_graph rostopic介绍 使用 rostopic echo 使用 rostopic list ROS Messages rostopic type 继续学习 rostopic 使用 rostopic pub 使用 rostopic hz 使用 rqt_plot roscore 首先确保roscore已经运行, 打开一个新的终端： $ roscore 如果你没有退出在上一篇教程中运行的roscore，那么你可能会看到下面的错误信息： roscore cannot run as another roscore/master is already running. Please kill other roscore/master processes before relaunching 这是正常的，因为只需要有一个roscore在运行就够了。 turtlesim 在本教程中我们也会使用到turtlesim，请在一个新的终端中运行： $ rosrun turtlesim turtlesim_node 通过键盘远程控制turtle 我们也需要通过键盘来控制turtle的运动，请在一个新的终端中运行： $ rosrun turtlesim turtle_teleop_key 效果： [ INFO] 1254264546.878445000: Started node [/teleop_turtle], pid [5528], bound on [aqy], xmlrpc port [43918], tcpros port [55936], logging to [~/ros/ros/log/teleop_turtle_5528.log], using [real] time Reading from keyboard --------------------------- Use arrow keys to move the turtle. 现在你可以使用键盘上的方向键来控制turtle运动了。 如果不能控制，请选中turtle_teleop_key所在的终端窗口以确保你的按键输入能够被捕获。 现在你可以控制turtle运动了，下面我们一起来看看这背后发生的事。 ROS Topics turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题来互相通信的。 turtle_teleop_key在一个话题上发布按键输入消息，而turtlesim则订阅该话题以接收该消息。 下面让我们使用rqt_graph来显示当前运行的节点和话题。 注意：如果你使用的是electric或更早期的版本，那么rqt是不可用的，请使用rxgraph代替。 使用 rqt_graph rqt_graph能够创建一个显示当前系统运行情况的动态图形。 rqt_graph是rqt程序包中的一部分。 如果你没有安装，请通过以下命令来安装： $ sudo apt-get install ros-<distro>-rqt $ sudo apt-get install ros-<distro>-rqt-common-plugins 请使用你的ROS版本名称（比如hydro、indigo等）来替换掉。 在一个新终端中运行: $ rosrun rqt_graph rqt_graph 你会看到类似下图所示的图形： 如果你将鼠标放在/turtle1/command_velocity上方，相应的ROS节点（蓝色和绿色）和话题（红色）就会高亮显示。 正如你所看到的turtlesim_node和turtle_teleop_key节点正通过一个名为/turtle1/command_velocity的话题来互相通信。 rostopic介绍 rostopic命令工具能让你获取有关ROS话题的信息。 你可以使用帮助选项查看rostopic的子命令： $ rostopic -h 显示： rostopic bw display bandwidth used by topic rostopic echo print messages to screen rostopic hz display publishing rate of topic rostopic list print information about active topics rostopic pub publish data to topic rostopic type print topic type 接下来我们将使用其中的一些子命令来查看turtlesim。 使用 rostopic echo rostopicecho可以显示在某个话题上发布的数据。 用法： rostopic echo [topic] 让我们在一个新终端中看一下turtle_teleop_key节点在/turtle1/command_velocit话题（非hydro版）上发布的数据。 $ rostopic echo /turtle1/command_velocity 如果你是用ROS Hydro 及其之后的版本（下同），请运行： $ rostopic echo /turtle1/cmd_vel 你可能看不到任何东西因为现在还没有数据发布到该话题上。 接下来我们通过按下方向键使turtle_teleop_key节点发布数据。 记住如果turtle没有动起来的话就需要你重新选中turtle_teleop_key节点运行时所在的终端窗口。 现在当你按下向上方向键时应该会看到下面的信息： --- linear: 2.0 angular: 0.0 --- linear: 2.0 angular: 0.0 --- linear: 2.0 angular: 0.0 --- linear: 2.0 angular: 0.0 --- linear: 2.0 angular: 0.0 或者在hrydro中如下： linear: x: 2.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 --- linear: x: 2.0 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0 --- 现在让我们再看一下rqt_graph（你可能需要刷新一下ROS graph）。 正如你所看到的rostopic echo(红色显示部分）现在也订阅了turtle1/command_velocity话题。 使用 rostopic list rostopic list能够列出所有当前订阅和发布的话题。 让我们查看一下list子命令需要的参数，在一个新终端中运行： $ rostopic list -h 显示： Usage: rostopic list [/topic] Options: -h, --help show this help message and exit -b BAGFILE, --bag=BAGFILE list topics in .bag file -v, --verbose list full details about each topic -p list only publishers -s list only subscribers 在rostopic list中使用verbose选项： $ rostopic list -v 这会显示出有关所发布和订阅的话题及其类型的详细信息。 Published topics: /turtle1/color_sensor [turtlesim/Color] 1 publisher /turtle1/command_velocity [turtlesim/Velocity] 1 publisher /rosout [roslib/Log] 2 publishers /rosout_agg [roslib/Log] 1 publisher /turtle1/pose [turtlesim/Pose] 1 publisher Subscribed topics: /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber /rosout [roslib/Log] 1 subscriber ROS Messages 话题之间的通信是通过在节点之间发送ROS消息实现的。 对于发布器(turtle_teleop_key和订阅器(turtulesim_node)之间的通信，发布器和订阅器之间必须发送和接收相同类型的消息。 这意味着话题的类型是由发布在它上面的消息类型决定的。 使用rostopic type命令可以查看发布在某个话题上的消息类型。 使用 rostopic type rostopic type命令用来查看所发布话题的消息类型。 用法： rostopic type [topic] 运行(非hydro版)： $ rostopic type /turtle1/command_velocity 你应该会看到: turtlesim/Velocity hydro版请运行： $ rostopic type /turtle1/cmd_vel 你应该会看到: geometry_msgs/Twist 我们可以使用rosmsg命令来查看消息的详细情况（非hydro版)： $ rosmsg show turtlesim/Velocity 显示： float32 linear float32 angular hydro版： $ rosmsg show geometry_msgs/Twist 显示： geometry_msgs/Vector3 linear float64 x float64 y float64 z geometry_msgs/Vector3 angular float64 x float64 y float64 z 现在我们已经知道了turtlesim节点所期望的消息类型，接下来我们就可以给turtle发布命令了。 继续学习 rostopic 现在我们已经了解了什么是ROS的消息，接下来我们开始结合消息来使用rostopic。 使用 rostopic pub rostopicpub可以把数据发布到当前某个正在广播的话题上。 用法： rostopic pub [topic] [msg_type] [args] 示例（非hydro版）： $ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity -- 2.0 1.8 示例（hydro版)： $ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]' 以上命令会发送一条消息给turtlesim，告诉它以2.0大小的线速度和1.8大小的角速度开始移动。 这是一个非常复杂的例子，因此让我们来详细分析一下其中的每一个参数。 rostopic pub 这条命令将会发布消息到某个给定的话题。 -1 （单个破折号）这个参数选项使rostopic发布一条消息后马上退出。 /turtle1/command_velocity 这是消息所发布到的话题名称。 turtlesim/Velocity 这是所发布消息的类型。 -- （双破折号）这会告诉命令选项解析器接下来的参数部分都不是命令选项。 这在参数里面包含有破折号-（比如负号）时是必须要添加的。 2.0 1.8 正如之前提到的，在一个turtlesim/Velocity消息里面包含有两个浮点型元素：linear和angular。 在本例中2.0是linear的值，1.8是angula的值。 这些参数其实是按照YAML语法格式编写的，这在YAML文档中有更多的描述。 你可能已经注意到turtle已经停止移动了。 这是因为turtle需要一个稳定的频率为1Hz的命令流来保持移动状态。 我们可以使用rostopic pub -r命令来发布一个稳定的命令流（非hydro版）： $ rostopic pub /turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0 -1.8 hydro版： $ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]' 这条命令以1Hz的频率发布速度命令到速度话题上。 我们也可以看一下rqt_graph中的情形 可以看到rostopic发布器节点（红色）正在与rostopic echo节点（绿色）进行通信： 正如你所看到的，turtle正沿着一个圆形轨迹连续运动。 我们可以在一个新终端中通过rostopic echo命令来查看turtlesim所发布的数据。 使用 rostopic hz rostopic hz命令可以用来查看数据发布的频率。 用法： rostopic hz [topic] 我们看一下turtlesim_node发布/turtle/pose时有多快： $ rostopic hz /turtle1/pose 你会看到： subscribed to [/turtle1/pose] average rate: 59.354 min: 0.005s max: 0.027s std dev: 0.00284s window: 58 average rate: 59.459 min: 0.005s max: 0.027s std dev: 0.00271s window: 118 average rate: 59.539 min: 0.004s max: 0.030s std dev: 0.00339s window: 177 average rate: 59.492 min: 0.004s max: 0.030s std dev: 0.00380s window: 237 average rate: 59.463 min: 0.004s max: 0.030s std dev: 0.00380s window: 290 现在我们可以知道了turtlesim正以大约60Hz的频率发布数据给turtle。 我们也可以结合rostopic type和rosmsg show命令来获取关于某个话题的更深层次的信息（非hydro版）： $ rostopic type /turtle1/command_velocity | rosmsg show hydro版： rostopic type /turtle1/cmd_vel | rosmsg show 到此我们已经完成了通过rostopic来查看话题相关情况的过程，接下来我将使用另一个工具来查看turtlesim发布的数据。 使用 rqt_plot 注意：如果你使用的是electric或更早期的ROS版本，那么rqt命令是不可用的，请使用rxplot命令来代替。 rqt_plot命令可以实时显示一个发布到某个话题上的数据变化图形。 这里我们将使用rqt_plot命令来绘制正在发布到/turtle1/pose话题上的数据变化图形。 首先，在一个新终端中运行rqt_plot命令： $ rosrun rqt_plot rqt_plot 这会弹出一个新窗口，在窗口左上角的一个文本框里面你可以添加需要绘制的话题。 在里面输入/turtle1/pose/x后之前处于禁用状态的加号按钮将会被使能变亮。 按一下该按钮，并对/turtle1/pose/y重复相同的过程。 现在你会在图形中看到turtle的x-y位置坐标图。 按下减号按钮会显示一组菜单让你隐藏图形中指定的话题。 现在隐藏掉你刚才添加的话题并添加/turtle1/pose/theta，你会看到如下图所示的图形： 本部分教程到此为止，请使用Ctrl-C退出rostopic命令，但要保持turtlesim继续运行。 到此我们已经理解了ROS话题是如何工作的，接下来我们开始学习理解ROS服务和参数。
理解ROS服务和参数 说明： 本教程介绍了ROS 服务和参数的知识，以及命令行工具rosservice 和 rosparam的使用方法。 目录 ROS Services 使用rosservice rosservice list rosservice type rosservice call Using rosparam rosparam list rosparam set and rosparam get rosparam dump and rosparam load 准备： 本教程假设从前一教程启动的turtlesim_node仍在运行，现在我们来看看turtlesim提供了什么服务： ROS Services 服务（services）是节点之间通讯的另一种方式。 服务允许节点发送请求（request） 并获得一个响应（response） 使用rosservice rosservice可以很轻松的使用 ROS 客户端/服务器框架提供的服务。 rosservice提供了很多可以在topic上使用的命令，如下所示： 使用方法: rosservice list 输出可用服务的信息 rosservice call 调用带参数的服务 rosservice type 输出服务类型 rosservice find 依据类型寻找服务find services by service type rosservice uri 输出服务的ROSRPC uri rosservice list 执行rosservice list $ rosservice list 显示结果： /clear /kill /reset /rosout/get_loggers /rosout/set_logger_level /spawn /teleop_turtle/get_loggers /teleop_turtle/set_logger_level /turtle1/set_pen /turtle1/teleport_absolute /turtle1/teleport_relative /turtlesim/get_loggers /turtlesim/set_logger_level 命令显示turtlesim节点提供了9个服务： 重置（reset） 清除（clear） 再生（spawn） 终止（kill） turtle1/set_pen /turtle1/teleport_absolute /turtle1/teleport_relative turtlesim/get_loggers turtlesim/set_logger_level 另外两个rosout节点提供的服务: /rosout/get_loggers /rosout/set_logger_level 使用rosservice type命令更进一步查看clear服务: rosservice type使用方法: rosservice type [service] 我们来看看clear服务的类型: $ rosservice type clear 显示： std_srvs/Empty 服务的类型为空（empty),这表明在调用这个服务是不需要参数（比如，请求不需要发送数据，响应也没有数据）。 下面我们使用rosservice call命令调用服务： rosservice call使用方法: rosservice call [service] [args] 因为服务类型是空，所以进行无参数调用： $ rosservice call clear 正如我们所期待的，服务清除了turtlesim_node的背景上的轨迹。 通过查看再生（spawn）服务的信息，我们来了解带参数的服务: $ rosservice type spawn | rossrv show 显示结果： float32 x float32 y float32 theta string name --- string name 这个服务使得我们可以在给定的位置和角度生成一只新的乌龟。 名字参数是可选的，这里我们不设具体的名字，让turtlesim自动创建一个。 执行命令： $ rosservice call spawn 2 2 0.2 "" 服务返回了新产生的乌龟的名字： name: turtle2 现在我们的乌龟看起来应该是像这样的： Using rosparam rosparam使得我们能够存储并操作ROS参数服务器（Parameter Server）上的数据。 参数服务器能够存储整型、浮点、布尔、字符串、字典和列表等数据类型。 rosparam使用YAML标记语言的语法。 一般而言，YAML的表述很自然： 1是整型 1.0是浮点型 one是字符串 true是布尔 [1,2,3]是整型列表 {a:b,c:d}是字典 rosparam有很多指令可以用来操作参数，如下所示: 使用方法: rosparam set 设置参数 rosparam get 获取参数 rosparam load 从文件读取参数 rosparam dump 向文件中写入参数 rosparam delete 删除参数 rosparam list 列出参数名 我们来看看现在参数服务器上都有哪些参数： 执行rosparam list $ rosparam list 我们可以看到turtlesim节点在参数服务器上有3个参数用于设定背景颜色： /background_b /background_g /background_r /roslaunch/uris/aqy:51932 /run_id 改变参数值使用rosparam set，获取参数值使用rosparam get 使用方法： rosparam set [param_name] rosparam get [param_name] 现在我们修改背景颜色的红色通道： $ rosparam set background_r 150 上述指令修改了参数的值，现在我们调用清除服务使得修改后的参数生效： $ rosservice call clear 现在 我们的小乌龟看起来应该是像这样： 现在我们来查看参数服务器上的参数值——获取背景的绿色通道的值： $ rosparam get background_g 86 我们可以使用rosparam get来显示参数服务器上的所有内容： $ rosparam get / 显示内容： background_b: 255 background_g: 86 background_r: 150 roslaunch: uris: {'aqy:51932': 'http://aqy:51932/'} run_id: e07ea71e-98df-11de-8875-001b21201aa8 你可能希望存储这些信息以备今后重新读取。 这通过rosparam很容易就可以实现: rosparam dump and rosparam load 使用方法: rosparam dump [file_name] rosparam load [file_name] [namespace] 现在我们将所有的参数写入params.yaml文件： $ rosparam dump params.yaml 你甚至可以将yaml文件重载入新的命名空间，比如说copy空间: $ rosparam load params.yaml copy $ rosparam get copy/background_b 显示： 255
ROS入门教程-1.1.8 使用 rqt_console 和 roslaunch
ROS入门教程-使用 rqt_console 和 roslaunch 说明： 本教程介绍如何使用rqt_console和rqt_logger_level进行调试，以及如何使用roslaunch同时运行多个节点。 早期版本中的rqt工具并不完善，如果你使用的是“ROS fuerte”或更早期的版本，请同时参考这个页面学习使用老版本的“rx”工具。 目录 预先安装rqt和turtlesim程序包 使用rqt_console和rqt_logger_level 日志等级说明 使用roslaunch Launch 文件 Launch 文件解析 roslaunching 预先安装rqt和turtlesim程序包 本教程会用到rq和turtlesim这两个程序包，如果你没有安装，请先安装： $ sudo apt-get install ros-<distro>-rqt ros-<distro>-rqt-common-plugins ros-<distro>-turtlesim 请使用ROS发行版名称(比如 electric、fuerte、groovy、hydro或最新的indigo)替换掉 注意： 你可能已经在之前的某篇教程中编译过rqt和turtlesim，如果你不确定的话重新编译一次也没事。 使用rqt_console和rqt_logger_level rqt_console属于ROS日志框架(logging framework)的一部分，用来显示节点的输出信息 rqt_logger_level允许我们修改节点运行时输出信息的日志等级（logger levels） logger levels包括 DEBUG、WARN、INFO和ERROR 现在让我们来看一下turtlesim在rqt_console中的输出信息，同时在rqt_logger_level中修改日志等级。 在启动turtlesim之前先在另外两个新终端中运行rqt_console和rqt_logger_level： $ rosrun rqt_console rqt_console $ rosrun rqt_logger_level rqt_logger_level 你会看到弹出两个窗口： 现在让我们在一个新终端中启动turtlesim： $ rosrun turtlesim turtlesim_node 因为默认日志等级是INFO，所以你会看到turtlesim启动后输出的所有信息，如下图所示： 现在让我们刷新一下rqt_logger_level窗口并选择Warn将日志等级修改为WARN，如下图所示： 现在我们让turtle动起来并观察rqt_console中的输出（非hydro版）： rostopic pub /turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0 0.0 hydro版： rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 0.0]' 效果： 日志等级说明 日志等级按以下优先顺序排列： Fatal Error Warn Info Debug Fatal是最高优先级，Debug是最低优先级。 通过设置日志等级你可以获取该等级及其以上优先等级的所有日志消息。 比如，将日志等级设为Warn时，你会得到Warn、Error和Fatal这三个等级的所有日志消息。 现在让我们按Ctrl-C退出turtlesim节点 接下来我们将使用roslaunch来启动多个turtlesim节点和一个模仿节点以让一个turtlesim节点来模仿另一个turtlesim节点。 使用roslaunch roslaunch可以用来启动定义在launch文件中的多个节点。 用法： $ roslaunch [package] [filename.launch] 先切换到beginner_tutorials程序包目录下： $ roscd beginner_tutorials 如果roscd执行失败了，记得设置你当前终端下的ROS_PACKAGE_PATH环境变量 设置方法如下： $ export ROS_PACKAGE_PATH=~/<distro>_workspace/sandbox:$ROS_PACKAGE_PATH $ roscd beginner_tutorials 如果你仍然无法找到beginner_tutorials程序包，说明该程序包还没有创建，那么请返回到ROS/Tutorials/CreatingPackage教程，并按照创建程序包的操作方法创建一个beginner_tutorials程序包。 然后创建一个launch文件夹： $ mkdir launch $ cd launch Launch 文件 现在我们来创建一个名为turtlemimic.launch的launch文件并复制粘贴以下内容到该文件里面： 1 <launch> 2 3 <group ns="turtlesim1"> 4 <node pkg="turtlesim" name="sim" type="turtlesim_node"/> 5 </group> 6 7 <group ns="turtlesim2"> 8 <node pkg="turtlesim" name="sim" type="turtlesim_node"/> 9 </group> 10 11 <node pkg="turtlesim" name="mimic" type="mimic"> 12 <remap from="input" to="turtlesim1/turtle1"/> 13 <remap from="output" to="turtlesim2/turtle1"/> 14 </node> 15 16 </launch> Launch 文件解析 现在我们开始逐句解析launch xml文件。 <launch> 在这里我们以launch标签开头以表明这是一个launch文件。 3 <group ns="turtlesim1"> 4 <node pkg="turtlesim" name="sim" type="turtlesim_node"/> 5 </group> 6 7 <group ns="turtlesim2"> 8 <node pkg="turtlesim" name="sim" type="turtlesim_node"/> 9 </group> 在这里我们创建了两个节点分组并以'命名空间（namespace)'标签来区分，其中一个名为turtulesim1，另一个名为turtlesim2，两个组里面都使用相同的turtlesim节点并命名为'sim'。 这样可以让我们同时启动两个turtlesim模拟器而不会产生命名冲突。 11 <node pkg="turtlesim" name="mimic" type="mimic"> 12 <remap from="input" to="turtlesim1/turtle1"/> 13 <remap from="output" to="turtlesim2/turtle1"/> 14 </node> 在这里我们启动模仿节点，并将所有话题的输入和输出分别重命名为turtlesim1和turtlesim2，这样就会使turtlesim2模仿turtlesim1。 </launch> 这个是launch文件的结束标签。 roslaunching 现在让我们通过roslaunch命令来启动launch文件： $ roslaunch beginner_tutorials turtlemimic.launch 现在将会有两个turtlesims被启动，然后我们在一个新终端中使用rostopic命令发送速度设定消息： 非hydro版： $ rostopic pub /turtlesim1/turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0 -1.8 hydro版： $ rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]' 你会看到两个turtlesims会同时开始移动，虽然发布命令只是给turtlesim1发送了速度设定消息。 我们也可以通过rqt_graph来更好的理解在launch文件中所做的事情。 运行rqt并在主窗口中选择rqt_graph： $ rqt 或者直接运行： $ rqt_graph 效果： 到此，我们算是已经学会了rqt_console和roslaunch命令的使用，接下来我们开始学习使用rosed——ROS中的编辑器。 现在你可以按Ctrl-C退出所有turtlesims节点了，因为在下一篇教程中你不会再用到它们。
ROS入门教程-1.1.8 使用 rxconsole 和 roslaunch (ROS fuerte之前版本)
使用 rxconsole 和 roslaunch (ROS fuerte之前版本) 说明： 版本过旧不做翻译 This tutorial introduces ROS using rxconsole and rxloggerlevel for debugging and roslaunch for starting many nodes at once. 目录 Prerequisites rxtools and turtlesim package Using rxconsole and rxloggerlevel Quick Note about logger levels Using roslaunch The Launch File The Launch File Explained roslaunching This tutorial page is obsolete starting from ROS groovy. Please see ROS/Tutorials/UsingRqtconsoleRoslaunch and come back if necessary. Prerequisites rxtools and turtlesim package The tutorial uses both the rxtools and turtlesim packages. To do this tutorial, please install both packages, if you have not yet. $ sudo apt-get install ros-<distro>-rx ros-<distro>-turtlesim Replace <distro> with the name of your ROS distribution (e.g. electric, fuerte, groovy). NOTE: you may have already built rxtools and turtlesim for one of the previous tutorials. If you are not sure, installing them again will not hurt anything. Using rxconsole and rxloggerlevel rxconsole attaches to ROS's logging framework to display output from nodes. rxloggerlevel allows us to change the verbosity level (DEBUG, WARN, INFO, and ERROR) of nodes as they run. Now let's look at the turtlesim output in rxconsole and switch logger levels in rxloggerlevel as we use turtlesim. Before we start the turtlesim, in two new terminals start rxconsole and rxloggerlevel: $ rxconsole$ rxloggerlevel You will see two windows popup: Now let's start turtlesim in a new terminal: $ rosrun turtlesim turtlesim_node Since the default logger level is INFO you will see any info that the turtlesim publishes when it starts up, which should look like: Now let's change the logger level to Warn by refreshing the nodes in the rxloggerlevel window and selecting Warn as shown below: Now let's run our turtle into the wall and see what is displayed in our rxconsole: rostopic pub /turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0 0.0 Quick Note about logger levels Logging levels are prioritized in the following order: Fatal Error Warn Info Debug Fatal has the highest priority and Debug has the lowest. By setting the logger level, you will get all messages of that priority level or higher. For example, by setting the level to Warn, you will get all Warn, Error, and Fatal logging messages. Let's Ctrl-C our turtlesim and let's use roslaunch to bring up multiple turtlesim nodes and a mimicking node to cause one turtlesim to mimic another: Using roslaunch roslaunch starts nodes as defined in a launch file. Usage: $ roslaunch [package] [filename.launch] First we must make a launch file. In your beginner_tutorials package let's make a launch directory and create a launch file: $ roscd beginner_tutorials $ mkdir launch $ cd launch If roscd fails, remember to set the ROS_PACKAGE_PATH variable in your terminal. Then the commands will look like this: $ export ROS_PACKAGE_PATH=~/fuerte_workspace/sandbox:$ROS_PACKAGE_PATH $ roscd beginner_tutorials $ mkdir launch $ cd launch If you still cannot find the beginner_tutorials then go back and follow the instructions on creating a package in the second lesson [http://www.ros.org/wiki/ROS/Tutorials/CreatingPackage] The Launch File Now let's create a launch file called turtlemimic.launch and paste the following: 1 <launch> 2 3 <group ns="turtlesim1"> 4 <node pkg="turtlesim" name="sim" type="turtlesim_node"/> 5 </group> 6 7 <group ns="turtlesim2"> 8 <node pkg="turtlesim" name="sim" type="turtlesim_node"/> 9 </group> 10 11 <node pkg="turtlesim" name="mimic" type="mimic"> 12 <remap from="input" to="turtlesim1/turtle1"/> 13 <remap from="output" to="turtlesim2/turtle1"/> 14 </node> 15 16 </launch> The Launch File Explained Now, let's break the launch xml down. 1 <launch> Here we start the launch file with the launch tag, so that the file is identified as a launch file. 3 <group ns="turtlesim1"> 4 <node pkg="turtlesim" name="sim" type="turtlesim_node"/> 5 </group> 6 7 <group ns="turtlesim2"> 8 <node pkg="turtlesim" name="sim" type="turtlesim_node"/> 9 </group> Here we start two groups with a namespace tag of turtlesim1 and turtlesim2 with a turtlesim node with a name of sim. This allows us to start two simulators without having name conflicts. 11 <node pkg="turtlesim" name="mimic" type="mimic"> 12 <remap from="input" to="turtlesim1/turtle1"/> 13 <remap from="output" to="turtlesim2/turtle1"/> 14 </node> Here we start the mimic node with the topics input and output renamed to turtlesim1 and turtlesim2. This renaming will cause turtlesim2 to mimic turtlesim1. 16 </launch> This closes the xml tag for the launch file. roslaunching Now let's roslaunch the launch file: $ roslaunch beginner_tutorials turtlemimic.launchTwo turtlesims will start and in a new terminal send the rostopic command: $ rostopic pub /turtlesim1/turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0 -1.8 You will see the two turtlesims start moving even though the publish command is only being sent to turtlesim1. We can also use rxgraph to better understand what our launch file did: $ rxgraph Now that you have successfully used rxconsole and roslaunch, let's learn about editor options for ROS. You can Crtl-C all your turtlesims, as you will not need them for the next tutorials.