Advertisement

ROS创建Publisher和 Subscriber 实现通信

阅读量:

创建 Publisher和 Subscriber 实现通信

  1. 创建工作空间
复制代码
    mkdir src
    cd ..
    caktkin_init_workspace
  1. 添加环境变量
复制代码
    source devel/setup.bash

查看ros 环境变量

复制代码
    echo $ROS_PACKAGE_PATH
  1. 创建功能包
复制代码
    catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
    catkin_create_pkg learning_communication std_msgs rospy roscpp
  1. 创建发布/订阅节点
复制代码
    // 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;
    }
  1. 修改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})
  1. 编译功能包
    在工作空间根目录下
复制代码
    catkin_make
  1. 运行Publisher和Subscriber
复制代码
    roscore
    rosrun <package_name> talk
    rourun <package_name> listener

全部评论 (0)

还没有任何评论哟~