鱼香ROS社区
    • 版块
    • 最新
    • 未解决
    • 已解决
    • 群组
    • 注册
    • 登录
    紧急通知:禁止一切关于政治&VPN翻墙等话题,发现相关帖子会立马删除封号
    提问前必看的发帖注意事项: 社区问答规则(小鱼个人)更新 | 高质量帖子发布指南

    C++调用服务进行Nav2多点导航出问题

    已定时 已固定 已锁定 已移动 未解决
    综合问题
    nav2 c++
    1
    1
    216
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • 32535196423
      3253519642
      最后由 编辑

      想要使用C++来进行Nav2的多点导航

      #include <memory>
      #include "nav2_msgs/action/navigate_to_pose.hpp"  // 导入导航动作消息的头文件
      #include "rclcpp/rclcpp.hpp"  // 导入ROS 2的C++客户端库
      #include "rclcpp_action/rclcpp_action.hpp"  // 导入ROS 2的C++ Action客户端库
      
      using NavigationAction = nav2_msgs::action::NavigateToPose;  // 定义导航动作类型为NavigateToPose
      
      class NavToPoseClient : public rclcpp::Node {
       public:
        using NavigationActionClient = rclcpp_action::Client<NavigationAction>;  // 定义导航动作客户端类型
        using NavigationActionGoalHandle =
            rclcpp_action::ClientGoalHandle<NavigationAction>;  // 定义导航动作目标句柄类型
      
        NavToPoseClient() : Node("nav_to_pose_client") {
          // 创建导航动作客户端
          action_client_ = rclcpp_action::create_client<NavigationAction>(
              this, "navigate_to_pose");
        }
      
        void sendGoals(const std::vector<std::pair<float, float>>& goals) {
          for (const auto& goal : goals) {
            sendGoal(goal.first, goal.second);
          }
        }
      
       private:
        void sendGoal(float x, float y) {
          // 等待导航动作服务器上线,等待时间为5秒
          while (!action_client_->wait_for_action_server(std::chrono::seconds(5))) {
            RCLCPP_INFO(get_logger(), "等待Action服务上线。");
          }
          // 设置导航目标点
          auto goal_msg = NavigationAction::Goal();
          goal_msg.pose.header.frame_id = "map";  // 设置目标点的坐标系为地图坐标系
          goal_msg.pose.pose.position.x = x;  // 设置目标点的x坐标为2.0
          goal_msg.pose.pose.position.y = y;  // 设置目标点的y坐标为2.0
      
          auto send_goal_options =
              rclcpp_action::Client<NavigationAction>::SendGoalOptions();
          // 设置请求目标结果回调函数
          send_goal_options.goal_response_callback =
              [this](NavigationActionGoalHandle::SharedPtr goal_handle) {
                if (goal_handle) {
                  RCLCPP_INFO(get_logger(), "目标点已被服务器接收");
                }
              };
          // 设置移动过程反馈回调函数
          send_goal_options.feedback_callback =
              [this](
                  NavigationActionGoalHandle::SharedPtr goal_handle,
                  const std::shared_ptr<const NavigationAction::Feedback> feedback) {
                (void)goal_handle;  // 假装调用,避免 warning: unused
                RCLCPP_INFO(this->get_logger(), "反馈剩余距离:%f",
                            feedback->distance_remaining);
              };
          // 设置执行结果回调函数
          send_goal_options.result_callback =
              [this](const NavigationActionGoalHandle::WrappedResult& result) {
                if (result.code == rclcpp_action::ResultCode::SUCCEEDED) {
                  RCLCPP_INFO(this->get_logger(), "处理成功!");
                }
              };
          // 发送导航目标点
          action_client_->async_send_goal(goal_msg, send_goal_options);
        }
      
        NavigationActionClient::SharedPtr action_client_;
      };
      
      int main(int argc, char** argv) {
        rclcpp::init(argc, argv);
        auto node = std::make_shared<NavToPoseClient>();
        std::vector<std::pair<float, float>> goals = {{2.0f, 2.0f}, {0.0f, 0.0f}};
        node->sendGoals(goals);
        rclcpp::spin(node);
        rclcpp::shutdown();
        return 0;
      }
      
      

      只会到达最后一个点(中间也有第一个点的路径,但是很快就会变成最后一个点),这该如何解决呢?

      1 条回复 最后回复 回复 引用 0
      • 第一个帖子
        最后一个帖子
      皖ICP备16016415号-7
      Powered by NodeBB | 鱼香ROS