一.建立一个包
1.1一个包的组成
必须满足三个要求:
1. 一个包里必须包含一个 package.xml 文件,用于说明关于包的基本信息(meta information)——相当于 Android 里德 Manifest.xml 文件。
2. 包必须包含一个 CMakeLists.txt 文件。
3. 一个文件夹里只能有一个包。这也意味着,不会有多个包共用相同的路径。
1.2包和catkin WorkSpace空间关系
一个包通常要在一个 catkin WorkSpace 中。也可以单独创建包。
包在 WorkSpace 空间中的结构是这样的:
workspace_folder/
src/
CMakeLists.txt
- WORKSPACE
-- SOURCE SPACE
-- 'Toplevel' CMake file, provided by catkin
package_1/
CMakeLists.txt
package.xml
-- CMakeLists.txt file for package_1
-- Package manifest for package_1
...
package_n/
MakeLists.txt
package.xml
-- CMakeLists.txt file for package_n
-- Package manifest for package_n
1.3创建一个catkin Package
首先进入一个WorkSpace的src中:cd ~/catkin_ws/src
重点来了,创建包:catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
例:catkin_create_pkg beginner_tutorials std_msgs rospy roscpp 创建了一个名为beginger_tutorials的包,这个包包含package.xml和CMakeList.txt文件,并包含三个依赖。
1.4包的依赖
直接依赖:所依赖的包/类/库/文件 间接依赖:所依赖的文件
rospack depends <name> 查询想要查询的类的依赖
rospack depends <package_name> 列出包所依赖的对象
1.5 定制自己的包
1.5.1 认识包package.xml文件的各部分含义
a.desceiption 标签
添加对于这个包的描述
b.maintainer标签
描述了谁是这个包的维护者,至少需要一个维护者。标签中给出了维护者的邮箱。
3.liense 标签
选择一个开源代码许可证:BSD.MIT.Boost Software Liense.GPLv2,GPLv3.LGPLV2.1.and LGPLv3,在ROS里采用BSD开源许可证
4.dependencies标签
给出了该包依赖于别的包的文件,默认为buildtool_depend/编译build_depend/运行run_depend
二.编译一个ROS包
命令:catkin_make [make_targets] [-DCMAKE_VARIABLES=...] 前提是进入一个工作空间中
不过,如果不在工作空间中,也可以更改编译路径,比较麻烦
编译之后,在工作空间中除了 src 文件夹,还有 build 和 devel 文件夹。build 是 cmake 和 make 在编
译包时生成的一些设置文件。查看该文件夹会发现其中多了一个 beginner_tutorials 的包。devel 文件
夹是默认的 devel 空间路径,是安装包之前的一些必要的可执行文件和库
三.理解ROS节点
首先需要安装一个轻量级的模拟器:sudo apt-get install ros-kinetic-ros-tutorials 有可能已经安装过了
3.1 几个概念
Nodes:节点 Messages:消息 Topics:话题 Master:主节点 rosout:标准输出/标准错误的输出
roscore:Master+rosout+parameter server
3.2 Client Libraries
ROS Client library 允许节点以不同的编程语言与其他节点进行通信。其中包含两个包:
rospy = python client library
roscpp = c++ client library
3.3 roscore
在运行ros时应该首先运行roscore,会有关于启动的一系列输出
3.4开始使用rosnode
查看当前处于活动状态的节点: rosnode list
(如果遇到ERROR: Unable to communicate with master!,说明主节点已经被关闭,需要打开终端,启动roscore,不要关闭这个终端,然后再打开一个终端,此时执行rosnode list 成功)
返回相关节点信息:rosnode info /rosout
3.5使用rosrun
rosrun 命令能够利用包名运行一个节点,而不需要知道包的路径:rosrun [package_name] [node_name]
运行一个乌龟程序:rosrun turtlesim turtlesim_node __name:=my_turtle
这时候再新开一个 terminal 运行 rosnode list 命令会发现多了一个 turtlesim 节点
可以使用rosnode ping 访问节点:rosnode ping my_turtle
四.理解ROS中的Topics
接着之前的程序,即运行一个Maser节点,以及运行乌龟仿真程序
4.1键盘控制乌龟
运行了乌龟仿真程序,也需要驱动乌龟的程序。在新的终端中,运行:rosrun turtlesim turtle_teleop_key
此时将屏幕的焦点调回之前的乌龟界面,然后调出控制终端,即可按方向键驱动乌龟
4.2 ROS Topics
turtlesim_node和tertle_teleop_key节点通过ROS Topics与其他节点通信,控制程序在一个Topic上发布键盘输入信息,而界面通过订阅这个Topics
接收控制信息。
可以使用rqt_graph来查看当前运行的节点和Topics,但使用前需要先安装:
sudo apt-get install ros-kinetic-rqt
sudo apt-get install ros-kinetic-rqt-common-plugins
然后运行:rosrun rqt_graph rqt_graph 可以得到:
此时把鼠标可以让主题及通信高亮
4.3介绍rostopic
rostopic -h可以查看其帮助:
rostopic is a command-line tool for printing information about ROS Topics.
Commands:
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
Type rostopic <command> -h for more detailed usage, e.g. 'rostopic echo -h'
4.3.1 rostopic echo
用rostopic echo /turtle1/cmd_vel ,回到graph中,按左上角的刷新按钮,得到:
4.3.2rostopic list
这个命令可以列出当前活动的topics
rostopic list -h:
Usage: rostopic list [/namespace]
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
--host group by host name
我们可以用 rostopic list –v 来列出发布和订阅的 Topics。
4.4 ROS Messages
Topics上节点的通信是通过传递消息Messages时发生的,为 完 成 发 布 者 (publisher: , 如turtle_teleop_key 节点)和订阅者(subscriber,如 turtlesim_node 节点)之间的通信,发布者和订阅者必须发送和接收相同类型的消息。这意味着一个 topic 的类型是由发布到这个 topic 上的 message 的类型定义的。发布到 topic 上的 message 的类型可用 rostopic type 命令来决定 。
4.4.1使用rostopic type
这个命令返回任意被发布的topic的Message的类型
rostopic type [topic] 例:rostopic type /turtle1/cmd_vel
查看这个Message的详细信息:rosmsg show geometry_msgs/Twist
返回x/y/z轴的线速度,角速度
4.4.2 使用rostopic pub命令
使用rostopic pub 可以向topic 发布一个数据,格式: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]'
该 命 令 向 /turtle1/cmd_vel 这 个 topic 上 发 布 了 一 个 消 息 , 这 个 消 息 的 类 型 是
geometry_msgs/Twist 类型的
(分别来表征小龟的线速度和角速度),这个消息的值为“[2.0, 0.0, 0.0] [0.0,
0.0, 1.8]”。也就是说小龟在 x 轴(这个坐标系是固结在小龟身上的,以小龟向前的方向为 x 轴,垂
直于小龟移动平面,从小龟腹部指向龟壳的方向为 z 轴,y 轴方向以右手坐标系标准确定)方向速度
为 2.0,y 方向线速度为 0,z 轴方向速度为 0.绕 x 轴角速度为 0,绕 y 轴角速度为 0,绕 z 轴角速度
为 1.8。因此,小龟就开始绕圈跑,绕圈半径为 2/1.8。参数-1 的含义是 rostopic 只发布一个 message
然后退出。
再来个一直画圈的:rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0,0.0]' '[0.0, 0.0, 1.8]'
可以尝试修改参数运行得到不同的速度及轨迹半径
4.4.3 使用rostopic hz命令
作用:报告每一个数据发布的频率,格式:rostopic hz [topic]
如:rostopic hz /turtle1/pose
此时turtlesim发送数据的频率为62Hz,可以用rostopic type 配合rosmsg show得到一个topic更多的信息:rostopic type /turtle1/cmd_vel | rosmsg show
4.4.4使用rqt_plot命令
rqt_plot可以动态显示发布到topic中的数据,我们可以用rqt_plot命令画出发布到/turtel/pose这个topic上的数据
首先,使用rosrun rqt_plot rqt_plot 启动rqt_plot,然后在文本框中输入要绘制的曲线元素即可。