探秘ROS通信:玩转机器人的秘密语言

659次阅读
没有评论

共计 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:机器人的“小喇叭”

我们的第一个角色是发布者,就像是机器人世界的广播员。它会定期发送消息。

  1. my_ros_package/src 下创建talker.cpp
  2. 加入下面的代码(别忘了注释):
#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:机器人的“耳朵”

紧接着,我们需要一个订阅者来听发布者说的话。

  1. 在同一目录下创建listener.cpp
  2. 写入这段代码:
#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}
)
...

编译和运行

  1. 回到工作空间的根目录,编译一下:
cd ..
catkin_make
source devel/setup.bash
  1. 先启动 roscore:
roscore
  1. 在另一个终端,运行发布者:
rosrun my_ros_package talker
  1. 再在另一个终端,运行订阅者:
rosrun my_ros_package listener

现在,你应该能看到订阅者接收到发布者发出的消息了。

发布者输出示例:

发布者输出

订阅者输出示例:

订阅者输出

结尾:机器人的“小八卦”

通过这个简单的示例,你已经迈出了与机器人“聊天”的第一步。记住,ROS 就像是一个充满可能的沙盒游戏,你可以在里面尽情构建你的机器人世界。别忘了,实践是最好的老师,所以多试试,多玩玩!

正文完
 1
历史的配角
版权声明:本站原创文章,由 历史的配角 于2023-12-10发表,共计2236字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码

您无法复制此页面的内容

了解 未来日记 的更多信息

立即订阅以继续阅读并访问完整档案。

Continue reading