您的位置:首页 > 编程语言

ROS学习记录(一)--简单的命令

2017-12-29 16:03 417 查看

实验要用到kobuki,kinectv2,做三维重建,用到RGBDSLAMV2开源代码和ROS系统,边学边记录

ROS中文社区

ROS中有很多各种函数库和工具,我们提供了四种默认安装方式,你也可以单独安装某个特定软件包。

桌面完整版安装:(推荐) 包含ROS、rqt、rviz、通用机器人函数库、2D/3D仿真器、导航以及2D/3D感知功能。

sudo apt-get install ros-jade-desktop-full


快速了解文件系统概念

Packages: 软件包,是ROS应用程序代码的组织单元,每个软件包都可以包含程序库、可执行文件、脚本或者其它手动创建的东西。

Manifest (package.xml): 清单,是对于’软件包’相关信息的描述,用于定义软件包相关元信息之间的依赖关系,这些信息包括版本、维护者和许可协议等。

文件系统工具

程序代码是分布在众多ROS软件包当中,当使用命令行工具(比如ls和cd)来浏览时会非常繁琐,因此ROS提供了专门的命令工具来简化这些操作。

使用 rospack

rospack允许你获取软件包的有关信息。在本教程中,我们只涉及到rospack中find参数选项,该选项可以返回软件包的路径信息。

用法: rospack find [包名称]

示例:$ rospack find roscpp

应输出:YOUR_INSTALL_PATH/share/roscpp

使用 roscd

roscd是rosbash命令集中的一部分,它允许你直接切换(cd)工作目录到某个软件包或者软件包集当中。

用法:roscd [本地包名称[/子目录]]

示例:roscdroscpp使用Unix命令pwd来输出当前工作目录: pwd

你应该会看到:YOUR_INSTALL_PATH/share/roscpp

roscd只能切换到那些路径已经包含在ROS_PACKAGE_PATH环境变量中的软件包,要查看ROS_PACKAGE_PATH中包含的路径可以输入:

echoROS_PACKAGE_PATH

export ROS_PACKAGE_PATH=/home/ada/Code/rgbdslam_catkin_ws/src:/opt/ros/kinetic/share:/home/ada/kinect/catin_ws/src


加入路径,告诉ROS系统在哪里搜索更多的ROS包。

如果有相同名称的多个包,ROS会选择上出现的ROS_PACKAGE_PATH 第一个包。

如此就不需要进工作目录下输入命令了!

(想到上篇,其实只要把kinect2的包加入路径应该就可以了!!没知识真可怕)

roscd log

使用roscd log可以切换到ROS保存日记文件的目录下。需要注意的是,如果你没有执行过任何ROS程序,系统会报错说该目录不存在。

如果你已经运行过ROS程序,那么可以尝试:$ roscd log

使用 roslsh

rosls是rosbash命令集中的一部分,它允许你直接按软件包的名称而不是绝对路径执行ls命令(罗列目录)。

用法:rosls [本地包名称[/子目录]]

示例:$ rosls roscpp_tutorialsian应输出:cmake package.xml srv

建立工作空间

创建catkin程序包

1. 程序包的组成

my_package/
CMakeLists.txt
package.xml   package.xml文件提供有关程序包的元信息
每个目录下只能有一个程序包。这意味着在同一个目录下不能有嵌套的或者多个程序包存在.


一个简单的工作空间:

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


2. 创建一个catkin程序包

cd ~/ada_ws/src


现在使用catkin_create_pkg命令来创建一个名为’beginner_tutorials’的新程序包,这个程序包依赖于std_msgs、roscpp和rospy:

catkin_create_pkg beginner_tutorials std_msgs rospy roscpp


创建了名为brginner_tutorials文件夹,包含camkelists和package.cxml

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


3. 查看程序包的依赖关系

a. 直接依赖

rospack depends1 beginner_tutorials


(先source ../devel/setup.sh)这些依赖包保存在package.xml文件中

b. 间接依赖

比如rospy还有其它依赖包

rospack depends1 rospy


c. 一个程序包还可以有好几个间接的依赖包

幸运的是使用rospack可以递归检测出所有的依赖包。

4. 自定义package.xml

<description>The beginner_tutorials package</description>
描述标签

<!-- One maintainer tag required, multiple allowed, one person per tag -->
<!-- Example:  -->
<!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
<maintainer email="ada@todo.todo">ada</maintainer>
维护标签

