1、下面我们开始创建和构建一个catkin工作空间
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
catkin_make命令在catkin工作空间中是一个非常方便的工具。在你的工作空间中第一次运行它时,它会在src目录下创建一个CMakeLists.txt的链接
2、接下来首先source一下新生成的setup.*sh文件:
source devel/setup.bash
3、要保证工作区被安装脚本正确覆盖,需确定ROS_PACKAGE_PATH环境变量包含你当前的工作空间目录:
$ echo $ROS_PACKAGE_PATH
/home//catkin_ws/src:/opt/ros//share
$ 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工作区并生效配置文件
$ cd ~/catkin_ws
$ catkin_make
$ . ~/catkin_ws/devel/setup.bash
1、一级依赖
#查看软件包依赖关系
#使用rospack命令工具来查看这些一级依赖包
$ rospack depends1 beginner_tutorials
std_msgs
rospy
roscpp
#rospack列出了在运行catkin_create_pkg命令时作为参数的依赖包,这些依赖关系存储在package.xml文件中
$ roscd beginner_tutorials
$ cat package.xml
...
catkin
roscpp
rospy
std_msgs
...
2、间接依赖
#在很多情况下,一个依赖包还会有它自己的依赖关系,比如,rospy就有其它依赖包。
$ rospack depends1 rospy
genpy
roscpp
rosgraph
rosgraph_msgs
roslib
std_msgs
#使用rospack可以递归检测出所有嵌套的依赖包
$ rospack depends beginner_tutorials
cpp_common
rostime
roscpp_traits
roscpp_serialization
catkin
genmsg
genpy
message_runtime
gencpp
geneus
gennodejs
genlisp
message_generation
rosbuild
rosconsole
std_msgs
rosgraph_msgs
xmlrpcpp
roscpp
rosgraph
ros_environment
rospack
roslib
rospy
描述标签
The beginner_tutorials package
维护者标签
#它能够让其他人联系到软件包的相关人员
user
##Your Name
许可证标签
#选择一种许可证并将它填写到这里。一些常见的开源许可协议有BSD、MIT、Boost Software License、GPLv2、GPLv3、LGPLv2.1和LGPLv3。我们使用BSD许可证,因为其他核心ROS组件已经在使用它:
TODO
## BSD
依赖项标签
#描述了软件包的依赖关系,这些依赖项分为build_depend、buildtool_depend、run_depend、test_depend
#除了catkin中默认提供的buildtool_depend,所有我们列出的依赖包都已经被添加到build_depend标签中。在本例中,因为在编译和运行时都需要用到所有指定的依赖包,因此还要将每一个依赖包分别添加到run_depend标签中:
catkin
roscpp
rospy
std_msgs
roscpp
rospy
std_msgs
最终文件
1
2
3 beginner_tutorials
4 0.1.0
5 The beginner_tutorials package
6
7 Your Name
8 BSD
9 http://wiki.ros.org/beginner_tutorials
10 Jane Doe
11
12 catkin
13
14 roscpp
15 rospy
16 std_msgs
17
18 roscpp
19 rospy
20 std_msgs
21
22
# 在catkin工作空间下
$ catkin_make
build
devel
src
build 目录是构建空间的默认位置,同时cmake和make也是在这里被调用来配置和构建你的软件包。
devel目录是开发空间的默认位置, 在安装软件包之前,这里可以存放可执行文件和库。
节点(Nodes):节点是一个可执行文件,它可以通过ROS来与其他节点进行通信。
消息(Messages):订阅或发布话题时所使用的ROS数据类型。
话题(Topics):节点可以将消息发布到话题,或通过订阅话题来接收消息。
主节点(Master):ROS的命名服务,例如帮助节点发现彼此。
rosout:在ROS中相当于stdout/stderr(标准输出/标准错误)。
roscore:主节点 + rosout + 参数服务器(会在以后介绍)。
rosnode命令
rosnode info print information about node
rosnode kill kill a running node
rosnode list list active nodes
rosnode machine list nodes running on a particular machine or list machines
rosnode ping test connectivity to node
rosnode cleanup purge registration information of unreachable nodes
ROS客户端库可以让用不同编程语言编写的节点进行相互通信:
roscore是你在运行所有ROS程序前首先要运行的命令。
rosrun可以让你用包名直接运行软件包内的节点(而不需要知道包的路径)。
$ rosrun [package_name] [node_name]
turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题来相互通信的。turtle_teleop_key在话题上发布键盘按下的消息,turtlesim则订阅该话题以接收消息。让我们使用rqt_graph来显示当前运行的节点和话题。
rqt_graph用动态的图显示了系统中正在发生的事情。
$ rosrun rqt_graph rqt_graph
rostopic命令工具能让你获取ROS话题的信息。
$ 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
rostopic echo可以显示在某个话题上发布的数据。
rostopic echo [topic]
$ rostopic echo /turtle1/cmd_vel
rostopic pub可以把数据发布到当前某个正在广播的话题上。
rostopic pub [topic] [msg_type] [args]
$ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity -- 2.0 1.8
以上命令会发送一条消息给turtlesim,告诉它以2.0大小的线速度和1.8大小的角速度移动。
这条命令将消息发布到指定的话题:
rostopic pub
这一选项会让rostopic只发布一条消息,然后退出:
-1
这是要发布到的话题的名称:
/turtle1/command_velocity
这是发布到话题时要使用的消息的类型:
turtlesim/Velocity
这一选项(两个破折号)用来告诉选项解析器,表明之后的参数都不是选项。如果参数前有破折号(-)比如负数,那么这是必需的。
--
如前所述,一个turtlesim/Velocity消息有两个浮点型元素:linear和angular。在本例中,2.0是linear的值,而1.8则是angular的值。这些参数实际上使用的是YAML语法,在YAML命令行文档中有描述。
2.0 1.8
数据发布的速率
turtlesim_node发布/turtle/pose得有多快:
$ rostopic hz /turtle1/pose
$ rosrun rqt_plot rqt_plot
这会弹出一个新窗口,可以在左上角的文本框里面添加任何想要绘制的话题。在里面输入/turtle1/pose/x后,之前不能按下的加号按钮将会变亮。按一下该按钮,并对/turtle1/pose/y重复相同的过程。现在你会在图中看到turtle的x-y位置。
服务(Services)是节点之间通讯的另一种方式。服务允许节点发送一个请求(request)并获得一个响应(response)。
rosservice list 输出活跃服务的信息
rosservice call 用给定的参数调用服务
rosservice type 输出服务的类型
rosservice find 按服务的类型查找服务
rosservice uri 输出服务的ROSRPC uri
rosparam set 设置参数
rosparam get 获取参数
rosparam load 从文件中加载参数
rosparam dump 向文件中转储参数
rosparam delete 删除参数
rosparam list 列出参数名
现在我们修改背景颜色的红色通道值:
$ rosparam set /turtlesim/background_r 150
上述指令修改了参数的值,现在我们需要调用clear服务使得参数的修改能生效:
$ rosservice call /clear
然后我们来查看参数服务器上其他参数的值。获取背景的绿色通道的值:
$ rosparam get /turtlesim/background_g
86
rosparam dump [file_name] [namespace]
rosparam load [file_name] [namespace]
在这里,我们将所有的参数写入params.yaml文件:
$ rosparam dump params.yaml
你甚至可以将yaml文件重载入新的命名空间,例如copy_turtle:
$ rosparam load params.yaml copy_turtle
$ rosparam get /copy_turtle/turtlesim/background_b
255
rqt_console连接到了ROS的日志框架,以显示节点的输出信息。rqt_logger_level允许我们在节点运行时改变输出信息的详细级别,包括Debug、Info、Warn和Error`。
$ rosrun rqt_console rqt_console
$ rosrun rqt_logger_level rqt_logger_level
$ mkdir launch $ cd launch 存放launch文件的目录不一定非要命名为launch,事实上都不用非得放在目录中,roslaunch命令会自动查找经过的包并检测可用的启动文件。然而,这种推荐的标准做法被认为是“最佳实践” 现在一起创建一个名为turtlemimic.launch的launch文件并复制粘贴以下内容进去
#首先用launch标签开头,以表明这是一个launch文件。
1
#此处我们创建了两个分组,并以命名空间(namespace)标签来区分,其中一个名为turtulesim1,另一个名为turtlesim2,两个分组中都有相同的名为sim的turtlesim节点。这样可以让我们同时启动两个turtlesim模拟器,而不会产生命名冲突。
3
4
5
6
7
8
9
#在这里我们启动模仿节点,话题的输入和输出分别重命名为turtlesim1和turtlesim2,这样就可以让turtlesim2模仿turtlesim1了。
11
12
13
14
15
16
这一行使得launch文件的XML标签闭合。
roslaunch beginner_tutorials turtlemimic.launch rostopic pub /turtlesim1/turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0 -1.8
msg(消息):msg文件就是文本文件,用于描述ROS消息的字段。它们用于为不同编程语言编写的消息生成源代码。
srv(服务):一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。
msg文件存放在软件包的msg目录下,srv文件则存放在srv目录下。
下面是一个msg文件的样例,它使用了Header,string,和其他另外两个消息的类型:
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
srv文件和msg文件一样,只是它们包含两个部分:请求和响应。这两部分用一条---线隔开。下面是一个srv文件的示例:
int64 A
int64 B
---
int64 Sum