ROS通信模式编程

一、话题,服务模式编程

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}
在Ubuntu 18.04上进行ROS通信编程,需要先安装ROS Melodic版本。安装完成后,可以使用ROS提供的通信机制,如话题(Topic)和服务(Service)等。 话题是一种发布/订阅(Publish/Subscribe)模式通信机制,可以实现多个节点之间的异步通信。在ROS中,话题的数据类型是消息(Message),可以自定义消息类型。节点可以发布消息到话题,也可以订阅话题接收消息。 服务是一种请求/响应(Request/Response)模式通信机制,可以实现节点之间的同步通信。在ROS中,服务的数据类型也是消息,但是服务消息包含请求消息和响应消息两部分。节点可以提供服务,也可以请求服务。 下面是一个简单的ROS话题通信示例: 1. 创建一个ROS工作空间 ``` mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make ``` 2. 创建一个ROS包 ``` cd ~/catkin_ws/src catkin_create_pkg my_package rospy ``` 3. 在my_package中创建一个发布者节点 ``` cd ~/catkin_ws/src/my_package mkdir scripts cd scripts touch talker.py chmod +x talker.py ``` 将以下代码复制到talker.py文件中: ```python #!/usr/bin/env python import rospy from std_msgs.msg import String def talker(): pub = rospy.Publisher('chatter', String, queue_size=10) rospy.init_node('talker', anonymous=True) rate = rospy.Rate(10) # 10hz while not rospy.is_shutdown(): hello_str = "hello world %s" % rospy.get_time() rospy.loginfo(hello_str) pub.publish(hello_str) rate.sleep() if __name__ == '__main__': try: talker() except rospy.ROSInterruptException: pass ``` 4. 在my_package中创建一个订阅者节点 ``` cd ~/catkin_ws/src/my_package/scripts touch listener.py chmod +x listener.py ``` 将以下代码复制到listener.py文件中: ```python #!/usr/bin/env python import rospy from std_msgs.msg import String def callback(data): rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data) def listener(): rospy.init_node('listener', anonymous=True) rospy.Subscriber('chatter', String, callback) rospy.spin() if __name__ == '__main__': listener() ``` 5. 编译ROS包 ``` cd ~/catkin_ws/ catkin_make ``` 6. 运行ROS节点 在一个终端中运行发布者节点: ``` source ~/catkin_ws/devel/setup.bash rosrun my_package talker.py ``` 在另一个终端中运行订阅者节点: ``` source ~/catkin_ws/devel/setup.bash rosrun my_package listener.py ``` 你可以看到,发布者节点会不断地发布消息到话题“chatter”中,而订阅者节点会接收到这些消息并打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值