<!-- One license tag required, multiple allowed, one license per tag -->
<!-- Commonly used license strings: -->
<!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
<license>TODO</license>
许可标签
(对于本教程我们将使用BSD协议,因为ROS核心组件的剩余部分已经使用了该协议:
<license>BSD</license>)

build_depend
buildtool_depend
run_depend
test_depend
依赖项标签

除了catkin中默认提供的buildtool_depend,所有我们列出的依赖包都已经被添加到build_depend标签中。
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>

在本例中,因为在编译和运行时我们需要用到所有指定的依赖包,因此还需要将每一个依赖包分别添加到run_depend标签中
<run_depend>roscpp</run_depend>
<run_depend>rospy</run_depend>
<run_depend>std_msgs</run_depend>


编译程序包

先source /opt/ros/kinetic/setup.sh

可以认为catkin_make是在CMake标准工作流程中依次调用了cmake 和 make

编译指定程序包

catkin_make [make_targets] [-DCMAKE_VARIABLES=…]

多个一起编译

# In a catkin workspace
$ catkin_make
$ catkin_make install  # (可选)
上述命令会编译src文件夹下的所有catkin工程


开始编译:

cd ~/ada_ws
catkin_make


报错:The manifest (with format version 2) must not contain the following tags: run_depend

package.xml文件中,不能包含run_depend,打开package.xml,删掉对应行,解决.

catkin_make输出信息:

catkin_make首先输出它所使用到的每个空间所在的路径
Base path: /home/ada/ada_ws
Source space: /home/ada/ada_ws/src
Build space: /home/ada/ada_ws/build
Devel space: /home/ada/ada_ws/devel
Install space: /home/ada/ada_ws/install


生成了build和devel文件夹:

build目录是build space的默认所在位置,同时cmake和make也是在这里被调用来配置并编译你的程序包。

devel目录是devel space的默认所在位置, 同时也是在你安装程序包之前存放可执行文件和库文件的地方。

现在我们已成功编译了一个ROS程序包

理解ROS节点

图概念概述

Nodes:节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信,可以发布或接收一个话题,可以提供或使用某种服务

Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题

Topics:话题,节点可以发布消息到话题,也可以订阅话题以接收消息

Master:节点管理器,ROS名称服务 (比如帮助节点找到彼此)

rosout: ROS中相当于stdout/stderr。

roscore: 主机+ rosout + 参数服务器

(参数服务器会在后面介绍)。

ROS客户端库允许使用不同编程语言编写的节点之间互相通信:

rospy = python 客户端库

roscpp = c++ 客户端库

rosjs = javascripts客户端库

rosjava = java客户端库

roscore:运行所有ROS程序前首先要运行的命令

如果roscore运行后无法正常初始化,很有可能是存在网络配置问题。

参见 网络设置——单机设置

如果roscore不能初始化并提示缺少权限,这可能是因为~/.ros文件夹归属于root用户(只有root用户才能访问)

修改该文件夹的用户归属关系:

$ sudo chown -R <your_username> ~/.ros


rosnode:查看当前在运行什么

rosnode list


如果你在运行类似于rosnode的指令时出现一些问题

也许你需要添加一些环境设置文件到你的~/.bashrc或者手动重新配置他们。

rosnode显示当前运行的ROS节点信息。

rosnode list指令列出活跃的节点

输出:/rosout 这个节点用于收集和记录节点调试输出信息,所以它总是在运行的。

rosnode info命令返回的是关于一个特定节点的信息

rosnode info /rosout

Node [/rosout]
Publications:
* /rosout_agg [rosgraph_msgs/Log]

Subscriptions:
* /rosout [unknown type]

Services:
* /rosout/get_loggers
* /rosout/set_logger_level

contacting node http://ada-HP-Spectre-x360-Convertible-13-ae0xx:39211/ ...
Pid: 7160


rosrun : rosrun允许你使用包名直接运行一个包内的节点(而不需要知道这个包的路径)

$ rosrun [package_name] [node_name]


运行:

rosrun turtlesim turtlesim_node
出来一乌龟0 0...
在新的终端
rosnode list

/rosout
/turtlesim


还可以通过命令行来改变名称

rosrun turtlesim turtlesim_node __name:=my_turtle

在新的终端
rosnode list

