机器人操作系统ROS(04):ROS基本元素
2、文件系统
package是ros的代码组合,manifests用来描述package。先安装一个演示包:
$ sudo apt-get install ros-kinetic-ros-tutorials
几个工具:
$ rospack find [package_name],allows to get information about packages.
$ roscd [locationname[/subdir]],allows to change directory (cd) directly to a package or a stack.
$ rosls [package_name],allows to ls directly in a package by name rather than by absolute path.
$ Tab Completion,这个和所有unix-like的系统一样的。
3、create package
package必须具有一个package.xml和CMakeLists.txt,最简单像这样:
my_package/
CMakeLists.txt
package.xml
Notes:
1、create package要在src之下:
$ cd ~/catkin_ws/src
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
2、build package要在工作区之下:
$ cd ~/catkin_ws
$ catkin_make
这样获得和/opt/ros/kinetic结构类似的catkin_ws/devel。
3、需要运行build所得到的setup.*sh从而把catkin_ws工作区source到当前ros环境:
$ . ~/catkin_ws/devel/setup.bash
4、查看该package的一阶依赖关系,其实就是package.xml:
$ rospack depends 1 beginner_tutorials
或者查看所有依赖:
$ rospack depends beginner_tutorials
5、这些关系其实保存于Manifests (package.xml)文件:
<description>The beginner_tutorials package</description>
<maintainer email=”user@todo.todo”>user</maintainer>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<run_depend>roscpp</run_depend>
4、build package
1、CMake流程是:
转到CMake project
$ mkdir build
$ cd build
$ cmake ..
$ make
$ make install # (可选)
2、catkin流程是:
转到workspace
$ cd ~/catkin_ws/
$ catkin_make
$ catkin_make install # (可选)
5、Nodes
1、安装一个轻量级的模拟器:
$ sudo apt-get install ros-kinetic-ros-tutorials
2、roscore=ROS-Master + rosout + parameter server,使用roscore启动ROS:
$ roscore
3、rosnode指令
$ rosnode list
/rosout
$ rosnode info /rosout
4、rosrun启动一个package的node,例如:
$ rosrun turtlesim turtlesim_node
$ rosnode list
/rosout
/turtlesim
也可以给以新的名字参数,例如关闭前面打开的小乌龟,然后:
$ rosrun turtlesim turtlesim_node __name:=my_turtle
$ rosnode list
/rosout
/my_turtle
如果还能list出来第一次的turtlesim,是因为用ctl-c退出而不是关闭小乌龟,此时是ping是不通:
$ rosnode ping turtlesim
可以用这个清理:
$ rosnode cleanup
6、Topic




1、运行模拟器的node和控制器的node
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
这样,就可以用鼠标控制小乌龟移动。
2、查看node和topic
Turtlesim_node和turtle_teleop_key node通过Topic通讯,turtle_teleop_key在topic中发布用户敲击的键,而turtlesim订阅这个topic以接收用户敲击的键。rqt_graph可以图形化显示当前运行的nodes和topics,安装rqt_graph:
$ sudo apt-get install ros-kinetic-rqt
$ sudo apt-get install ros-kinetic-rqt-common-plugins
运行:
$ rosrun rqt_graph rqt_graph
可以看到蓝色和绿色的两个nodes以及红色的topic,turtlesim_node和turtle_teleop_key这两个nodes通过/turtle1/command_velocity这个topic进行通讯。
3、rostopic指令
list可以显示当前发布和订阅的所有topics:
$ rostopic list -v
echo可以把turtle_teleop_key这个node在topic中public的数据echo出来:
$ rostopic echo /turtle1/cmd_vel
这时候如果刷新一下rpt-graph,可以看到多出来node,这个多出来的node就是rostopic echo:
4、rosmsg
topic上面传递的是各个nodes之间的message,发布者发布和接收者接收的消息必须数据类型一致。
$ 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
知道确切地知道消息的数据类型之后,可以发布消息:
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist — ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’
解释:rostopic pub发布一个消息,-1发布一次消息就停止,/turtle1/cmd_vel是要发布到的topic,geometry_msgs/Twist指定消息的数据类型,–表明在此之后不再是选项而是参数,两个-是因为有的参数是以-开始的负值,这里的参数是线速度2.0、角速度1.8这样YAML格式的参数。
$ rostopic pub -r 2 /turtle1/cmd_vel geometry_msgs/Twist — ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’
这个是连续发布,此时刷新rpt-graph可见多出的node:
$ rostopic echo /turtle1/pose
可以查看连续的发布的数据。或者使用$ rosrun rqt_plot rqt_plot也可以。
-1、YAML
Several ROS tools (rostopic, rosservice) use the YAML markup language on the command line.
YAML was chosen as, in most cases, it offers a very simple, nearly markup-less solution to typing in typed parameters.
canonical: 12345
decimal: +12,345
octal: 014
hexadecimal: 0xC
canonical: 1.23015e+3
exponential: 12.3015e+02
fixed: 1,230.15
string: foo
doublequoted: “Double-quotes allow escape sequences.u263A”
singlequoted: ‘Single quotes do not’
true: true
false: false
true-y: y
false-n: n
string: ‘12345’
dict: {a: 1, b: 2}
list: [1, 2, 3, 4, 5]
5A.1、Representing Messages in YAML
$ rosservice call /foo msg/Type 1 2
这个将产生{1,2}的list类型。
$ rosservice call /foo msg/Type ‘{a: 1, b: 2}’
这个是dict类型。
7、services和param

