-
【1】在使用ROS发布或者订阅消息之前,必须要使用命令
roscore
将这个ROS内核启动才行; - 【2】当编写好相关文件之后,一定要返回到ROS工程目录下,进行编译,具体操作是:
$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash
-
【3】当使用roscd 语句提示:无法找到相应的ros包的时候,采用
echo "export ROS_PACKAGE_PATH"=~/ <文件名> /:"$ROS_PACKAGE_PATH " >> ~/.bashrc
问题就可以得到解决 -
【4】一般而言,一个ROS工作空间包括:
-(1)src 文件夹: 一般包括ROS包(launch文件+msg文件+src文件+srv文件+头文件)+CMakeLists.txt文件+package.xml文件
-(2)build 文件夹:用来存放编译过程的文件
-(3)devel 文件夹:用来存放目标文件(如setup.bash)
ROS文件空间的基本组成
ROS包的基本组成
- 【5】node是ROS操作系统中的最小单位,当我们需要打开多个node节点的时候会,我们必须采用master来进行管理。
roscore //表示启动ros的master节点
- 【6】rosrun语句的基本命令格式为:
$ rosrun pkg_name node_name //表示的是运行某个包中的节点
-
【7】下图详细展示了如何查看rosnode的相关信息:
- 【8】launch文件:通常我们需要开启很多个节点(Node)才能实现机器人某个功能(如摄像头采集信息,处理信息,对这些信息做出相应判断等),这时我们就直接使用roslaunch命令来实现这个过程:
$ roslaunch pkg_name file_name.launch
该文件的编写规则遵循:xml文件的编写格式。
【9】在ROS系统中,通信方式是其核心概念,主要包括四种方式:topic主题,service服务,parameter service参数服务器,actionlib动作库
(1)详细介绍topic类型的通信方式:是一种单向、异步,实时的、多对多的通信方式,一般有一个publisher和多个subscriber。
(2)常见的topic操作指令包括:
(3)详细介绍Message的通信结构:
类似于结构体类型的变量
基本的操作命令包括:
【10】Service的通信模式:
是一种双向的通信模式,而且是同步进行的。当Node A 发布请求之后,会在与原地等待reply,直到Node B处理完 请求并且完成了reply之后,Node A 才会继续执行相关操作。
其基本的操作指令包括:
注意,由于service具有反馈的过程,因此在进行文件(srv)定义的时候,需要区别对待,一般的格式为:
其基本的指令包括:
最后,当我们完成了msg或者srv等相关信息的模式定义之后,我们都需要对CMakelist.txt的编译文件和package.xml文件进行修改,使得其依赖或者包文件能够编译通过,生成对应的头文件。
【11】整个ROS包文件的分层结构图如下所示:
【12】roscpp文件位于ros包文件目录下的src文件夹中,一般包括以下几个部分:
【13】topic在roscpp中的应用:基本的步骤如下:
-(1)创建一个msg,并且要规定msg的内容;
-(2)注意在程序编译的时候需要“message_generation”,在程序运行的时候,需要“message_runtime”,因此我们需要打开package.xml,在文件中加入:
然后我们再打开CMakelists.txt然后再加入:
如果想要直接返回ros的基本工作空间,可以直接使用如下语句:
$ cd ../..
-(3)创建一个publisher文件:(注意是在src文件夹下)
#include “ros/ros.h” //必须引入这个头文件
#include "std_msgs/String.h" //采用标准的信息库包
#include <sstream> //标准的信息输出流
int main(int argc, char **argv)
{
ros::init(argc,argv,"talker"); //初始化,并且创建一个节点名字
ros::Nodehandle n; //创建一个句柄
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000); //创建一个publisher,并且往chatter这个topic上发送消息
ros::Rate loop_rate(10); //定义发布的频率
int count = 0;
while(ros::ok()) //如果ros还没有关闭
{
std_msgs::String msg;
std::stringstream ss;
ss<<"hello world"<<count; //把count数值和hello world分别给ss
msg.data=ss.str();
ROS_INFO("%s",msg.data.c_str()); //在窗口上打印出来
chatter_pub.publisher(msg); //发布这个消息
ros::spinOnce(); //如果需要回调函数,则必须使用这个spinOnce()函数
loop_rate.sleep(); //表示10Hz频率发布,而不是一直发布
++count;
}
return 0;
}
-(4)创建一个subscriber函数:(注意是是在src文件夹下)
#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc,argv,"listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter",1000,chatterCallback) ;
ros::spin(); //表示进入循环,一直在chatter的topic上订阅消息
return 0;
}
-(5)修改编译文件:CMakeLists.txt
最后要编译整个工作空间:
# In your catkin workspace
$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash //更新