导览
本单元你将学到:
- 如何构建和启动ROS程序(功能包和launch文件)
- 如何创建ROS程序(使用Python语言)
- ROS基本概念:节点,参数服务器,环境变量,Roscore
课前总结
- 功能包:一个ROS程序所包含的所有文件(按结构组织)
- 关注节点标签的参数意义
- ls:列出所有内容
- roscd:进入某目录 命令+目录名
- catkin_create_pkg
- rospack list:列出所有功能包
- rospack profile:刷新功能包
- rosnode info/:查看节点
- catkin_make:编译整个src目录。要先cd到catkin_ws才能输入该命令(才有效)
- catkin_ws/src/所有功能包/src(源文件)
- 创建功能包要先进入src
- 创建ROS程序三步走,先创建功能包,再创建源文件(src下),再创建launch文件(launch目录下)
- 源文件依附于节点哦
- 源文件运行完毕,节点就kill了
- 编译完功能包,才能运行
让机器人动起来
- 方法:运行现有的ROS程序控制该机器人。
- 一个ROS程序通过使用一些称为launch 文件的特殊文件来执行(执行ROS程序要通过使用.lanuch文件)
roslaunch turtlebot_teleop keyboard_teleop.launch
启动ROS(roslaunch)
roslaunch 是启动ROS程序的命令。用法如下:
roslaunch
该命令有两个参数:第一个是包含launch文件的功能包名称 ,第二个是launch文件的名称本身(位于该功能包内)。
功能包
ROS程序
ROS程序指的是所有cpp文件,python文件,配置文件,编译文件,启动文件和参数文件的其中一种。
ROS使用功能包组织其程序。可以把一个功能包想象成一个特定的ROS程序所包含的所有文件:所有cpp文件,python文件,配置文件,编译文件,启动文件和参数文件。
组织结构
所有这些文件按照下面的结构组织到一个功能包中:
launch 文件夹:包含launch文件
src 文件夹:源文件 (cpp, python)
CMakeLists.txt: 用于编译的cmake规则列表
package.xml: 功能包信息和依赖项
进入功能包(roscd)
要进入某个功能包,可使用ROS命令 roscd。输入:
roscd package_name
移动到功能包 package_name 所处的路径。
- 你想运行的每一个ROS程序都组织在一个功能包中
- 你所创建的每一个ROS程序都必须组织在一个功能包中
- 功能包是ROS程序的主要组织系统
launch文件
- ROS使用launch文件来运行程序
查看launch文件命令
roscd turtlebot_teleop
cd launch
cat keyboard_teleop.launchlaunch文件
<launch>
<!-- turtlebot_teleop_key already has its own built in velocity smoother -->
<node pkg="turtlebot_teleop" type="turtlebot_teleop_key.py" name="turtlebot_teleop_keyboard" output="screen">
<param name="scale_linear" value="0.5" type="double"/>
<param name="scale_angular" value="1.5" type="double"/>
<remap from="turtlebot_teleop_keyboard/cmd_vel" to="/cmd_vel"/> <!-- cmd_vel_mux/input/teleop"/-->
</node>
</launch>
在launch文件中,有一些参数设置和重新映射的额外标签。现在,我们只需要关注节点标签。
所有的launch文件包含在一个 标签中。在该标签中,你会看到一个 标签,在这里我们指定了如下参数:
pkg=”package_name” # 包含所要执行的ROS程序代码的功能包名称
type=”python_file_name.py” # 我们要执行的程序文件的名称
name=”node_name” # 启动Python文件的节点名称
output=”type_of_output” # 打印Python文件输出的通道
创建功能包(catkin_create_pkg)
创建功能包时,我们需要一个ROS工作空间,也即 catkin 工作空间. catkin 工作空间是你电脑硬盘上的一个目录,你的ROS 功能包必须位于其中以便能够被ROS用到。通常, catkin 工作空间目录简写为 catkin_ws
在shell中输入roscd进入catkin_ws。你会发现你被带进一个catkin_ws/devel 目录中。由于你想进入的是工作空间,所以输入cd .. 退回到上一层目录,停在/home/user/catkin_ws
在该工作空间中,有一个目录叫做src。该src文件夹将包含创建的所有功能包。每当你想创建一个新的功能包时,你必须在该目录中(catkin_ws/src)。在 WebShell输入 cd src 进入源目录
创建第一个功能包
catkin_create_pkg my_package rospy
该指令将在 src 目录下创建一个包含有几个文件的功能包
指令用法
catkin_create_pkg
package_name 是你想要创建的功能包的名称,package_dependencies 是该功能包所依赖的其他ROS功能包的名称
验证功能包创建成功与否(rospack)
- rospack list: 列出ROS系统中所有的功能包。
- rospack list | grep my_package:从ROS系统所有的功能包中过滤出名为 my_package的功能包。
- roscd my_package: 切换到功能包 my_package所在硬盘上的位置。
第一个ROS程序
- 在功能包my_package的 src 目录下创建一个Python文件
- 在功能包 my_package中创建一个launch目录
- 在launch目录中创建一个新的launch文件
- 执行roslaunch命令来启动你的程序
强制ROS刷新其功能包列表(rospack)
ROS检测不到刚创建的功能包,因此你无法通过roslaunch启动它。这种情况下,你可以使用下面的命令强制ROS刷新其功能包列表:
rospack profile
simple.py
#! /usr/bin/env python
# -*- coding:utf-8 -*-
# 该行语句确保所使用的解释器是你的环境路径中的第一个
# 每一个Python文件顶部都需要以这一行语句开始
import rospy # 导入rospy——一个ROS的Python库
rospy.init_node('ObiWan') # 初始化一个名为ObiWan的节点
print "Help me Obi-Wan Kenobi, you're my only hope" # 一个简单的Python输出
注:如果你的Python文件是通过终端创建的,可能会出现没有执行权限的情况。这种情况下,ROS就无法找到它。此时,你可以输入命令 chmod +x name_of_the_file.py赋给该文件执行权限
检测与赋予文件权限
要检查一个文件的权限,可在它所处的目录中运行下面的命令:
ls -la
- -rw-rw-r- 表示只有 读(r) 和 写e(w) 的权限,而没有执行的权限(用 x 表示)
输入命令 chmod +x name_of_the_file.py赋给该文件执行权限
ROS节点
rosnode查看节点
在刚才的代码中,你初始化了一个ROS节点,但是什么是节点? ROS节点就是ROS创建的程序。查看一台电脑上正在运行的节点,可使用ROS命令:
- rosnode list
Python程序结束时,节点也就被“kill”掉了
更新Python文件
#! /usr/bin/env python
import rospy
rospy.init_node("ObiWan")
rate = rospy.Rate(2) # We create a Rate object of 2Hz
while not rospy.is_shutdown(): # Endless loop until Ctrl + C
print "Help me Obi-Wan Kenobi, you're my only hope"
rate.sleep() # We sleep the needed time to maintain the Rate fixed above
# This program creates an endless loop that repeats itself 2 times per second (2Hz) until somebody presses Ctrl + C
# in the Shell
显示节点信息
- rosnode info /ObiWan
编译功能包(catkin_make)
创建功能包时,你通常需要编译它,这样它才能运行。ROS编译功能包的命令是:
catkin_make
该命令将编译整个 src目录,并且 它需要被发行到你的catkin_ws目录才能工作。这是强制的。 如果你试图从另一个目录编译,行不通。
catkin_make –only-pkg-with-deps
<>不用书写,该命令只编译指定的功能包及其依赖项
参数服务器
参数服务器是ROS用来存储参数的一个 词典。这些参数供节点在运行时使用,通常用于静态数据,例如配置参数
获取参数列表,运行:
rosparam list获取特定参数的值,输入:
rosparam get设置一个参数的值,输入:
rosparam set
Roscore
要想使一切工作,我们需要运行一个roscore。roscore是管理整个ROS系统的主进程 。为了使ROS能够正常工作,始终需要先运行roscore。启动roscore的命令是:
roscore
ROS环境变量
为了正常工作,ROS使用了一套Linux系统环境变量。你可以输入如下命令查看这些变量:
export | grep ROS
最重要的变量是 ROS_MASTER_URI 和 ROS_PACKAGE_PATH。
ROS_MASTER_URI -> 包含被执行的ROS核心的url。通常为你的电脑 (localhost)。
- ROS_PACKAGE_PATH -> 包含你硬盘上存放ROS功能包的路径。
什么是ROS
ROS是一个可以使我们进行本章内容介绍的一个框架。它用来管理所有的进程以及它们之间的通信