/rosout
/my_turtle

ctrl+c不会关闭进程,最好关闭窗口
在终端中使用ctrl-C停止节点,而不是关闭窗口


rosnode cleanup

尝试清除rosnode 列表


可以看到新的/my_turtle节点

理解ROS话题

开始小乌龟的例子

rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
然后可以用方向键控制运动


rosnode list
/rosout
/teleop_turtle
/turtlesim


解读:

turtle_teleop_key在一个话题上发布按键输入消息,而turtlesim则订阅该话题以接收该消息

使用rqt_graph来显示当前运行的节点和话题

rqt_graph:能够创建一个显示当前系统运行情况的动态图形

rosrun rqt_graph rqt_graph




如果你将鼠标放在/turtle1/command_velocity上方,相应的ROS节点(蓝色和绿色)话题(红色)就会高亮显示。

正如你所看到的turtlesim_node和turtle_teleop_key节点正通过一个名为/turtle1/command_velocity的话题来互相通信

rostopic:获取有关ROS话题的信息

rostopic bw display bandwidth used by topic
rostopic delay  display delay of topic from timestamp in header
rostopic echo   print messages to screen
rostopic find   find topics by type
rostopic hz display publishing rate of topic
rostopic info   print information about active topic
rostopic list   list active topics
rostopic pub    publish data to topic
rostopic type   print topic or field type


使用:

rostopic echo : 查看某个话题上发布的数据

rostopic echo [topic]

rostopic echo /turtle1/cmd_vel


接下来我们通过按下方向键使turtle_teleop_key节点发布数据

---
linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: -2.0
---
linear:
x: -2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---


然后刷新一下rqt_graph



即rostopic echo 也订阅了/turtle1/cmd_vel话题

rostopic list : 列出所有当前订阅和发布的话题

-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
--host                group by host name


使用-v,显示详细信息

rostopic list -v

Published topics:
* /turtle1/color_sensor [turtlesim/Color] 2 publishers
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
* /rosout [rosgraph_msgs/Log] 5 publishers
* /rosout_agg [rosgraph_msgs/Log] 1 publisher
* /turtle1/pose [turtlesim/Pose] 2 publishers

Subscribed topics:
* /turtle1/cmd_vel [geometry_msgs/Twist] 3 subscribers
* /rosout [rosgraph_msgs/Log] 1 subscriber


ROS Messages

话题之间的通信是通过在节点之间发送ROS消息实现的。

对于发布器(turtle_teleop_key和订阅器(turtulesim_node)之间的通信,发布器和订阅器之间必须发送和接收相同类型的消息

这意味着话题的类型是由发布在它上面的消息类型决定的

使用rostopic type命令可以查看发布在某个话题上的消息类型。

rostopic type : 查看发布在某个话题上的消息类型

rostopic type [topic]

$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
$ 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节点所期望的消息类型,如何结合消息使用rostopic

rostopic pub : 把数据发布到当前某个正在广播的话题上

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]'
以2.0大小的线速度和1.8大小的角速度开始移动
publishing and latching message for 3.0 seconds


解读:

命令会发布消息到指定话题 发布一条消息后退出 话题名称 消息类型 – 参数

使用rostopic pub -r命令来发布一个稳定的命令流

$ 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节点(绿色)进行通信

rostopic hz : 查看数据发布的频率

rostopic hz [topic]

$ rostopic hz /turtle1/pose


rqt_plot : 实时显示一个发布到某个话题上的数据变化图形

rosrun rqt_plot rqt_plot


这会弹出一个新窗口,在窗口左上角的一个文本框里面你可以添加需要绘制的话题

在里面输入/turtle1/pose/x后之前处于禁用状态的加号按钮将会被使能变亮。

按一下该按钮,并对/turtle1/pose/y重复相同的过程。

现在你会在图形中看到turtle的x-y位置坐标图。

/turtle1/pose/theta

+显示,-隐藏

理解ROS服务和参数

ROS Services

节点之间通讯的另一种方式。

服务允许节点发送请求(request) 并获得一个响应(response)

rosservice : 使用 ROS 客户端/服务器框架提供的服务

rosservice list         输出可用服务的信息
rosservice call         调用带参数的服务
rosservice type         输出服务类型
rosservice find         依据类型寻找服务find services by service type
rosservice uri          输出服务的ROSRPC uri


