Zeitstempelsynchronisierung zwischen zwei Geräten

Hier sind die kurzen Schritte zum Konfigurieren von NTP auf zwei Maschinen:
Installieren Sie NTP auf zwei Maschinen:

sudo apt-get update
sudo apt-get install ntp

NTP-Server konfigurieren:
Konfigurieren Sie Maschine A als NTP-Server, sodass ihre Zeit zur Zeitbasis im Netzwerk wird.

Bearbeiten Sie die NTP-Konfigurationsdatei:

sudo nano /etc/ntp.conf

Konfigurieren Sie den Server als NTP-Server. Suchen Sie die folgende Zeile und kommentieren Sie sie aus (fügen Sie # vor der Zeile hinzu):

Arduino

# pool <server> iburst

Fügen Sie dann die folgenden Zeilen hinzu:

server 127.127.1.0 iburst
fudge 127.127.1.0 stratum 10

NTP-Server starten:

sudo service ntp start

NTP-Client konfigurieren:
Konfigurieren Sie ihn auf Maschine B als NTP-Client, um die Zeit mit Maschine A zu synchronisieren.

Bearbeiten Sie die NTP-Konfigurationsdatei:

sudo nano /etc/ntp.conf

Suchen Sie die folgende Zeile und kommentieren Sie sie aus (fügen Sie # vor der Zeile hinzu):

pool <server> iburst

Fügen Sie dann die folgende Zeile hinzu und ersetzen Sie <machineA_IP> durch die IP-Adresse von Maschine A:

server <machineA_IP> iburst

Starten Sie den NTP-Client:

sudo service ntp start

Nachdem Sie die oben genannten Schritte ausgeführt haben, hilft Ihnen NTP dabei, die Systemzeit zwischen den beiden Maschinen zu synchronisieren. Anschließend können Sie die Zeitsynchronisierungsfunktionen von ROS 2, z. B. TimeSynchronizer, auf beiden Computern verwenden, um eine korrekte Synchronisierung der Zeitstempel sicherzustellen. Bitte stellen Sie sicher, dass sich Maschine A und Maschine B im selben Netzwerk befinden und auf einander zugreifen und miteinander kommunizieren können.

Wie können auf der Grundlage der obigen Situation die Zeitstempel zweier Fahrzeuge synchronisiert werden?

In ROS 2 können Sie die Zeitsynchronisierungsfunktion von ROS 2 verwenden, um sicherzustellen, dass die Zeitstempel auf beiden Maschinen synchron bleiben. ROS 2 bietet ein Tool namens TimeSynchronizer, mit dem Sie die Zeitstempel zweier Themen synchronisieren können. Hier sind die Schritte zum Synchronisieren von Zeitstempeln zwischen zwei Maschinen:

  1. Veröffentlichen Sie eine Nachricht auf Maschine A:
#include <rclcpp/rclcpp.hpp>
#include <geometry_msgs/msg/transform_stamped.hpp>
#include <tf2_ros/transform_broadcaster.h>

int main(int argc, char** argv) {
    
    
    rclcpp::init(argc, argv);
    auto node = rclcpp::Node::make_shared("tf_publisher");

    tf2_ros::TransformBroadcaster tf_broadcaster(node);

    rclcpp::Rate rate(10.0); // 设置发布频率

    while (rclcpp::ok()) {
    
    
        // 假设你有一个变换信息,表示从 frame1 到 frame2 的变换
        geometry_msgs::msg::TransformStamped transform;
        transform.header.stamp = node->now();
        transform.header.frame_id = "frame1";
        transform.child_frame_id = "frame2";
        transform.transform.translation.x = 1.0; // 假设x方向平移了1米
        transform.transform.rotation.w = 1.0;    // 假设没有旋转

        tf_broadcaster.sendTransform(transform);

        rate.sleep();
    }

    rclcpp::shutdown();
    return 0;
}

  1. Empfangen Sie Nachrichten auf Maschine B und synchronisieren Sie Zeitstempel:
#include <rclcpp/rclcpp.hpp>
#include <tf2_ros/transform_listener.h>
#include <message_filters/subscriber.h>
#include <tf2_ros/message_filter.h>
#include <geometry_msgs/msg/transform_stamped.hpp>

void callback(const geometry_msgs::msg::TransformStamped::SharedPtr& msg) {
    
    
    // 在这里处理接收到的同步后的消息
    RCLCPP_INFO(rclcpp::get_logger("tf_subscriber"), "Received Transform - Time: %f",
                msg->header.stamp.sec + (msg->header.stamp.nanosec / 1e9));
}

int main(int argc, char** argv) {
    
    
    rclcpp::init(argc, argv);
    auto node = rclcpp::Node::make_shared("tf_subscriber");

    // 订阅来自机器A发布的TransformStamped消息
    auto subscriber = node->create_subscription<geometry_msgs::msg::TransformStamped>(
        "tf_topic", rclcpp::QoS(10),
        [](const geometry_msgs::msg::TransformStamped::SharedPtr msg) {
    
    
            callback(msg);
        });

    // 使用TimeSynchronizer同步消息时间戳
    message_filters::Subscriber<geometry_msgs::msg::TransformStamped> tf_subscriber(node, "tf_topic");
    tf2_ros::MessageFilter<geometry_msgs::msg::TransformStamped> tf_filter(
        tf_subscriber, node, "target_frame", 10);
    tf_filter.registerCallback(callback);

    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
}

Im abonnierenden Knoten von Maschine B verwenden wir TimeSynchronizer, um Zeitstempel zu synchronisieren. Sie müssen „target_frame“ im obigen Code durch den Namen des Zielframes ersetzen, den Sie synchronisieren möchten. Wenn der Herausgeber auf Maschine A TF-Nachrichten veröffentlicht, empfängt der TimeSynchronizer diese Nachrichten auf Maschine B und stellt sicher, dass ihre Zeitstempel synchron bleiben. Die synchronisierte Nachricht wird zur Verarbeitung an die Rückruffunktion übergeben.

Auf diese Weise können Sie Zeitstempel zwischen den beiden Maschinen synchronisieren und die von Maschine A auf Maschine B veröffentlichten TF-Informationen korrekt verarbeiten.

Supongo que te gusta

Origin blog.csdn.net/CCCrunner/article/details/131964984
Recomendado
Clasificación