ROS入门教程(一)

别来无恙 提交于 2019-11-30 20:12:36

本文为原创博客, 转载请注明出处:https://blog.csdn.net/q_z_r_s

机器感知
一个专注于SLAM、三维重建、机器视觉等相关技术文章分享的公众号


开源地址:点击该链接


参考自:http://wiki.ros.org/ROS/Tutorials
【Beginner Level】ROS入门教程(一)
【Beginner Level】ROS入门教程(二)
【Beginner Level】ROS入门教程(三)
【Beginner Level】ROS入门教程(四)
【Beginner Level】ROS入门教程(五)

Core ROS 教程(新手)

1. 安装和配置ROS环境

安装ROS: 详见ROS安装教程

1.1 管理ROS环境

确保ROS环境变量已被设置

printenv | grep ROS #输出如下 linux@linux:~$ printenv | grep ROS ROS_ROOT=/opt/ros/indigo/share/ros ROS_PACKAGE_PATH=/opt/ros/indigo/share:/opt/ros/indigo/stacks ROS_MASTER_URI=http://localhost:11311 ROSLISP_PACKAGE_DIRECTORIES= ROS_DISTRO=indigo ROS_ETC_DIR=/opt/ros/indigo/etc/ros 
1.2 创建ROS工作空间

关于catkin和rosbuild的选择

ROS Indigo发布于2014年, ROS Groovy发布于2012, 根据官网说明, ROS Groovy及其之后的版本使用catkin, ROS Fuerte及更老的版本使用rosbuild, 因此, 我这里使用catkin

$ mkdir -p ~/catkin_ws/src $ cd ~/catkin_ws/ $ catkin_make 

在工作空间中首次运行catkin_make命令后, 它会在./src目录下创建一个CMakeLists.txt.

linux@linux:~/catkin_ws$ ls build  devel  src 

devel文件夹中, 有几个setup.*sh的文件, source任何一个, 都将覆盖工作空间顶层环境

$ source devel/setup.bash 

输入以下命令, 确保ROS_PACKAGE_PATH环境变量包含了当前路径

$ echo $ROS_PACKAGE_PATH /home/youruser/catkin_ws/src:/opt/ros/kinetic/share #自己添加的, 非官网 linux@linux:~/catkin_ws$ printenv | grep ROS ROS_ROOT=/opt/ros/indigo/share/ros ROS_PACKAGE_PATH=/home/linux/catkin_ws/src:/opt/ros/indigo/share:/opt/ros/indigo/stacks ROS_MASTER_URI=http://localhost:11311 ROSLISP_PACKAGE_DIRECTORIES=/home/linux/catkin_ws/devel/share/common-lisp ROS_DISTRO=indigo ROS_ETC_DIR=/opt/ros/indigo/etc/ros 

通过对比, 仅有ROS_PACKAGE_PATHROSLISP_PACKAGE_DIRECTORIES发生了变化

2. ROS文件系统
2.1 安装ros-indigo-ros-turorials(安装ROS时已经安装过了)
sudo apt-get install ros-indigo-ros-tutorials 
2.2 文件系统概念
  • Packages: Packages是ROS代码的软件单元的一种组织方式, 每个Package可以包含库, 可执行程序, 脚本等.
  • Manifests(package.xml): manifest(中文: 清单)是一个package的描述文件. 它定义了包之间的依赖, 并用来捕获包的元信息(meta information, 元数据是关于数据的组织、数据域及其关系的信息,简言之,元数据就是关于数据的数据。), 例如版本, 维护者, 证书等等.
2.3 文件系统工具