$ rosservice list 查看turtlesim节点提供的服务
**/clear**
/kill
**/reset**
/rosout/get_loggers
/rosout/set_logger_level  rosout节点提供
**/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**


rosservice type [service] 查看clear服务类型

$ rosservice type clear
td_srvs/Empty
服务的类型为空(empty),这表明在调用这个服务是不需要参数(比如,请求不需要发送数据,响应也没有数据)


rosservice call 调用服务

rosservice call [service] [args]

$ rosservice call clear


清除了轨迹

rosservice type spawn | rossrv show 在给定的位置和角度生成新的乌龟

$ rosservice type spawn | rossrv show
float32 x
float32 y
float32 theta
string name
---
string name

$ rosservice call spawn 2 2 0.2 ""    未指定名称
name: "turtle2"


rosparam : 使得我们能够存储并操作ROS参数服务器(Parameter Server)上的数据

rosparam使用YAML标记语言的语法。 一般而言,YAML的表述很自然: 1是整型

1.0是浮点型

one是字符串

true是布尔

{a:b,c:d}是字典   

使用方法

rosparam set            设置参数
rosparam get            获取参数
rosparam load           从文件读取参数
rosparam dump           向文件中写入参数
rosparam delete         删除参数
rosparam list           列出参数名


rosparam list : 查看参数服务器上由那些参数

$ rosparam list
/background_b
/background_g
/background_r   3个参数用于设定背景颜色
/rosdistro
/roslaunch/uris/host_ada_hp_spectre_x360_convertible_13_ae0xx__42579
/rosversion
/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
rosdistro: 'kinetic

'
roslaunch:
uris: {host_ada_hp_spectre_x360_convertible_13_ae0xx__42579: 'http://ada-HP-Spectre-x360-Convertible-13-ae0xx:42579/'}
rosversion: '1.12.12

'
run_id: 52223180-ec90-11e7-855d-f894c2f54745


如果要存储参数,

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

使用rqt_console和rqt_logger_level进行调试,以及如何使用roslaunch同时运行多个节点

使用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

$ rosrun rqt_console rqt_console
$ rosrun rqt_logger_level rqt_logger_level




现在让我们在一个新终端中启动turtlesim:

$ rosrun turtlesim turtlesim_node

因为默认日志等级是INFO,所以你会看到turtlesim启动后输出的所有信息

日志等级按以下优先顺序排列:

Fatal

Error

Warn

Info

Debug

使用roslaunch来启动多个turtlesim节点和一个模仿节点以让一个turtlesim节点来模仿另一个turtlesim节点

roslauch : 用来启动定义在launch文件中的多个节点。

用法:

$ roslaunch [package] [filename.launch]

roscd beginner_tutorials


如果roscd执行失败了,记得设置你当前终端下的ROS_PACKAGE_PATH环境变量

设置方法如下:

exportROSPACKAGEPATH= /kineticworkspace/sandbox:ROS_PACKAGE_PATH

roscdbeginnertutorials如果你仍然无法找到beginnertutorials程序包,说明该程序包还没有创建,那么请返回到ROS/Tutorials/CreatingPackage教程,并按照创建程序包的操作方法创建一个beginnertutorials程序包。然后创建一个launch文件夹: mkdir launch

$ cd launch

创建launch文件:

turtlemimic.launch的launch文件

<launch>   解读:标明是launch文件
 <group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
创建了两个节点分组并以'命名空间(namespace)'标签来区分,其中一个名为turtlesim1,另一个名为turtlesim2,两个组里面都使用相同的turtlesim节点并命名为'sim',这样可以让我们同时启动两个turtlesim模拟器而不会产生命名冲突
<node pkg="turtlesim" name="mimic" type="mimic">
  <remap from="input" to="turtlesim1/turtle1"/>
   <remap from="output" to="turtlesim2/turtle1"/>
 </node>
 在这里我们启动模仿节点,并将所有话题的输入和输出分别重命名为turtlesim1和turtlesim2,这样就会使turtlesim2模仿turtlesim1
</launch>


通过roslaunch命令来启动launch文件

$ roslaunch beginner_tutorials turtlemimic.launch


现在将会有两个turtlesims被启动,然后我们在一个新终端中使用rostopic命令发送速度设定消息

$ 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



感谢创客智造

http://www.ncnynl.com/archives/201608/504.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  开源代码 ros