首页 > 其他分享 >怎么用ROS节点建立通信

怎么用ROS节点建立通信

时间:2024-09-23 10:21:45浏览次数:8  
标签:node ROS 创建 通信 rospy ros 节点

目录

1. 安装并初始化ROS

2. 创建ROS工作空间

3. 创建节点

3.1. C++实现

创建发布者节点(Publisher)

创建订阅者节点(Subscriber)

编译代码

运行节点

3.2. Python实现

创建发布者节点(Publisher)

创建订阅者节点(Subscriber)

运行Python节点

4. 检查节点与话题


在ROS(Robot Operating System)中,节点(Node)是执行计算的基本单元,不同的节点可以通过发布(publish)和订阅(subscribe)消息来进行通信。建立节点间的通信通常包含以下几个步骤:

1. 安装并初始化ROS

确保已经安装了ROS,并且ROS已经正确初始化。

source /opt/ros/noetic/setup.bash  # 根据你安装的ROS版本调整路径

2. 创建ROS工作空间

如果没有工作空间,可以新建一个并进行初始化:

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
source devel/setup.bash

3. 创建节点

ROS的节点通常是一个独立的程序,可以用C++或Python编写。下面分别介绍如何用两种语言创建发布者(Publisher)和订阅者(Subscriber)节点。

3.1. C++实现

创建发布者节点(Publisher)

首先,进入src目录并创建一个ROS包:

cd ~/catkin_ws/src
catkin_create_pkg my_ros_pkg roscpp std_msgs

进入包目录并编辑src/publisher_node.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"

int main(int argc, char **argv) {
    ros::init(argc, argv, "publisher_node");  // 初始化节点
    ros::NodeHandle nh;  // 节点句柄

    // 创建发布者,发布到名为"chatter"的话题,消息类型为std_msgs::String
    ros::Publisher pub = nh.advertise<std_msgs::String>("chatter", 1000);
    ros::Rate loop_rate(10);  // 设置发布频率为10Hz

    while (ros::ok()) {
        std_msgs::String msg;
        msg.data = "Hello ROS!";
        
        ROS_INFO("%s", msg.data.c_str());  // 输出消息
        pub.publish(msg);  // 发布消息

        ros::spinOnce();  // 处理回调函数
        loop_rate.sleep();  // 睡眠以维持发布频率
    }

    return 0;
}

创建订阅者节点(Subscriber)

同样在src目录中创建subscriber_node.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, "subscriber_node");
    ros::NodeHandle nh;

    // 订阅"chatter"话题
    ros::Subscriber sub = nh.subscribe("chatter", 1000, chatterCallback);
    
    ros::spin();  // 保持节点运行
    return 0;
}

编译代码

编辑CMakeLists.txt,添加如下内容以编译这两个节点:

add_executable(publisher_node src/publisher_node.cpp)
target_link_libraries(publisher_node ${catkin_LIBRARIES})

add_executable(subscriber_node src/subscriber_node.cpp)
target_link_libraries(subscriber_node ${catkin_LIBRARIES})

编译代码:

cd ~/catkin_ws
catkin_make
source devel/setup.bash

运行节点

首先启动ROS Master:

roscore

在不同的终端中启动发布者和订阅者:

rosrun my_ros_pkg publisher_node
rosrun my_ros_pkg subscriber_node

你应该能看到发布者发布消息,订阅者接收到并打印出来。

3.2. Python实现

创建发布者节点(Publisher)

src目录中创建publisher_node.py

#!/usr/bin/env python
import rospy
from std_msgs.msg import String

def publisher():
    rospy.init_node('publisher_node', anonymous=True)  # 初始化节点
    pub = rospy.Publisher('chatter', String, queue_size=10)  # 创建发布者
    rate = rospy.Rate(10)  # 设置发布频率为10Hz

    while not rospy.is_shutdown():
        msg = "Hello ROS!"
        rospy.loginfo(msg)
        pub.publish(msg)
        rate.sleep()

if __name__ == '__main__':
    try:
        publisher()
    except rospy.ROSInterruptException:
        pass

创建订阅者节点(Subscriber)

src目录中创建subscriber_node.py

#!/usr/bin/env python
import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo("I heard %s", data.data)

def subscriber():
    rospy.init_node('subscriber_node', anonymous=True)  # 初始化节点
    rospy.Subscriber('chatter', String, callback)  # 订阅消息
    rospy.spin()  # 保持节点运行