ROS代码分布于很多packages中, 使用诸如lscd这样命令行来进行文件导航是及其繁琐乏味的, 因此ROS提供了相关的工具来使用

  • 使用rospack

    rospack可以获得有关packages的信息, 此处展示find命令, 帮助命令为rospack help

    linux@linux:~/catkin_ws$ rospack find roscpp /opt/ros/indigo/share/roscpp 
  • 使用roscd

    roscd是rosbash的一部分, 此命令可以让你直接把目录改变到一个package中或一个stack中

    #语法, 可以直接进入某个package文件夹中 roscd [locationname[/subdir]] linux@linux:~/catkin_ws$ roscd roscpp linux@linux:/opt/ros/indigo/share/roscpp$ pwd /opt/ros/indigo/share/roscpp 

    注: 和其他ROS工具类似, roscd只寻找ROS_PACKAGE_PATH所列出路径, 其中的每个路径用:来分隔.

  • roscd log

    此命令会进入ROS存储log的文件夹, 如果执行此命令之前名优运行过ROS程序, 此命令会报错, 找不到此文件夹.

    linux@linux:/opt/ros/indigo/share/roscpp$ roscd log No active roscore bash: cd: /home/linux/.ros/log: 没有那个文件或目录 
  • 使用rosls

    rosls与roscd类似, 不多介绍.

  • Tab补全

    rosls, roscd, TAB都与Linux shell提供了同样的功能, 不多介绍

2.4 总结
  • rospack = ros + pack(age)
  • roscd = ros + cd
  • rosls = ros + ls

此类书写风格在ROS工具中很常用.

3. 创建ROS Package

此章节使用roscreate-pkgcatkin创建一个新的package, 并用rospack列出包的的依赖关系.

3.1 一个catkin package的组成
  • 必须包含一个catkin兼容的package.xml文件

  • 必须包含一个使用catkin的CMakeLists.txt

  • 每个package必须有自己的文件夹: 这意味着没有嵌套的包,也没有共享同一目录的多个包.

    最简单的package如下:

    my_package/ 	CMakeLists.txt 	package.xml 
3.2 catkin工作空间中的package

使用catkin packages工作的推荐方式是使用catkin工作空间, 当然也可以单独建立一个catkin package. 一个普通的工作空间大概如下:

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 
3.3 创建一个catkin Package
  • 创建工作空间的方法见: 1.2 创建ROS工作空间

  • catkin_create_pkg <package_name> [depend1][depend2] [depend3]

    $ cd ~/catkin_ws/src $ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp 
3.4 编译catkin工作空间并source
$ cd ~/catkin_ws $ catkin_make $ . ~/catkin_ws/devel/setup.bash 
3.5 package依赖
  • 一级依赖: $ rospack depends1 beginner_tutorials

    此命令的输出与穿件package时传入的参数一致, 这些对packages的依赖存储在package.xml中.

  • 间接依赖: $ rospack depends1 rospy

    大多数情况下, 一个依赖项都会有它自己的依赖. rospack可以递归检测所有的嵌套依赖.

3.6 定制Package
  • 定制package.xml

    包括description, maintainer, license, dependencies(包括了buildtool_depend, build_depend, exec_depend)

  • 定制CMakeLists.txt

4. 编译ROS Package
4.1 编译Packages
  • catkin_make可以看做是组合调用了标准Cmake工作流: cmake, make

    # In a CMake project $ mkdir build $ cd build $ cmake .. $ make $ make install  # (optionally) # In a catkin workspace $ catkin_make $ catkin_make install  # (optionally) 

    catkin_make命令将编译src目录下的所有工程. 对于源码不在当前目录下的使用方法为:

    # In a catkin workspace $ catkin_make --source my_src $ catkin_make install --source my_src  # (optionally) 
  • 编译Package

    在当前工作空间中(~/catkin_ws/): catkin_make.

5. ROS Nodes

本节引入ROS graph的概念, 并探讨roscore, rosnode, rosrun的使用.

5.1 Graph概念概览
  • Nodes: 一个node表示一个使用ROS来与其他nodes进行通信的可执行程序.
  • Messages: ROS数据类型.
  • Topics: Nodes可以向topic发布消息,也可以订阅topic来接收消息.
  • Master: Name service for ROS(即帮助节点找到彼此).
  • rosout: ROS下的stdout/stderr.
  • roscore: Master + rosout + parameter server
5.2 Nodes

在ROS package中, 一个node实际上只不过是一个可执行文件. ROS nodes使用ROS client library与其他nodes进行通信. Nodes可以发布和订阅一个Topic. Nodes也可以提供或使用一个Service.

5.3 Client Libraries

ROS client library允许使用不同编程语言写出来的nodes进行通信

  • rospy = python client library
  • roscpp = c++ client library
5.4 roscore

roscore是当你使用ROS时第一个应该运行的东西

5.5 使用rosnode

rosnode显示当前正在运行的有关ROS nodes的信息

