0%

rostopic

话题通信

发布方cpp实现

1
2
3
4
5
6
1、包含头文件
ROS中文本类型 ---》 std_msgs/String.h
2、初始化ROS节点
3、创建节点句柄
4、创建发布者对象
5、编写发布逻辑并发布数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "ros/ros.h"
#include "std_msgs/String.h"

int main(int argc , char *argv[])
{
//初试化ros节点
ros::init(argc,argv,"nodeName"); //节点名称
//创建节点句柄
ros::NodeHandle nh;
//创建发布者对象
ros::Publisher pub=nh.advertise<std_msgs::String>("topicName",10);
//范型:话题类型,话题名称,话题数据队列长度
//编写发布逻辑并发布数据
//先创建被发布的数据
std_msgs::String msg;
//循环发布数据
while(ros::ok()) //ros::ok() 节点不死
{
msg.data="hello";
pub.publish(msg);
}
return 0;
}

CMakeList

1
2
add_executable()
target_link_libraries()
1
rostopic echo topicName

以10HZ发布数据,数据后面有编号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc , char *argv[])
{
setlocale(LC_ALL,""); //解决中文乱码
//2、初试化ros节点
ros::init(argc,argv,"nodeName"); //节点名称
//3、创建节点句柄
ros::NodeHandle nh;
//4、创建发布者对象
ros::Publisher pub=nh.advertise<std_msgs::String>("topicName",10);
//范型:话题类型,话题名称,话题数据队列长度
//5、编写发布逻辑并发布数据
//要求以10HZ的频率发布数据,并且文本后添加编号
//先创建被发布的数据
std_msgs::String msg;
//发布频率
ros::Rate rate(10); //10HZ
//计数器
int count=0;
//循环发布数据
while(ros::ok()) //ros::ok() ros进程没死
{
count ++;
// 字符串拼接 sstream
std::stringstream ss;
ss << "hello --->" << count;
msg.data=ss.str();
//msg.data="hello";
pub.publish(msg);
//日志输出
ROS_INFO("发布的数据是%s",ss.str().c_str());
rate.sleep();
ros::spinOnce();//官方建议添加,处理回调函数
}
return 0;
}

订阅方cpp实现

1
2
3
4
5
6
1、包含头文件
ROS中文本类型 ---》 std_msgs/String.h
2、初始化ROS节点
3、创建节点句柄
4、创建订阅者对象
5、处理订阅到的数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "ros/ros.h"
#include "std_msgs/String.h"
void doMsg(const std_msgs::String::ConstPtr &msg) //常指针类型
{
//通过msg获取并操作订阅到的数据
ROS_INFO("订阅方订阅到的数据是:%s",msg->data.c_str());
}
int main(int argc , char *argv[])
{
setlocale(LC_ALL,""); //解决中文乱码
//初试化ros节点
ros::init(argc,argv,"nodeName"); //节点名称
//创建节点句柄
ros::NodeHandle nh;
//创建订阅者对象
ros::Subscriber pub=nh.subscribe("topicName",10,doMsg); //doMsg是回调函数用于处理收到的数据
ros::spin(); //回头,处理回调函数
return 0;
}

发布方python实现

1
2
3
4
1、导包
2、初始化ros节点
3、创建发布者对象
4、编写发布逻辑并发布数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#! /usr/bin/env python
import rospy
from std_msgs.msg import String

if __name__ == "__main__":
#2、初始化ros节点
rospy.init("nodeName")
#3、创建发布者对象
pub = rospy.Publisher("topicName",String,queue_size=10)
#4、编写发布逻辑并发布数据
#创建数据
msg=String()
#使用循环发布数据
while not rospy.is_shutdown():
msg.data ="hello"
pub.publish(msg)
pass

CMakeList

1
catkin_install_python()

以10HZ发布数据,数据后面有编号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#! /usr/bin/env python
import rospy
from std_msgs.msg import String

if __name__ == "__main__":
#2、初始化ros节点
rospy.init("nodeName")
#3、创建发布者对象
pub = rospy.Publisher("topicName",String,queue_size=10)
#4、编写发布逻辑并发布数据
#创建数据
msg=String()
#指定发布频率
rate=rospy.Rate(1)
#设置计数器
count=0
#使用循环发布数据
while not rospy.is_shutdown():
count +=1
msg.data ="hello" +str(count)
pub.publish(msg)
rospy.loginfo("发布的数据是%s",msg.data)
rate.sleep()
pass

发布方python实现

1
2
3
4
5
1、导包
2、初始化ros节点
3、创建订阅者对象
4、回调函数处理数据
5、spin()
1
2
3
4
5
6
7
8
9
10
11
12
13
# usr/bin/env python
#coding=utf-8
import rospy
from std_msgs.msg import String

def doMsg(msg):
rospy.loginfo("data is %s",msg.data)

if __name__ == "__main__":
rospy.init_node("nodeName")
sub=rospy.Subcriber("topicName",String,doMsg,queue_size=10)
rospy.spin()
pass