if __name__ == '__main__':
    subscriber()

运行Python节点

确保文件有执行权限:

chmod +x src/publisher_node.py
chmod +x src/subscriber_node.py

4. 检查节点与话题

可以使用ROS自带的工具来检查节点与话题的状态:

  • 查看运行的节点:
rosnode list
  • 查看话题:
rostopic list
  • 打印话题信息:
rostopic echo /chatter

标签:node,ROS,创建,通信,rospy,ros,节点
From: https://blog.csdn.net/weixin_47151388/article/details/142451655

相关文章

  • DeepCross模型实现推荐算法
    1.项目简介A032-DeepCross项目是一个基于深度学习的推荐算法实现,旨在解决个性化推荐问题。随着互联网平台上信息和内容的爆炸式增长,用户面临着信息过载的困境,如何为用户提供高效、精准的推荐成为了关键。该项目背景基于现代推荐系统的发展,利用用户行为数据和内容特征,来生......
  • 数据结构之线性表——LeetCode:328. 奇偶链表,86. 分隔链表,24. 两两交换链表中的节点
    328.奇偶链表题目描述328.奇偶链表给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。请注意,偶数组和奇数组内部的相对顺序应该与输......
  • Rosetta 二:手把手教你用Rosetta的全局对接模块
    文章目录1.跟着官网下载2.跟着官网的样例做对接1.导航到配体文件夹2.准备受体2.1先导航到蛋白受体文件夹2.2下载3BLP的pdb文件并用clean_pdb.py脚本预处理蛋白质2.3把处理好的蛋白放到docking文件夹3.准备配体参数3.1导航到ligand_prep3.2配体文件3.分析......
  • 5.编写ROS程序
    1.发布者Publisher的编程实现1.1.创建功能包catkin_create_pkglearning_topicroscpprospystd_msgsgeometry_msgsturtlesim1.2.创建发布者代码(C++)#include<ros/ros.h>#include<geometry_msgs/Twist.h>intmain(intargc,char**argv){//节点初始化......
  • 电脑串口和手机蓝牙BLE串口数据包通信调试工具
    1,支持HEX收发2,支持文本收发3,支持自定义按钮发送自定义命令和数据包4,支持自定义解析包内任意位置1~4字节转int并显示5,自定义json举例说明[{"name":"1234命令","type":"button","cmd":"1234","data":"01020304"},{"name":"1......
  • vue3常用的组件间通信
    一propsprops可以实现父子组件通信,props数据是只读。1.基本用法在父组件中,你可以这样传递props:<template><ChildComponentmessage="Hello,Vue3!"/></template><scriptsetup>importChildComponentfrom'./ChildComponent.vue';</scrip......
  • 打卡信奥刷题(780)用Scratch图形化工具信P6414[普及组/提高组] [COCI2014-2015#1] PROSJ
    [COCI2014-2015#1]PROSJEK题目描述有一个数列aaa,现在按照下列公式求出一个数列bb......
  • k8s集群,master节点的初始化所用到的,init文件的分析,master节点的核心组件的作用,node节
    标准的k8s集群有三个组成部分管理控制节点、计算节点、私有镜像仓库。管理控制节点的功能:提供集群的控制对集群进行全局决策检测和响应集群事件管理控制节点中有四大核心服务服务端口含义用途APIServer6443api接口负责接收请求,实现功能Scheduler......
  • 解决Access出现Microsoft JET Database Engine (0x80004005)未指定的错误
    MicrosoftJETDatabaseEngine(0x80004005)未指定的错误,这个错误只有在使用Access数据库时才能出现 出现以上问题,可以使用以下步骤进行解决问题: 1、系统可能没有注册msjetoledb40.dll,解决办法是  点开始--->运行,输入regsvr32msjetoledb40.dll,回车即可;2、数据库所在......
  • GPU与国产芯片异构通信方案,异构万卡集群 初步调研
    视频分享在这:3.1异构万卡集群,GPU与国产计算卡芯片异构通信_哔哩哔哩_bilibili国内已经有三家,实现了异构集群,GPU与国产芯片异构通信方案,初步调用结果如下。异构集群的挑战异构芯片间的混训主要面临两大挑战,一是异构卡通信库差异,导致异构卡之间通信难,二是异构卡之间性能差异......