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中find参数选项,该选项可以返回软件包的路径信息。
用法: rospack find [包名称]
示例:$ rospack find roscpp
应输出:YOUR_INSTALL_PATH/share/roscpp
roscd是rosbash命令集中的一部分,它允许你直接切换(cd)工作目录到某个软件包或者软件包集当中。
用法:roscd [本地包名称[/子目录]]
示例: roscdroscpp使用Unix命令pwd来输出当前工作目录: pwd
你应该会看到:YOUR_INSTALL_PATH/share/roscpp
roscd只能切换到那些路径已经包含在ROS_PACKAGE_PATH环境变量中的软件包,要查看ROS_PACKAGE_PATH中包含的路径可以输入:
echo ROS_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可以切换到ROS保存日记文件的目录下。需要注意的是,如果你没有执行过任何ROS程序,系统会报错说该目录不存在。
如果你已经运行过ROS程序,那么可以尝试:$ roscd log
rosls是rosbash命令集中的一部分,它允许你直接按软件包的名称而不是绝对路径执行ls命令(罗列目录)。
用法:rosls [本地包名称[/子目录]]
示例:$ rosls roscpp_tutorialsian应输出:cmake package.xml srv
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
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]
a. 直接依赖
rospack depends1 beginner_tutorials
(先source ../devel/setup.sh)这些依赖包保存在package.xml文件中
b. 间接依赖
比如rospy还有其它依赖包
rospack depends1 rospy
c. 一个程序包还可以有好几个间接的依赖包
幸运的是使用rospack可以递归检测出所有的依赖包。
<description>The beginner_tutorials packagedescription>
描述标签
<maintainer email="[email protected]">adamaintainer>
维护标签
<license>TODOlicense>
许可标签
(对于本教程我们将使用BSD协议,因为ROS核心组件的剩余部分已经使用了该协议:
<license>BSDlicense>)
build_depend
buildtool_depend
run_depend
test_depend
依赖项标签
除了catkin中默认提供的buildtool_depend,所有我们列出的依赖包都已经被添加到build_depend标签中。
<buildtool_depend>catkinbuildtool_depend>
<build_depend>roscppbuild_depend>
<build_depend>rospybuild_depend>
<build_depend>std_msgsbuild_depend>
在本例中,因为在编译和运行时我们需要用到所有指定的依赖包,因此还需要将每一个依赖包分别添加到run_depend标签中
<run_depend>roscpprun_depend>
<run_depend>rospyrun_depend>
<run_depend>std_msgsrun_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程序包
Nodes:节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信,可以发布或接收一个话题,可以提供或使用某种服务。
Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题。
Topics:话题,节点可以发布消息到话题,也可以订阅话题以接收消息。
Master:节点管理器,ROS名称服务 (比如帮助节点找到彼此)。
rosout: ROS中相当于stdout/stderr。
roscore: 主机+ rosout + 参数服务器
(参数服务器会在后面介绍)。
ROS客户端库允许使用不同编程语言编写的节点之间互相通信:
rospy = python 客户端库
roscpp = c++ 客户端库
rosjs = javascripts客户端库
rosjava = java客户端库
如果roscore运行后无法正常初始化,很有可能是存在网络配置问题。
参见 网络设置——单机设置
如果roscore不能初始化并提示缺少权限,这可能是因为~/.ros文件夹归属于root用户(只有root用户才能访问)
修改该文件夹的用户归属关系:
$ sudo chown -R ~/.ros
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 [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节点
开始小乌龟的例子
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
然后可以用方向键控制运动
rosnode list
/rosout
/teleop_turtle
/turtlesim
解读:
turtle_teleop_key在一个话题上发布按键输入消息,而turtlesim则订阅该话题以接收该消息
使用rqt_graph来显示当前运行的节点和话题
rosrun rqt_graph rqt_graph
如果你将鼠标放在/turtle1/command_velocity上方,相应的ROS节点(蓝色和绿色)和话题(红色)就会高亮显示。
正如你所看到的turtlesim_node和turtle_teleop_key节点正通过一个名为/turtle1/command_velocity的话题来互相通信
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话题
-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消息实现的。
对于发布器(turtle_teleop_key和订阅器(turtulesim_node)之间的通信,发布器和订阅器之间必须发送和接收相同类型的消息。
这意味着话题的类型是由发布在它上面的消息类型决定的。
使用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 [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 [topic]
$ rostopic hz /turtle1/pose
rosrun rqt_plot rqt_plot
这会弹出一个新窗口,在窗口左上角的一个文本框里面你可以添加需要绘制的话题。
在里面输入/turtle1/pose/x后之前处于禁用状态的加号按钮将会被使能变亮。
按一下该按钮,并对/turtle1/pose/y重复相同的过程。
现在你会在图形中看到turtle的x-y位置坐标图。
/turtle1/pose/theta
+显示,-隐藏
节点之间通讯的另一种方式。
服务允许节点发送请求(request) 并获得一个响应(response)
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使用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属于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
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