文章目录
一、话题,服务模式编程
1.创建工作空间
工作空间是用来存放开发文件的文件夹,主要有:
代码空间:src (source space)
编译空间:build (build space)
开发空间:devel (development space)
安装空间:instal (install space)
1.创建工作空间的代码如下:
mkdir -p ~/catkin_ws/src #创建文件夹
cd ~/catkin_ws/src #进入该文件夹
catkin_init_workspace #初始化空间
2.编译
cd .. #进入上级文件夹
catkin_make #编译
此时文件夹内有如下图三个文件:
3.设置环境变量
source devel/setup.bash #配置环境变量
echo $ROS_PACKAGE_PATH #检查环境变量,会输出其路径
4.创建功能包
cd ~/catkin_ws/src
catkin_create_pkg learning_communication std_msgs rospy roscpp
#std_msgs:定义的标准的数据结构
#rospy:python编程接口
#roscpp:提供c++编程接口
#需要注意同一个工作空间不能存在同名的功能包。
5.编译功能包
cd .. #转到上级目录
catkin_make
2.话题编程
步骤主要包括以下几步:
(1)创建发布者
- 初始化ROS节点
- 向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型
- 按照一定频率循环发布消息
先把当前路径改为~/catkin_ws/src/learning_communication/src,然后我们要在该文件夹内放置代码,在该目录下创建talker.cpp文件,并输入以下代码:
#include<sstream>
#include"ros/ros.h" #头文件,它引用了ROS系统中大部分常用的头文件
#include"std_msgs/String.h" #这引用了 std_msgs/String 消息, 它存放在 std_msgs package 里,是由 String.msg 文件自动生成的头文件。
int main(int argc,char **argv)
{
//ROS节点初始化
ros::init(argc,argv,"talker");
//创建节点句柄
ros::NodeHandle n;
//告知master将在chatter(话题名)上发布std——msg/String类型的消息,第二个参数是发布序列的大小,如果发布消息频率太高,当缓冲区消息大于1000个时会开始丢弃先前发布的消息。
ros::Publisher chatter_pub=n.advertise<std_msgs::String>("chatter",1000);
//设置循环的频率
ros::Rate loop_rate(10);
//roscpp会默认生成一个SIGINT句柄,负责处理Ctrl-C键盘操作,使ros::ok()返回false
int count=0;
while(ros::ok())
{
//初始化std_msgs::String类型的消息,这里使用标准的String消息,只有一个数据成员data
std_msgs::String msg;
std::stringstream ss;
ss<<"hello world"<<count;
msg.data=ss.str();
//发布消息
ROS_INFO("%s",msg.data.c_str());
chatter_pub.publish(msg);
//循环等待回调函数,不一定会用到,但如果有程序包含其他回调函数就需要,因此可以加上
ros::spinOnce();
//接受循环频率延时,发布频率为10Hz
loop_rate.sleep();
++count;
}
return 0;
}
(2)创建订阅者
- 初始化ROS节点
- 订阅需要的话题
- 循环等待话题消息,接受到消息后进行回调函数
- 回调函数中完成消息处理
同样在该目录下创建listener.cpp文件,并添加如下代码:
#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节点
ros::init(argc,argv,"listener");
//创建节点句柄
ros::NodeHandle n;
//创建一个Subscriber,订阅名为chatter的话题,当有消息发布到这个话题,就会调用回调函数chatterCallback,1000同样是设置的队列大小
ros::Subscriber sub=n.subscribe("chatter",1000,chatterCallback);
//进入自循环,当ros::ok()返回false,就会立刻跳出自循环
ros::spin();
return 0;
}
(3)添加编译选项
- 设置需要编译的代码和生成的可执行文件
- 设置链接库
- 设置依赖
之前用catkin_create_pkg创建了package.xml和CmakeList.txt文件,我们打开Cmakelist.txt文件,在末尾加入几条语句:
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${
catkin_LIBRARIES}