创建package功能包
$roscore(任何程序都要先运行的一步)
$mkdir -p ~/catkin_ws/src(创建一个名叫catkin_ws的工作空间)
$cd ~/catkin_ws/src(转到catkin_ws/src目录下)
$catkin_init_workspace
$cd ~/catkin_ws (转到catkin_ws目录下)
$catkin_make(建成工作空间)
$source devel/setup.bash(source一下)
$cd src(转到catkin_ws/src目录下)
$roscreate_pkg beginner_tutorials dependsstd_msgs rospy roscpp(创建一个名叫beginner_tutorials的功能包,且依靠std_msgs,rospy,roscpp)
Ros节点
我们将使用到一个轻量级的模拟器,请使用以下命令来安装:
$ sudo apt-getinstall ros-
下面通过一些操作来理解ros节点
$ roscore(roscore 是你在运行所有ROS程序前首先要运行的命令。)
$ rosnode list(rosnode 显示当前运行的ROS节点信息。rosnode list 指令列出活跃的节点
/rosout(此时的输出,这表示当前只有一个节点在运行: rosout。因为这个节点用于收集和记录节点调试输出信息,所以它总是在运行的。)
使用rosrun
$ rosrun [package_name] [node_name](用法)
下面打开一个新的标签页
$ rosrun turtlesim turtlesim_node
运行后会出现一个小乌龟窗口,名字叫TurtleSim
再打开一个新的标签页
$ rosnode list
输出:
/rosout
/turtlesim
至此,此节内容就结束了。可以关闭所有终端窗口了。
Ros话题
$ roscore(首先确保运行roscore)
打开一个新的标签页
$ rosrun turtlesim turtlesim_node(确保在上节下载配置了那个轻量级的模拟器,此时那个小乌龟窗口又会出现)
再在上个标签页的基础上打开一个新的标签页
$ rosrun turtlesim turtle_teleop_key(此时你可以用键盘上的方向键来控制小乌龟的运动)
在上一个标签页的基础上打开一个新的标签页
$ rosservice call clear(清楚小乌龟运动过的痕迹)
还可以再生一个小乌龟
$ rosservice type spawn| rossrv show
输出位
float32 x
float32 y
float32 theta
string name
---
string name
下面让我们在给定的位置生成一个新的小乌龟
$ rosservice call spawn 2 2 0.2 ""(2 2 0.2为我们给新的小乌龟的位置)
此时在原来基础上再生成一只小乌龟。
$ rosparam list
输出为
/background_b
/background_g
/background_r
/roslaunch/uris/aqy:51932
/run_id
(blue,green,red,三原色)
rosparam set [param_name]
rosparam get [param_name]
(用法)
现在让我们来改变小乌龟窗口背景颜色的红色通道
$ rosparam set background_r 150(150为程度值,自己更改)
上述指令修改了参数的值,现在我们调用清除服务使得修改后的参数生效
$ rosservice call clear
现在可以看到背景颜色改变了。
现在我们来查看参数服务器上的参数值——获取背景的绿色通道的值
$ rosparam get background_g
输出为
86
我们可以使用rosparam get /来显示参数服务器上的所有内容:
$ rosparam get /
输出为
background_b: 255
background_g: 86
background_r: 150
roslaunch:
uris: {'aqy:51932': 'http://aqy:51932/'}
run_id: e07ea71e-98df-11de-8875-001b21201aa8
Ros服务和参数
本教程假设从前一教程启动的turtlesim_node仍在运行,现在我们来看看turtlesim提供了什么服务。
1 ros services
服务(services)是节点之间通讯的另一种方式。服务允许节点发送请求(request) 并获得一个响应(response)
rosservice提供了很多可以在topic上使用的命令,如下所示:
使用方法:
rosservicelist 输出可用服务的信息
rosservicecall 调用带参数的服务
rosservicetype 输出服务类型
rosservicefind 依据类型寻找服务find services by service type
rosservice uri 输出服务的ROSRPC uri
例如
$ rosservice list
输出为
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/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
list 命令显示turtlesim节点提供了9个服务:重置(reset), 清除(clear), 再生(spawn), 终止(kill),turtle1/set_pen, /turtle1/teleport_absolute, /turtle1/teleport_relative, turtlesim/get_loggers, andturtlesim/set_logger_level.同时还有另外两个rosout节点提供的服务: /rosout/get_loggers and/rosout/set_logger_level.
2 rosservice type
使用方法:
rosservice type[service]
我们来看看clear服务的类型:
$ rosservice typeclear
输出为
std_srvs/Empty
服务的类型为空(empty),这表明在调用这个服务是不需要参数(比如,请求不需要发送数据,响应也没有数据)。下面我们使用rosservice call命令调用服务:
3rosservice call
使用方法:
rosservice call[service] [args]
例如
$ rosservice callclear
该服务清除了turtlesim_node的背景上的轨迹。上节已经使用过。
通过查看再生(spawn)服务的信息,我们来了解带参数的服务:
$ rosservice typespawn| rossrv show
输出为
float32 x
float32 y
float32 theta
string name
---
string name
这个服务使得我们可以在给定的位置和角度生成一只新的乌龟。名字参数是可选的,这里我们不设具体的名字,让turtlesim自动创建一个。
$ rosservice callspawn 2 2 0.2 ""(2 2 0.2为我们给新的小乌龟的位置,可以更改)
服务返回了新产生的乌龟的名字:
name: turtle2
此时在原来基础上再生成一只小乌龟。
3 Usingrosparam
使用方法:
rosparam set 设置参数
rosparam get 获取参数
rosparam load 从文件读取参数
rosparam dump 向文件中写入参数
rosparamdelete 删除参数
rosparam list 列出参数名
4rosparam list
$ rosparam list
我们可以看到turtlesim节点在参数服务器上有3个参数用于设定背景颜色:
/background_b
/background_g
/background_r
/roslaunch/uris/aqy:51932
/run_id
用法
rosparam set[param_name]
rosparam get [param_name]
现在我们修改背景颜色的红色通道:
$ rosparam setbackground_r 150(150为程度值,自己更改)
现在我们调用清除服务使得修改后的参数生效:
$ rosservice callclear
现在可以看到背景颜色已经改变,上节已经演示过。
现在我们来查看参数服务器上的参数值——获取背景的绿色通道的值:
$ rosparam getbackground_g
输出为
86
我们可以使用rosparam get /来显示参数服务器上的所有内容:
$ rosparam get /
输出为
background_b: 255
background_g: 86
background_r: 150
roslaunch:
uris: {'aqy:51932': 'http://aqy:51932/'}
run_id: e07ea71e-98df-11de-8875-001b21201aa8
使用rqt_console和roslaunch
详见官网教程(过于繁琐,不好直接解释,官网很详细)。
使用rosed编辑Ros中的文件
使用方法:
$ rosed[package_name] [filename]
例如
$ rosed roscpp Logger.msg
这个实例展示了如何编辑roscpp package里的Logger.msg文件。
如果该实例没有运行成功,那么很有可能是你没有安装vim编辑器。请参考编辑器部分进行设置。
如果文件名在package里不是唯一的,那么会呈现出一个列表,让你选择编辑哪一个文件
创建Ros消息和Ros服务
见官网教程(官网教程很详细)。
编写简单的消息发布器和订阅器(c++)
1 编写发布器节点
切换到之前创建的 beginner_tutorials package路径下:
cd~/catkin_ws/src/beginner_tutorials
在 beginner_tutorials package路径下创建一个src文件夹:
mkdir -p~/catkin_ws/src/beginner_tutorials/src
这个文件夹将会用来放置 beginner_tutorials package的所有源代码。
在 beginner_tutorials package里创建 src/talker.cpp文件
创建方法具体如下:
$ cd~/catkin_ws/src/beginner_tutorials/src
$gedit ~/catkin_ws/src/beginner_tutorialss/src/talker.cpp
后面的复制粘贴文件见官网教程,编译节点时要求添加的命令一定要添加,最后保存。
最后在终端记得运行 $ catkin_make
测试消息发布器和订阅器
确保在上一节已经在 beginner_tutorials package里创建 src/talker.cpp文件和src/listener.cpp文件。
运行
$ roscore
在roscore标签页基础上打开一个新的标签页。
如果使用catkin,确保你在调用catkin_make后,在运行你自己的程序前,已经source了catkin工作空间下的setup.sh文件:
# In your catkinworkspace
$ cd ~/catkin_ws
$ catkin_make
$ source./devel/setup.bash
接着运行
$ rosrunbeginner_tutorials talker (C++)
$ rosrunbeginner_tutorials talker.py (Python)
你将看到如下的输出信息:
· [INFO] [WallTime: 1314931831.774057] hello world 1314931831.77
· [INFO] [WallTime: 1314931832.775497] hello world 1314931832.77
· [INFO] [WallTime: 1314931833.778937] hello world 1314931833.78
· [INFO] [WallTime: 1314931834.782059] hello world 1314931834.78
· [INFO] [WallTime: 1314931835.784853] hello world 1314931835.78
· [INFO] [WallTime: 1314931836.788106] hello world 1314931836.79
发布器节点已经启动运行。现在需要一个订阅器节点来接受发布的消息。
上一节,我们编写了一个名为"listener"的订阅器节点。现在运行它:
打开一个新的标签页
$ cd~/catkin_ws
$catkin_make
$source ./devel/setup.bash
$ rosrun beginner_tutorials listener (C++)
$ rosrun beginner_tutorials listener.py (Python)
你将会看到如下的输出信息:
· [INFO] [WallTime: 1314931969.258941] /listener_17657_1314931968795I heard hello world 1314931969.26
· [INFO] [WallTime: 1314931970.262246] /listener_17657_1314931968795I heard hello world 1314931970.26
· [INFO] [WallTime: 1314931971.266348] /listener_17657_1314931968795I heard hello world 1314931971.26
· [INFO] [WallTime: 1314931972.270429] /listener_17657_1314931968795I heard hello world 1314931972.27
· [INFO] [WallTime: 1314931973.274382] /listener_17657_1314931968795I heard hello world 1314931973.27
· [INFO] [WallTime: 1314931974.277694] /listener_17657_1314931968795I heard hello world 1314931974.28
· [INFO] [WallTime: 1314931975.283708] /listener_17657_1314931968795I heard hello world 1314931975.28
此节就结束了。