service是各个node之间除了topic之外的另一种通讯方式,node可以发起请求或接收响应,rosservic指令可以控制ROS的client/service结构。$rosservice list可以发现存在reset,clear,spawn,kill,turtle1/set_pen,/turtle1/teleport_absolute,/turtle1/teleport_relative,turtlesim/get_loggers,turtlesim/set_logger_level等几项服务。
1、rosservice
$ rosservice type clear
std_srvs/Empty
这说明clear为空服务,没有参数,也就是请求时不发送数据响应时不接收数据,尝试call:
$ rosservice call /clear
它清除了turtlesim_node的背景。
再看一个带参数的,先查看spawn这个创建新的小乌龟的service的结构:
$ rosservice type spawn | rossrv show
发现是ixytheta三个位置参数和一个名字参数,然后用默认弥功能自参数尝试call:
$ rosservice call spawn 2 2 0.2 “”
name: turtle2
2、rosparam
rosparam可以操作参数服务器的数据:
$ rosparam list
例如修改背景颜色:
$ rosparam set background_r 150
使其生效:
$ rosservice call clear
查看:
$ rosparam get background_g
86
或者查看整个参数服务器:
$ rosparam get /
8、console和roslanch
1、如果需要则安装一些新包(重复安装并不会造成不良影响):
$ sudo apt-get install ros-kinetic-rqt
$ sudo apt-get install ros-kinetic-rqt-common-plugins
2、rqt_console和rqt_logger_level
依附于ros debugging框架的rqt_console可以显示调试信息,而rqt_logger_level可以设定优先级(DEBUG, WARN, INFO, and ERROR)。
3、启动控制台:
$ rosrun rqt_console rqt_console
$ rosrun rqt_logger_level rqt_logger_level
或者用roslaunch启动launch文件。
$ roscd beginner_tutorials
$ mkdir launch
$ cd launch
建立turtlemimic.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>
<node pkg=”turtlesim” name=”mimic” type=”mimic”>
<remap from=”input” to=”turtlesim1/turtle1″/>
<remap from=”output” to=”turtlesim2/turtle1″/>
</node>
</launch>

运行:
$ roslaunch beginner_tutorials turtlemimic.launch
驱动两个小乌龟:
$ rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 — ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, -1.8]’
9、rosed
如果必要先安装vim:
$ sudo apt-get install vim
设置编辑器:
$ export EDITOR=’nano -w’
使用rosed就免去了繁琐的指定文件路径:
$ rosed roscpp Logger.msg
10、rosbag
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
查看有哪些主题:
$ rostopic list -v
准备记录:
$ mkdir ~/bagfiles
$ cd ~/bagfiles
$ rosbag record -a
可以回放:
$ rosbag play <your bagfile>