#列出活跃状态的nodes $ rosnode list #显示有关指定node的信息 $ rosnode info /rosout 
5.6 使用rosrun

rosrun允许使用package名来直接运行一个package中的node(不用非得知道package的路径).

#Usage: $ rosrun [package_name] [node_name] #run the turtlesim_node in the turtlesim package $ rosrun turtlesim turtlesim_node 

ROS支持为node重新指定名字

$ rosrun turtlesim turtlesim_node __name:=my_turtle linux@linux:~$ rosnode list /my_turtle /rosout 

可以使用$ rosnode ping my_turtle来测试是否真的跑起来了.

5.7 总结
  • roscore = ros + core: master(prodives name service for ROS) + rosout(stdout/stderr) + parameter server.
  • rosnode = ros + node: ROS tool to get information about a node.
  • rosrun = ros + run: runs a node from a given package.
6. ROS Topics

本节引入ROS topics, 与此同时使用rostopic和rqt_plot工具.

6.1 准备工作
  • 确保roscore在运行, 在一个新打开终端输入roscore可进行测试
  • 运行$ rosrun turtlesim turtlesim_node
  • 运行$ rosrun turtlesim turtle_teleop_key, 使用方向键控制turtle移动
6.2 ROS Topics
  • 使用rqt-graph

    rqt-graph创建系统的一个动态图. rtq-graphrqt package的一部分, 安装方法如下:

    $ sudo apt-get install ros-<distro>-rqt $ sudo apt-get install ros-<distro>-rqt-common-plugins 

    在新终端中输入:$ rosrun rqt_graph rqt_graph会出现一个可视化窗口, 显示nodes之间的关系.

  • 引入rostopic

    rostopic工具用来获取ROS topics.

  • 使用rostopic echo

    rostopic echo显示发布在一个topic上的数据, 只有在运行之后有新的消息发布到topic上时才会有输出.

    #Usage: $ rostopic echo [topic] $ rostopic echo /turtle1/cmd_vel 
  • 使用rostopic list

    使用$ rostopic list -v列出所有的topics

6.3 ROS Messages

topics上的通信是通过在nodes之间发送ROS messages进行的. 发布者和订阅者必须发送和接收同种类型的消息. 这意味着, topic的类型是由发布在其上的message类型定义的. message的类型可通过rostopic type [topic]来查询. 可以使用rosmsg show type查看信息格式.

6.4 rostopic续
  • rostopic pub可以在一个topic上发布数据

    #Usage: $ rostopic pub [topic] [msg_type] [args] #双短线表示后边的不是命令选项 $ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]' 
  • rostopic hz报告数据发布速率: $ rostopic hz [topic]

6.5 使用rqt_plot

使用指令: $ rosrun rqt_plot rqt_plot, 添加需要查看的topic即可.

7. ROS Services and Parameters

本节介绍ROS Services and Parameters, 与此同时使用rosservice和rosparam命令行工具. Services是nodes间进行通信的另一种方式, Services允许nodes发送一个请求(request和接收一个响应(response).

#Usage: rosservice list [topic]#列出[topic]所提供的服务 rosservice type [service]#显示服务类型 rosservice call [service] [args]#调用服务 #查看带参数的示例 rosservice find #find services by service type rosservice uri #print service ROSRPC uri $ rosservice type /spawn | rossrv show     float32 x     float32 y     float32 theta     string name     ---     string name $ rosservice call /spawn 2 2 0.2 ""#name field is optional 	name: turtle2 

rosparam循序我们存储和操作ROS Parameter Server上的数据, Parameter Server可以存储整型, 浮点型, 布尔型, 字典, 列表. rosparam使用YAML标记语言语法.

#Usage: rosparam set [param_name] #set parameter #设置参数之后使用/clear服务刷新操作 $ rosservice call /clear rosparam get [param_name] #get parameter rosparam load #load parameters from file rosparam dump #dump parameters to file rosparam delete #delete parameter rosparam list #list parameter names 
#Usage: rosparam dump [file_name] [namespace] rosparam load [file_name] [namespace] #write all the parameters to the file params.yaml  $ rosparam dump params.yaml # load these yaml files into new namespaces, e.g. copy $ rosparam load params.yaml copy $ rosparam get /copy/background_b 
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!