Του Marco Arruda
Σε αυτήν την ανάρτηση θα μάθετε πώς να δημοσιεύετε σε ένα θέμα ROS2 χρησιμοποιώντας το ROS2 C++. Μέχρι το τέλος του βίντεο, μετακινούμε το ρομπότ Dolly ρομπότ, που προσομοιώθηκε με το Gazebo 11.
Θα μάθετε:
- Πώς να δημιουργήσετε έναν κόμβο με ROS2 και C++
- Πώς να δημοσιοποιήσετε ένα θέμα με ROS2 και C++
1 – Περιβάλλον εγκατάστασης – Εκκίνηση προσομοίωσης
Πριν οτιδήποτε άλλο φρόντισε να έχεις το rosject από την προηγούμενη ανάρτηση, μπορείς να το αντιγράψεις από εδώ.
Εκκινήστε την προσομοίωση σε ένα κέλυφος ιστού και σε διαφορετική καρτέλα, ελέγξτε τα θέματα που έχουμε διαθέσιμα. Πρέπει να πάρετε κάτι παρόμοιο με την παρακάτω εικόνα:
2 – Δημιουργήστε έναν εκδότη θεμάτων
Δημιουργήστε ένα νέο αρχείο για να περιέχει τον κόμβο εκδότη: move_robot.cpp και επικολλήστε το ακόλουθο περιεχόμενο:
#include <chrono> #include <functional> #include <memory> #include "rclcpp/rclcpp.hpp" #include "geometry_msgs/msg/twist.hpp" using namespace std::chrono_literals; /* This example creates a subclass of Node and uses std::bind() to register a * member function as a callback from the timer. */ class MovingRobot : public rclcpp::Node public: MovingRobot() : Node("moving_robot"), count_(0) publisher_ = this->create_publisher("/dolly/cmd_vel", 10); timer_ = this->create_wall_timer( 500ms, std::bind(&MovingRobot::timer_callback, this)); private: void timer_callback() auto message = geometry_msgs::msg::Twist(); message.linear.x = 0.5; message.angular.z = 0.3; RCLCPP_INFO(this->get_logger(), "Publishing: '%f.2' and %f.2", message.linear.x, message.angular.z); publisher_->publish(message); rclcpp::TimerBase::SharedPtr timer_; rclcpp::Publisher::SharedPtr publisher_; size_t count_; ; int main(int argc, char *argv[]) rclcpp::init(argc, argv); rclcpp::spin(std::make_shared()); rclcpp::shutdown(); return 0; QoS (Quality of Service)
Παρόμοια με τον συνδρομητή δημιουργείται μια κλάση που κληρονομεί Κόμβος. ΕΝΑ εκδότης_ είναι εγκατάσταση και επίσης μια επανάκληση, αν και αυτή τη φορά δεν είναι μια επανάκληση που λαμβάνει μηνύματα, αλλά α timer_callback καλείται σε συχνότητα που ορίζεται από το μετρών την ώραν_ μεταβλητός. Αυτή η επανάκληση χρησιμοποιείται για τη δημοσίευση μηνυμάτων στο ρομπότ.
ο create_publisher Η μέθοδος χρειάζεται δύο ορίσματα:
- όνομα θέματος
- QoS (Ποιότητα υπηρεσίας) – Αυτή είναι η πολιτική δεδομένων που αποθηκεύονται στην ουρά. Μπορείτε να χρησιμοποιήσετε διαφορετικά ενδιάμεσα προγράμματα ή ακόμα και να χρησιμοποιήσετε κάποια που παρέχονται από προεπιλογή. Απλώς δημιουργούμε μια ουρά 10. Από προεπιλογή, διατηρεί τα τελευταία 10 μηνύματα που στάλθηκαν στο θέμα.
Το μήνυμα που δημοσιεύτηκε πρέπει να δημιουργηθεί χρησιμοποιώντας την κλάση που έχει εισαχθεί:
message = geometry_msgs::msg::Twist();
Διασφαλίζουμε ότι οι μέθοδοι επανάκλησης από την πλευρά των συνδρομητών θα αναγνωρίζουν πάντα το μήνυμα. Αυτός είναι ο τρόπος που πρέπει να δημοσιευτεί χρησιμοποιώντας τη μέθοδο εκδότη δημοσιεύω.
3 – Μεταγλώττιση και εκτέλεση του κόμβου
Για να γίνει μεταγλώττιση πρέπει να προσαρμόσουμε κάποια πράγματα στο ~/ros2_ws/src/my_package/CMakeLists.txt. Προσθέστε λοιπόν τα ακόλουθα στο αρχείο:
- Πρόσθεσε το geometry_msgs εξάρτηση
- Προσθέστε το εκτελέσιμο αρχείο κινούμενο_ρομπότ
- Προσθήκη οδηγιών εγκατάστασης για κινούμενο_ρομπότ
find_package(geometry_msgs REQUIRED) ... # moving robot add_executable(moving_robot src/moving_robot.cpp) ament_target_dependencies(moving_robot rclcpp geometry_msgs) ... install(TARGETS moving_robot reading_laser DESTINATION lib/$PROJECT_NAME/ )
Μπορούμε να εκτελέσουμε τον κόμβο όπως παρακάτω:
source ~/ros2_ws/install/setup.bash
ros2 run my_package
Σχετικά μαθήματα και επιπλέον σύνδεσμοι:
Η δημοσίευση Εξερευνώντας το ROS2 χρησιμοποιώντας τροχοφόρο ρομπότ – #3 – Μετακίνηση του ρομπότ
εμφανίστηκε πρώτα στις Η Κατασκευή.
The Construct Blog