ROS创建Publisher和 Subscriber 实现通信
发布时间
阅读量:
阅读量
创建 Publisher和 Subscriber 实现通信
- 创建工作空间
mkdir src
cd ..
caktkin_init_workspace
- 添加环境变量
source devel/setup.bash
查看ros 环境变量
echo $ROS_PACKAGE_PATH
- 创建功能包
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
catkin_create_pkg learning_communication std_msgs rospy roscpp
- 创建发布/订阅节点
// filename: 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
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
// 循环等待回调函数
ros::spin();
return 0;
}
// filename: talker.cpp
# include "ros/ros.h"
# include "std_msgs/String.h"
# include <sstream>
// int main(int argc, char **argv)
int main(int argc, char **argv)
{
// ROS 节点初始化
ros::init(argc, argv, "talker");
// 创建节点句柄
ros::NodeHandle n;
//创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
// 设置循环的频率
ros::Rate loop_rata(10);
int count = 0;
while (ros::ok())
{
// 初始化std_msgs::String类型的消息
std_msgs::String msg;
std::stringstream ss;
ss << "Hello Robot" << count;
msg.data = ss.str();
// msg.data = "hello ros";
// 发布消息
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
// 循环等待回调函数
ros::spinOnce();
// 按照循环频率延时
loop_rata.sleep();
++count;
}
return 0;
}
- 修改CmakeLists.txt 和 package.xml
# 设置头文件的相对路径
include_directories(include ${catkin_INCLUDE_DIRS})
# 设置需要编译的代码和生成的可执行文件
add_executable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)
# 设置链接库
target_link_libraries(talker ${catkin_LIBRARIES})
target_link_libraries(listener ${catkin_LIBRARIES})
- 编译功能包
在工作空间根目录下
catkin_make
- 运行Publisher和Subscriber
roscore
rosrun <package_name> talk
rourun <package_name> listener
全部评论 (0)
还没有任何评论哟~
