Newer
Older
casic_unitree_dog / example / casic / slam_wrapper.hpp
//
// Created by casic on 25-2-25.
//

#ifndef SLAM_WRAPPER_HPP
#define SLAM_WRAPPER_HPP

#include <vector>

#include "unitree/common/dds/dds_easy_model.hpp"
#include <unitree/robot/channel/channel_publisher.hpp>
#include <unitree/robot/channel/channel_subscriber.hpp>

#define COMMANDTOPIC "rt/qt_command"
#define NOTICETOPIC "rt/qt_notice"
#define ODOMTOPIC "rt/lio_sam_ros2/mapping/re_location_odometry"
#define ADDNODETOPIC "rt/qt_add_node"
#define ADDEDGETOPIC "rt/qt_add_edge"

using namespace unitree::robot;

struct node_attribute {
    u_int16_t nodeName;
    float nodeX;
    float nodeY;
    float nodeZ;
    float nodeYaw;
};

struct edge_attribute {
    u_int16_t edgeName;
    u_int16_t edgeStart;
    u_int16_t edgeEnd;
};

class slam_wrapper {
private:
    int index = 0;
    // const nav_msgs::msg::dds_::Odometry_ *currentOdom{};

    // pub
    // ChannelPublisherPtr<unitree_interfaces::msg::dds_::QtCommand_> pubQtCommand = ChannelPublisherPtr<
    //     unitree_interfaces::msg::dds_::QtCommand_>(
    //     new ChannelPublisher<unitree_interfaces::msg::dds_::QtCommand_>(COMMANDTOPIC)
    // );
    // ChannelPublisherPtr<unitree_interfaces::msg::dds_::QtNode_> pubQtNode = ChannelPublisherPtr<
    //     unitree_interfaces::msg::dds_::QtNode_>(
    //     new ChannelPublisher<unitree_interfaces::msg::dds_::QtNode_>(ADDNODETOPIC)
    // );
    // ChannelPublisherPtr<unitree_interfaces::msg::dds_::QtEdge_> pubQtEdge = ChannelPublisherPtr<
    //     unitree_interfaces::msg::dds_::QtEdge_>(
    //     new ChannelPublisher<unitree_interfaces::msg::dds_::QtEdge_>(ADDEDGETOPIC)
    // );

    // sub
    // ChannelSubscriberPtr<std_msgs::msg::dds_::String_> subQtNotice = ChannelSubscriberPtr<
    //     std_msgs::msg::dds_::String_>(
    //     new ChannelSubscriber<std_msgs::msg::dds_::String_>(NOTICETOPIC)
    // );
    // ChannelSubscriberPtr<nav_msgs::msg::dds_::Odometry_> subOdometer = ChannelSubscriberPtr<
    //     nav_msgs::msg::dds_::Odometry_>(
    //     new ChannelSubscriber<nav_msgs::msg::dds_::Odometry_>(ODOMTOPIC)
    // );

public:
    std::vector<node_attribute> node_attributes;
    std::vector<edge_attribute> edge_attributes;
    u_int16_t node_name = 0;

    explicit slam_wrapper(const char *networkInterface);

    void qt_notice_handler(const void *message);

    void odometer_handler(const void *message);

    void start_mapping();

    void end_mapping();

    void start_relocation();

    void init_pose();

    void start_navigation();

    void default_navigation();

    void add_node_and_edge();

    void add_edge(u_int16_t edge_name, u_int16_t start_node, u_int16_t end_node);

    void save_node_and_edge();

    void close_all_node();

    void delete_all_node();

    void delete_all_edge();

    void pause_navigation();

    void recover_navigation();
};

#endif //SLAM_WRAPPER_HPP