在模型实现中ROS Master不需要实现,而连接建立也已经被封装了,需要关注的关键点有三个:
- 发布方
- 接收方
- 数据(此处为普通文本)
流程:
- 编写发布方实现
- 编写订阅方实现
- 编写配置文件
- 编译并执行
1、发布方
/*
需求: 实现基本的话题通信,一方发布数据,一方接收数据,
实现的关键点:
1.发送方
2.接收方
3.数据(此处为普通文本)
PS: 二者需要设置相同的话题
消息发布方:
循环发布信息:HelloWorld 后缀数字编号
实现流程:
1、包含头文件
2、初始化ROS节点:命名唯一
3、实例化ROS句柄
4、实例化发布者对象
5、组织被发布的数据,并编写逻辑发布数据
//1、包含头文件按
#include "ros.ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc,char *argv[])
{
//设置编码
setlocale(LC_ALL,"");
//初始化ROS节点
ros::init(argc,argv,"ergouzi");
//实例化ROS句柄
ros::NodeHandle nh;
//实例化发布者对象
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);
//组织被发布的数据,并编写逻辑发布数据
std_msgs:String msg;
std_msgs msg_front = "Hello 你好!";
int count =0;
ros::Rate r(1);
while(ros::ok())
{
std::stringstream ss;
ss<<mag_front<<count;
msg.data=ss.str();
pub.publish(msg);
ROS_INFO("发送的消息是:%s",msg.data.c_str());
r.sleep();
count++;
ros::spinOnce();
}
}
2、订阅方
/*
需求: 实现基本的话题通信,一方发布数据,一方接收数据,
实现的关键点:
1.发送方
2.接收方
3.数据(此处为普通文本)
消息订阅方:
订阅话题并打印接收到的消息
实现流程:
1.包含头文件
2.初始化 ROS 节点:命名(唯一)
3.实例化 ROS 句柄
4.实例化 订阅者 对象
5.处理订阅的消息(回调函数)
6.设置循环调用回调函数
*/
// 1.包含头文件
#include "ros/ros.h"
#include "std_msgs/String.h"
void doMsg(const std_msgs::String::ConstPtr& msg_p){
ROS_INFO("我听见:%s",msg_p->data.c_str());
// ROS_INFO("我听见:%s",(*msg_p).data.c_str());
}
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//2.初始化 ROS 节点:命名(唯一)
ros::init(argc,argv,"listener");
//3.实例化 ROS 句柄
ros::NodeHandle nh;
//4.实例化 订阅者 对象
ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);
//5.处理订阅的消息(回调函数)
// 6.设置循环调用回调函数
ros::spin();//循环读取接收的数据,并调用回调函数处理
return 0;
}
3、配置文件CMakeLists.txt
add_executable(Hello_pub
src/Hello_pub.cpp
)
add_executable(Hello_sub
src/Hello_sub.cpp
)target_link_libraries(Hello_pub
${catkin_LIBRARIES}
)
target_link_libraries(Hello_sub
${catkin_LIBRARIES}
)
4、执行
1、启动roscore
2、启动发布节点
3、启动订阅节点
下面介绍下Python的实现过程
流程:
1、编写发布方实现
2、编写订阅方实现
3、为python文件添加可执行权限
4、编辑配置文件
5、编译并执行
1、发布方
#! /usr/bin/env python
#PS:二者之间的话题要一致
“”“
实现流程:
1、导包
2、初始化ROS节点:命名唯一
3、实例化发布者对象
4、组织被发布的数据,并编写逻辑发布数据
”“”
import rospy
from std_msgs.msg import String
if __name__ == "__main__":
rospy.init_node("talker_p")
pub = rospy.Publisher("chatter",String,queue_size=10)
msg = String()
msg_front="hello 你好"
count = 0 #计数器 # 设置循环频率 rate = rospy.Rate(1) while not rospy.is_shutdown(): #拼接字符串 msg.data = msg_front + str(count) pub.publish(msg) rate.sleep() rospy.loginfo("写出的数据:%s",msg.data) count += 1
2、订阅方
#! /usr/bin/env python
"""
需求: 实现基本的话题通信,一方发布数据,一方接收数据,
实现的关键点:
1.发送方
2.接收方
3.数据(此处为普通文本)
消息订阅方:
订阅话题并打印接收到的消息实现流程:
1.导包
2.初始化 ROS 节点:命名(唯一)
3.实例化 订阅者 对象
4.处理订阅的消息(回调函数)
5.设置循环调用回调函数"""
#1.导包
import rospy
from std_msgs.msg import Stringdef doMsg(msg):
rospy.loginfo("I heard:%s",msg.data)if __name__ == "__main__":
#2.初始化 ROS 节点:命名(唯一)
rospy.init_node("listener_p")
#3.实例化 订阅者 对象
sub = rospy.Subscriber("chatter",String,doMsg,queue_size=10)
#4.处理订阅的消息(回调函数)
#5.设置循环调用回调函数
rospy.spin()
3、添加可执行权限
终端下进入scripts执行:chmod +x *.py
4、配置CMakeList.txt
catkin_install_python(PROGRAMS
scripts/talker_p.py
scripts/listener_p.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
5、执行
1.启动 roscore;
2.启动发布节点;
3.启动订阅节点。
PS:可以使用 rqt_graph 查看节点关系。
评论(0)
您还未登录,请登录后发表或查看评论