目录

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
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