ROS学习(一)——话题通信的C++与Python实现

ROS学习(一)——话题通信的C++与Python实现

引言:本文分为三个部分,分别为话题通信的理论模型以及其C++与Python的实现代码。

一、理论模型

在我们的实际使用中,需要注意的几个东西就是以下几个概念:(1)话题。(2)订阅。(3)发布。他们其中的关系我们可以用一个例子来表述:假设我们现在正在相亲,我们和女方聊天,现在我们提出了一个问题:“结婚以后房子写谁的名字?”,那么我们这时候的话题就是“房子”,我们就是发布方,而接话的女方就是订阅方。
ROS学习(一)——话题通信的C++与Python实现_第1张图片

二、C++实现

1、发布实现:

C++的发布代码分为以下几步:

(1)引入ros/ros.h、std_msgs/String.h头文件

(2)初始化节点:

ros::init(argc,argv,“节点名称”);

(3)创建发布方:我们发布的是String类型的数据,所以模板中是std_msgs::String

ros::NodeHandle nh;		//创建句柄
ros::Publisher pub = nh.advertise("topic_name",10);	//创建发布对象
std_msgs::String msg;		//创建要发布的信息

(4)编写发布逻辑:

ros::Rate rate(1);//1HZ
while(ros::ok())
{
	msg.data = "hello,world";
	pub.publish(msg);
    rate.sleep;
    ros::spinOnce();
}

(5)配置CMakeLists.txt

add_executable(demopub src/demopub.cpp)
target_link_libraries(demopub
  ${catkin_LIBRARIES}
)

(6)编译

catkin_make

(7)结果演示

ROS学习(一)——话题通信的C++与Python实现_第2张图片

2、订阅实现:

C++的订阅代码分为以下几步:

(1)引入ros/ros.h、std_msgs/String.h头文件

(2)初始化节点:

ros::init(argc,argv,“节点名称”);

(3)创建订阅方:其中callback为接受到数据之后的回调函数

ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("topic_name",10,callback);
ros::spin();		//!!!非常重要,如果不加,会导致只能接收到一次数据

(4)回调函数:次函数在主函数前编写

void callback(const std_msgs::String::ConstPtr &msg)
{
     ROS_INFO("消息是:%s",msg->data.c_str());			//将接收到的数据打印
}

(5)配置CMakeLists.txt

add_executable(demosub src/demosub.cpp)
target_link_libraries(demosub
  ${catkin_LIBRARIES}
)

(6)编译

catkin_make	

(7)结果演示:

ROS学习(一)——话题通信的C++与Python实现_第3张图片

三、Python实现:

python实现步骤相较于C++流程基本一致:

1.发布实现

#! /usr/bin/env python
#导包
import rospy					
from std_msgs.msg import String

if __name__ == "__main__":
    rospy.init_node("pub_name")			#初始化节点
    pub = rospy.Publisher("topic_name",String,queue_size=10)	#创建发布方
    msg = String()				#创建需要发送的信息类
    rate = rospy.Rate(1)
    while not rospy.is_shutdown():  //若接收到信息rospy.is_shutdown()返回0
        msg.data = "hello" 
        pub.publish(msg)
        rate.sleep()

配置CMakeLists.txt:

catkin_install_python(PROGRAMS
  scripts/demopub.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

2.订阅实现

#! /usr/bin/env python  

import rospy
from std_msgs.msg import String


def callback(msg):
    rospy.loginfo("订阅的数据为:%s",msg.data)

if __name__ == "__main__":
    rospy.init_node("sub_name")
    sub = rospy.Subscriber("topic_name",String,callback,queue_size=10)
    rospy.spin()

配置CMakeLists.txt:

catkin_install_python(PROGRAMS
  scripts/demosub.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

你可能感兴趣的:(ROS学习,c++,python)