【ROS】发布者&订阅者

C++

发布者

roscd beginner_tutorials
mkdir -p src
cd src
touch talker.cpp
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

int main(int argc, char **argv)
{
    ros::init(argc, argv, "talker");    //  初始化ROS
    ros::NodeHandle n;  //  与ROS系统通信的主要接入点
    // 主节点将通知任何想订阅该主题名的人, 与该节点建立点对点连接, 队列大小1000
    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000);
    ros::Rate loop_rate(10);   //  10Hz发布
    int count = 0;  //  统计已发送消息数量
    //  当取消(ctrl+c)/有同名节点/ros::shutdown()在别处调用/NodeHandles崩溃时, 返回false
    while (ros::ok())   
    {
        std_msgs::String msg;   //  发送缓冲
        std::stringstream ss;
        ss << "hello world" << count;
        msg.data = ss.str();
        ROS_INFO("%s", msg.data.c_str());
        chatter_pub.publish(msg); // 广播消息到任意连接节点, 参数为消息, 必须是advertise处理过的
        ros::spinOnce();    //  此处无用,因为无回调(有订阅者则需要)
        loop_rate.sleep();  //  10Hz
        count++;
    }
    return 0;
}

订阅者

touch 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::init(argc, argv, "listener");
    ros::NodeHandle n;
    // 订阅chatter话题, 队列大小, 
    ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
    ros::spin(); // 循环, 当取消(ctrl+c)/有同名节点/ros::shutdown()在别处调用/NodeHandles崩溃时打断
    return 0;
}

编译

补充

cmake_minimum_required(VERSION 3.0.2)
project(beginner_tutorials)
find_package(catkin REQUIRED COMPONENTS
    roscpp
    rospy
    std_msgs
    message_generation
    genmsg
)
add_service_files(DIRECTORY srv
    FILES
    AddTwoInts.srv
)
add_message_files(DIRECTORY msg
    FILES
    Num.msg
)
generate_messages(
    DEPENDENCIES
    std_msgs
)
catkin_package(
    CATKIN_DEPENDS roscpp std_msgs message_runtime
)
include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)
catkin_make

编译好的文件在~/catkin_ws/devel/lib/beginner_tutorials

python

roscd beginner_tutorials
mkdir scripts
cd scripts

发布者

touch talker.py
#!/usr/bin/env python
#coding=utf-8
import rospy
from std_msgs.msg import String
def talker():
    pub = rospy.Publisher('chatter',String,queue_size=10) # 使用string类型发布到chatter话题, 队列大小10
    rospy.init_node('talker',anonymous=True) # 节点名字, 名字后加随机数确保有独特的节点名
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
        hello_str = "I have sent %s times" % rospy.get_time()
        rospy.loginfo(hello_str) # 写入log文件, ->rosout->_console
        pub.publish(hello_str)
        rate.sleep()
if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass

订阅者

#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I get %s", data.data)
def listener():
    rospy.init_node('listener', anonymous=True)
    rospy.Subscriber("chatter", String, callback)
    rospy.spin()
if __name__ == "__main__":
    listener()

补充CMakeList.txt

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

运行

roscore
cd ~/catkin_ws
source ./devel/setup.bash

rosrun beginner_tutorials talker
rosrun beginner_tutorials talker.py
rosrun beginner_tutorials listen
rosrun beginner_tutorials listen.py
#!/usr/bin/env python   python2执行环境
#coding=utf-8           有utf8中文注释时添加
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值