目录
在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