发现以前学习东西总是将所需要的知识从书上、网上等各种途径拿到手用到自己所需要的地方,偶尔将其记录在笔记上没有将其公开,这样的坏处是没有经过自己的一个整理,没有对这个知识点的沉淀以及得到广大网友的验证以及批评指正。
ROS机器人操作系统这几年开始变得流行,是一种用于机器人的开源次级操作系统,提供类似操作系统提供的功能,如硬件抽象,底层设备控制,常用功能实现,进程间消息以及数据包管理。但它更像是一个软件平台,在平台上方便做各种算法的设计开发。在老师和师兄的指导下开始了ROS的学习之路,开始对着《机器人操作系统(ROS)浅析》这本书将小乌龟跑了一遍。基本对节点、消息、话题、服务这些概念有所了解,以及对节点管理器、启动文件、编程方法等有所了解。
【几个概念】
1、功能包(package)
它是一组用于实现特定功能的相关文件的集合,包括可执行文件和其他支持文件,其类似于我们用VS之类的IDE所创建的工程。通过catkin_create_pkg package-name 所创建的包自动包含CMakeLists.txt和package.xml两个文件
2、节点管理器
启动节点管理器用如下命令
roscore
不带任何参数, 使用Ctrl+c终止节点管理器
3、节点
ros程序的运行实例。类似于运行的一个进程。
节点的启动使用命令
$ rosrun package-name executable-name
也可以在启动文件中一次启动多个节点
4、话题和消息
ros各个节点之间的通信机制采用消息传递的形式。一个节点通过发布一种话题的消息供其它节点订阅。节点之间相互不知道消息来自于谁以及被谁订阅。他们之间的关系是多对多
5、服务
相对于消息传递多对多的机制不适用于请求/回复的方式,ros提供一种一对一 的机制,即一个用于请求,一个用于回复
6、启动文件
用于一次启动多个节点,启动文件必须依赖于编译后的包,当运行一个启动文件时,它会自动运行roscore 打开节点管理器。
roslaunch 用于一次启动多个节点,但是文件×.launch必须依赖于功能包,即必须建立在包里面
使用以下指令打开
roslaunch package-name launch-file-name
×.launch文件文件结构
1
2
8
15
21
参数
12
13
【一个简单例子】
运行环境:Ubuntu 14.04 LTS + ros indigo
1、创建工作空间
$ mkdir workspace
2、在工作空间中创建包集目录src,这时候在workspace目录下使用命令
$catkin_make
将会出现devel和build两个文件夹,在相应文件夹下会自动生成一些编译后的相关文件。
3、进入src目录下,使用命令
$catkin_create_pkg package-name
在src目录下创建 package-name 包(包名自取)。
在本例中创建了一个包名为 beginner
4、使用roscd或者cd命令进入 package-name 包,在包下创建相应的cpp文件。在本例中,记录发布和订阅消息,因此创建了talker.cpp和lisener.cpp两个cpp文件,使用vim工具可以较为方便地编写程序,自动缩进、颜色等。
在talker.cpp中输入如下代码
#include
#include "std_msgs/String.h"
#include
#include
int main(int argc,char **argv)
{
ros::init(argc,argv,"talker"); //ros系统初始化,通过命令对名字进行重映射,节点名字在一个运行的系统中必须是唯一的
ros::NodeHandle nh;//创建一个句柄,并自动初始化
ros::Publisher pub = nh.advertise("chatter",1000); //将std_msgs::String类型的消息发布给话题chatter,参数1000是消息队列的长度
ros::Rate rate(10);//指定自循环的频率 1/10
int count = 0;
while(ros::ok()) //当按下Ctrl+c命令时,返回false
{
std_msgs::String msg;
std::stringstream ss;
ss<< "Hello ROS!"<
在listener.cpp文件中添加如下代码
#include
#include "std_msgs/String.h"
void chatcallback(const std_msgs::String::ConstPtr& msg)//回调函数
{
ROS_INFO("I heared :[%s]",msg->data.c_str());
}
int main(int argc,char **argv)
{
ros::init(argc,argv,"listener");
ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("chatter",1000,chatcallback);
ros::spin();
return 0;
}
在CMakeLists.txt中
将第7行
find_package(catkin REQUIRED)
更改为
find_package(catkin REQUIRED COMPONENTS roscpp std_msgs)
即将相应的依赖包添加进去
在最后一行添加如下代码。 用于声明可执行文件,文件名分别为talk和listen
add_executable(talk talker.cpp)
target_link_libraries(talk ${catkin_LIBRARIES})
add_executable(listen listener.cpp)
target_link_libraries(listen ${catkin_LIBRARIES})
在package.xml中
在代码
后添加编译依赖项和运行依赖项,即将所用到的功能包包含进来
6、退回到工作空间目录下使用命令 $catkin_make 编译项目。
7、注册环境变量
source devel/setup.bash
如未注册即运行节点将报错找不到相应的包文件
在每个终端中只需要运行一次,即使重新编译后也一样。
7、刚刚已经生成了两个节点,可以通过一个节点一个节点打开的方式打开也可以利用启动文件一次打开多个节点的方法
打开节点管理器
$ roscore
再打开一个终端或者标签页
rosrun beginner talk
rosrun beginner listen
8、使用启动文件一次启动多个节点
编写启动文件beginner.launch,在该文件中添加如下代码
运行结果(未制定不同窗口):
至此,完成了基本的发布和订阅消息的编程。
参考文献:
《开源机器人操作系统》
《机器人操作系统(ros)浅析》
《ROS入门实例》
/×××××××××××××××××××××××××××××××××××××××××××××××××××××
欢迎批评指正,此为初衷
转载注明出处。
感谢关注