机器人操作系统ROS入门

本文分析了ROS1中的Master节点在ROS2中的变化,探讨了取消Master的原因,以及ROS2如何通过DDS和去中心化通信机制提高系统健壮性和扩展性。同时提到了Nodelet、服务、TF坐标变换和SLAM在ROS中的应用。
摘要由CSDN通过智能技术生成

ROS

目录

  • ROS的通信系统基于TCP/UDP网络,在此之上进行了再次封装,也就是TCPROS/UDPROS。通信系统使用发布/订阅、客户端/服务器等模型,实现多种通信机制的数据传输。除了TCPROS/UDPROS的通信机制外,ROS还提供一种进程内的通信方法——Nodelet,可以为多进程通信提供一种更优化的数据传输方式,适合对数据传输实时性方面有较高要求的应用。
  • 节点间的通信消息通过一个带有发布和订阅功能的RPC传输系统,从发布节点传送到接收节点。
  • 虽然基于话题的发布/订阅模型是一种很灵活的通信模式,但是对于双向的同步传输模式并不适合。在ROS中,我们称这种同步传输模式为服务(Service),其基于客户端/服务器(Client/Server)模型,包含两个部分的通信数据类型:一个用于请求,另一个用于应答,类似于Web服务器。与话题不同的是,ROS中只允许有一个节点提供指定命名的服务
  • 为了统筹管理以上概念,系统当中需要有一个控制器使得所有节点有条不紊地执行,这就是ROS节点管理器(ROS Master)。ROS Master通过远程过程调用(RPC)提供登记列表和对其他计算图表的查找功能,帮助ROS节点之间相互查找、建立连接,同时还为系统提供参数服务器,管理全局参数。ROS Master就是一个管理者,没有它的话,节点将无法找到彼此,也无法交换消息或调用服务,整个系统将会瘫痪,由此可见其在ROS系统中的重要性
  • 在实际应用中,可能需要使用两个以上的计算平台,可以使用相同的方法进行配置,主机运行Master,其他从机通过设置ROS_MASTER_URI环境变量确定Master位置即可。
  • 启动文件(Launch File)便是ROS中一种同时启动多个节点的途径,它还可以自动启动ROS Master节点管理器,并且可以实现每个节点的各种配置,为多个节点的操作提供很大便利
  • 比如turtlebot的键盘控制节点发布的速度控制指令话题可能是/turtlebot/cmd_vel,但是我们自己的机器人订阅的速度控制话题是/cmd_vel,这时使用<remap>就可以轻松解决问题,将/turtlebot/cmd_vel重映射为/cmd_vel,我们的机器人就可以接收到速度控制指令了:<remap from=“/turtlebot/cmd_vel” to=“/cmd_vel”/>
  • TF坐标变换
    研究下TF广播器的代码 并运行起来
    https://github.com/huchunxu/ros_exploring/tree/master/ros_primary/learning_tf
  • MRobot是ROSClub基于ROS系统构建的一款差分轮式移动机器人
  • SLAM是Simultaneous localization and mapping缩写,意为“同步定位与建图”,主要用于解决机器人在未知环境运动时的定位与地图构建问题
  • 创建Publisher
#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv)
{
    // ROS节点初始化
    ros::init(argc, argv, "talker");
    // 创建节点句柄
    ros::NodeHandle n;
    // 创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String
    ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
    // 设置循环的频率
    ros::Rate loop_rate(10);
    int count = 0;
    while (ros::ok())
    {
        // 初始化std_msgs::String类型的消息
        std_msgs::String msg;
        std::stringstream ss;
        ss << "hello world " << count;
        msg.data = ss.str();
        // 发布消息
        ROS_INFO("%s", msg.data.c_str());
        chatter_pub.publish(msg);
        // 循环等待回调函数
        // spinOnce用来处理节点订阅话题的所有回调函数。虽然目前的发布节点并没有订阅任何消息,spinOnce函数不是必需的,但是为了保证功能无误,建议所有节点都默认加入该函数。
        ros::spinOnce();
        // 按照循环频率延时
        loop_rate.sleep();
        ++count;
    }
    return 0;
}

  • 创建Subscriber
#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节点
    ros::init(argc, argv, "listener");
    // 创建节点句柄
    ros::NodeHandle n;
    // 创建一个Subscriber,订阅名为chatter的话题,注册回调函数chatterCallback
    ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
    // 循环等待回调函数
    ros::spin();
    return 0;
}
ROS1中必须有一个Master, ROS2中取消了这个要求,ROS2中为什么要取消,ROS2中用什么替代了这个机制 ?
  • ROS1中的Master用于管理节点之间的通信,每个节点需要通过Master注册自己并找到其他节点。然而,这种设计有一些限制,例如,如果Master出现故障,整个系统都会受到影响。另一个问题是,Master模型使得系统在大规模或分布式部署场景中的扩展性受到限制。为了解决这些问题,ROS2采用了一种叫做DDS(Data Distribution Service,数据分发服务)的通信架构。在这种架构中,节点可以直接与其他节点通信,而无需通过中心节点。这种设计改善了系统的健壮性和扩展性,并使得节点可以在不同的网络和计算平台之间更灵活地进行通信。DDS通过一种称为“发现”(Discovery)的过程来实现节点之间的通信。在发现过程中,每个节点都会广播其身份和它提供的服务,同时监听其他节点的广播。一旦节点发现了其他提供了它需要的服务的节点,它就可以直接与那个节点通信,而无需通过任何中心节点。除了改进通信架构,ROS2还引入了其他的一些改进,例如,提供了对实时操作的更好支持,改进了安全性,以及支持了跨平台操作。
参考资料
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值