共计 2236 个字符,预计需要花费 6 分钟才能阅读完成。
开篇小吐槽
想象一下,如果机器人能自由交流,它们会说些什么呢?“嘿,这个螺丝松了!”或者“今天的 Wi-Fi 怎么这么慢?”好吧,虽然现实中的机器人交流不太可能这么生动,但在 ROS(机器人操作系统)的世界里,节点之间的通信确实很关键。本文将带你深入了解 ROS 的通信机制,让你的机器人能“聊天”起来。
ROS 通信的 ABC
在 ROS 的大家庭中,节点间的沟通靠的是以下几种方式:
- 话题(Topics):像群聊一样,一个节点发消息,其他订阅了这个话题的节点都能收到。
- 服务(Services):更像是私信,一问一答,用于需要得到即时响应的场合。
- 动作(Actions):当你需要给机器人下达一些长期任务时,这种方式非常合适。
环境准备:别忘了预热
在跳进代码海之前,先确保你的 ROS 环境准备就绪。如果还没装 ROS,那就像装个大型游戏一样,耐心一点,跟着官网指引一步步来。环境搭建好后,记得运行这个命令,让系统知道你要开始玩 ROS 了:
source /opt/ros/noetic/setup.bash
创建工作空间
mkdir -p demo01/src
cd demo01
catkin_make
cd src
你当前的目录位置应该是 /home/user/Documents/demo01/src
。
创建 ROS 包:你的机器人项目的摇篮
先创建一个 ROS 包,我们的代码就住在这里。打开终端,敲入:
catkin_create_pkg my_ros_package std_msgs rospy roscpp
编写 Publisher:机器人的“小喇叭”
我们的第一个角色是发布者,就像是机器人世界的广播员。它会定期发送消息。
- 在
my_ros_package/src
下创建talker.cpp
。 - 加入下面的代码(别忘了注释):
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv) {
// 初始化 ROS 节点
ros::init(argc, argv, "talker");
ros::NodeHandle n;
// 创建一个 Publisher,发布名为 "chatter" 的话题
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Rate loop_rate(10); // 设置循环频率
while (ros::ok()) {
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << ros::Time::now(); // 创建字符串消息
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str()); // 打印消息
chatter_pub.publish(msg); // 发布消息
ros::spinOnce();
loop_rate.sleep();}
return 0;
}
编写 Subscriber:机器人的“耳朵”
紧接着,我们需要一个订阅者来听发布者说的话。
- 在同一目录下创建
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;
// 创建一个 Subscriber,订阅名为 "chatter" 的话题
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
ros::spin(); // 进入自循环,等待消息到来
return 0;
}
编译 & 运行:看看魔法发生了没
编译前,记得修改 my_ros_package
包里的 CMakeLists.txt
文件。
修改 CMakeLists.txt
...
add_executable(talker src/talker.cpp)
add_executable(listener src/listener.cpp)
...
target_link_libraries(talker
${catkin_LIBRARIES}
)
target_link_libraries(listener
${catkin_LIBRARIES}
)
...
编译和运行
- 回到工作空间的根目录,编译一下:
cd ..
catkin_make
source devel/setup.bash
- 先启动 roscore:
roscore
- 在另一个终端,运行发布者:
rosrun my_ros_package talker
- 再在另一个终端,运行订阅者:
rosrun my_ros_package listener
现在,你应该能看到订阅者接收到发布者发出的消息了。
发布者输出示例:
订阅者输出示例:
结尾:机器人的“小八卦”
通过这个简单的示例,你已经迈出了与机器人“聊天”的第一步。记住,ROS 就像是一个充满可能的沙盒游戏,你可以在里面尽情构建你的机器人世界。别忘了,实践是最好的老师,所以多试试,多玩玩!
正文完