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

    编译一个官方动作服务器节点时,出现“‘NodeOptions’ in namespace ‘rclcpp’ does not name a type”

    已定时 已固定 已锁定 已移动 已解决
    综合问题
    ros2 编译失败
    1
    3
    388
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • Z
      z_xu_dong
      最后由 编辑

      错误信息

      error: ‘NodeOptions’ in namespace ‘rclcpp’ does not name a type
      42 | create_node_instance(const rclcpp::NodeOptions & options) = 0;
      | ^~~~~~~~~~~
      In file included from /opt/ros/humble/include/rclcpp_components/rclcpp_components/register_node_macro.hpp:19,
      from /home/dong/projects/learning_ros2/src/learning_action/src/ActionServer.c++:5:
      /opt/ros/humble/include/rclcpp_components/rclcpp_components/node_factory_template.hpp:43:38:
      ** error: ‘NodeOptions’ in namespace ‘rclcpp’ does not name a type**
      43 | create_node_instance(const rclcpp::NodeOptions & options) override

      9e634339-d163-45f6-8d3d-3d1b84137631-image.png

      系统及ROS版本

      Ubuntu22.04+ros humble

      具体操作

      我在编写一个动作服务器节点时,编译总是不通过。我编写的代码如下:

      #include <memory>
      #include <string>
      #include <functional>
      
      #include "rclcpp_components/register_node_macro.hpp"
      
      #include "rclcpp/rclcpp.hpp"
      #include "rclcpp_action/rclcpp_action.hpp"
      
      #include "learning_interfaces/action/move_action.hpp"
      
      using namespace std::placeholders;
      
      class ActionSeverNode : public rclcpp::Node
      {
        using MoveAction = learning_interfaces::action::MoveAction;
        using GoalHandle = rclcpp_action::ServerGoalHandle<MoveAction>;
      
      public:
        explicit ActionSeverNode(const rclcpp::NodeOptions &options = rclcpp::NodeOptions())
            : Node("ServerNode", options) //explicit?
        {
          sever_ = rclcpp_action::create_server<MoveAction>(this,
                                                            "move_action",
                                                            std::bind(&ActionSeverNode::goalCallback, this, _1, _2),
                                                            std::bind(&ActionSeverNode::cancelCallback, this, _1),
                                                            std::bind(&ActionSeverNode::AcceptCallback, this, _1));
        }
      
      private:
        rclcpp_action::GoalResponse goalCallback(const rclcpp_action::GoalUUID uuid,
                                                 MoveAction::Goal::ConstSharedPtr goal_) 
        {
          RCLCPP_INFO(this->get_logger(), "Received goal.dist = %ld", goal_->dist);
          (void)uuid; 
          return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE;
        }
        rclcpp_action::CancelResponse cancelCallback(const std::shared_ptr<GoalHandle> handle_)
        {
          RCLCPP_INFO(this->get_logger(), "Received request to cancle goal.");
          (void)handle_; 
          return rclcpp_action::CancelResponse::ACCEPT;
        }
        void AcceptCallback(const std::shared_ptr<GoalHandle> handle_)
        {
          std::thread(std::bind(&ActionSeverNode::excute_action, this, _1), handle_).detach(); // learn thread.
        }
      
        void excute_action(const std::shared_ptr<GoalHandle> handle_)
        {
          rclcpp::Rate loop_rate(1);
          auto goal = handle_->get_goal();
          auto feedback = std::make_shared<MoveAction::Feedback>();
          auto state = feedback->state;
          auto result = std::make_shared<MoveAction::Result>();
          if (goal->enable)
          {
            if (handle_->is_canceling())
            {
              result->finish = false;
              handle_->canceled(result);
              RCLCPP_INFO(this->get_logger(), "cancel.");
              return;
            }
            for (int i = 0; i < goal->dist; ++i)
            {
              state = i;
              handle_->publish_feedback(feedback);
            }
            loop_rate.sleep();
          }
      
          if (rclcpp::ok())
          {
            result->finish = true;
            handle_->succeed(result);
            RCLCPP_INFO(this->get_logger(), "successed.");
          }
        }
      
      private:
        rclcpp_action::Server<MoveAction>::SharedPtr sever_;
      };
      
      RCLCPP_COMPONENTS_REGISTER_NODE(ActionSeverNode);
      
      Z 1 条回复 最后回复 回复 引用 0
      • Z
        z_xu_dong @z_xu_dong
        最后由 编辑

        @z_xu_dong 我知道原因了,因为我在登记节点宏那行末尾加了分号

        RCLCPP_COMPONENTS_REGISTER_NODE(ActionSeverNode);   ❌
        RCLCPP_COMPONENTS_REGISTER_NODE(ActionSeverNode)   ✔
        
        1 条回复 最后回复 回复 引用 0
        • Z
          z_xu_dong @z_xu_dong
          最后由 编辑

          @z_xu_dong 最后一行创建组件的问题 但不知道问题具体出在哪

          Z 1 条回复 最后回复 回复 引用 0
          • Z
            z_xu_dong @z_xu_dong
            最后由 编辑

            @z_xu_dong 我知道原因了,因为我在登记节点宏那行末尾加了分号

            RCLCPP_COMPONENTS_REGISTER_NODE(ActionSeverNode);   ❌
            RCLCPP_COMPONENTS_REGISTER_NODE(ActionSeverNode)   ✔
            
            1 条回复 最后回复 回复 引用 0
            • 小鱼小 小鱼 将这个主题标记为已解决,在
            • 第一个帖子
              最后一个帖子
            皖ICP备16016415号-7
            Powered by NodeBB | 鱼香ROS