本文为原创博客, 转载请注明出处: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.txtpackage.xml
    
3.2 catkin工作空间中的package

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

workspace_folder/        -- WORKSPACEsrc/                   -- SOURCE SPACECMakeLists.txt       -- 'Toplevel' CMake file, provided by catkinpackage_1/CMakeLists.txt     -- CMakeLists.txt file for package_1package.xml        -- Package manifest for package_1...package_n/CMakeLists.txt     -- CMakeLists.txt file for package_npackage.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 showfloat32 xfloat32 yfloat32 thetastring name---string name
$ rosservice call /spawn 2 2 0.2 ""#name field is optionalname: 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

ROS入门教程(一)相关推荐

  1. ROS入门教程(三)—— 用C++实现Hello world

    本文将继上文介绍安装完用C++或Python实现Hello world后,如何在VS Code下用C++实现Hello world. 目录 前言 Hello world实现 前言 在VS Code下用 ...

  2. ROS 入门教程 —— 小海龟简单控制

    ROS 入门教程 -- 小海龟简单控制 这里我们直接介绍命令使用方法,原理请查看我的另外几篇博客: ROS 命令行工具的使用 ROS 创建工作空间与功能包 运行并控制小海龟 由于小海龟并不是 ROS ...

  3. 【ROS入门教程】---- 01 ROS介绍

    ROS,机器人系统的不二选择 文章目录 ROS,机器人系统的不二选择 ROS是什么 ROS的强大之处 ROS的学习方法 总结 ROS是什么 作为新世纪的孩子们,可能从出生以来,我们就伴随着机器人的飞速 ...

  4. ROS学习----依据ROS入门教程,整理的ROS命令

    文章目录 ROS命令学习 文件系统介绍 ROS文件系统工具命令:rospack,rosstack roscd,rosls 创建ROS程序包命令:roscreate,catkin程序包结构,catkin ...

  5. ROS编程入门教程(全过程示例代码)

    ROS系统目前主流语言为C++/Python , Python需要安装vscode, 所以本文使用C++ .编译使用catkin (catkin和rosbuild都能用) 首先创建工作空间(worki ...

  6. ROS 中文教程目录(最好不要过度依赖这种,建议养成看英文原版习惯)

    About | Support | Discussion Forum | Service Status | Q&A answers.ros.org Search: cn ROS Tutoria ...

  7. ros入门--中科院软件所ros学习笔记

    视频链接: 中科院软件所-机器人操作系统入门(ROS入门教程)_哔哩哔哩_bilibili 中科院软件所-机器人操作系统入门(ROS入门教程)_哔哩哔哩_bilibili 另外有一个不错的 学习网址: ...

  8. 【ROS入门学习01| ROS命令行工具的使用】

    ROS命令行工具的使用 -----------------可以配合古月居的ROS入门教程来学习实践. 文章目录 ROS命令行工具的使用 一.roscore 二.rosrun 三.rqt_graph 四 ...

  9. 【一学就会的ROS基础入门教程 】03-1 ROS基础编程:ROS工作空间的创建、话题topic的发布与接收、以及话题消息的自定义使用

    [一学就会的ROS基础入门教程 ]03-1 ROS基础编程:ROS工作空间的创建.话题topic的发布与接收.以及话题消息的自定义使用 文前白话 1.创建工作空间与功能包 关于工作空间的介绍 创建开发 ...

  10. ROS入门21讲 | ROS机器人入门教程 【简明笔记】

    古月·ROS入门21讲 | 一学就会的ROS机器人入门教程 文章目录 ROS核心概念 ROS命令行 工作空间与功能包 订阅与发布 发布者 Publisher 订阅者 Subscriber 话题消息的自 ...

最新文章

  1. 题目1206:字符串连接
  2. 拖延不是你的锅,全是基因惹的祸
  3. c++中结构体套结构体用 = {0}初始化编译报错解决办法(用memset或者={})(error: invalid conversion)
  4. eq linux_在线试用 200 多种 Linux 和 Unix 操作系统 | Linux 中国
  5. C语言操作符(又称运算符)(1)
  6. [译]BitTorrent协议规范
  7. 针对CDP协议攻击分析及安全防护
  8. 计算机恢复语言文件格式,当你的电脑无故变成英文且语言包丢失后用这几招恢复-win7语言包...
  9. Google 发布全新绘画工具 AutoDraw
  10. Mina(1):快速上手
  11. 名编辑电子杂志大师教程 | 添加搜索功能
  12. 神经网络模型应用实例SPSS - 典型的神经网络模型 - 神经网络模型的应用
  13. WORD中图、表、公式自动编号及制表位、尾注的应用
  14. “百度杯”CTF比赛 十一月场Fuzz
  15. Accenture国内出差常用报销填法
  16. 短信验证码(俗称接码平台)分享定义是什么
  17. 如何获取PDF修改权限并编辑文档?
  18. iOS 真机调试出现”A signed resource has been added modified or deleted“错误的解决办法
  19. 【bug】联想小新出现问题,你的PIN不可用。
  20. oracle创建多字段索引吗,oracle复合索引介绍(多字段索引)

热门文章

  1. 通用 USB 重定向和客户端驱动器注意事项
  2. 华硕飞行堡垒atk驱动在哪_11月8日华硕再撒大额福利 满减优惠价机不可失_第1页...
  3. Linux之执行一个可执行文件
  4. Java字符串排序(根据字节及字符长度进行排序)
  5. 浅谈-61850-2-服务端模拟软件构建
  6. 基于snowflake的Id序列号生成器
  7. 【计算机网络原理】各层的数据传输
  8. 微粒群算法(一、简介)
  9. c语言如何用编译器编辑,C语言编译器怎么用,C语言编译器使用教程
  10. c语言编译器官网,C语言编译器app_c语言编译器app官网下载_c语言编译器手机版app-多特软件站安卓网...