自定义action server 接收arm_controller 指令

功能:接收来自 MoveIt / MoveIt Servo 的机械臂轨迹指令,你只需要在里面写控制真实机械臂的代码即可。

一、先给你最重要的对应关系(必须看)

你现在的配置:

yaml

复制代码
arm_controller:
  action_ns: follow_joint_trajectory

→ 你的 Action Server 必须监听:

/arm_controller/follow_joint_trajectory

只要监听这个话题,所有 RViz / MoveIt / Servo 指令都会流到你这里!


二、C++ 自定义 Action Server(完整可运行)

文件名:robot_arm_action_server.cpp

cpp

运行

复制代码
#include <rclcpp/rclcpp.hpp>
#include <rclcpp_action/rclcpp_action.hpp>
#include <control_msgs/action/follow_joint_trajectory.hpp>

using namespace std::placeholders;
using FollowJointTrajectory = control_msgs::action::FollowJointTrajectory;
using GoalHandle = rclcpp_action::ServerGoalHandle<FollowJointTrajectory>;

class RobotArmActionServer : public rclcpp::Node
{
public:
  RobotArmActionServer() : Node("robot_arm_action_server")
  {
    // 【关键】创建 Action Server,匹配你的话题名
    action_server_ = rclcpp_action::create_server<FollowJointTrajectory>(
      this,
      "/arm_controller/follow_joint_trajectory",  // 必须和你配置一致
      std::bind(&RobotArmActionServer::handle_goal, this, _1, _2),
      std::bind(&RobotArmActionServer::handle_cancel, this, _1),
      std::bind(&RobotArmActionServer::handle_accepted, this, _1)
    );

    RCLCPP_INFO(this->get_logger(), "✅ 自定义机械臂 Action Server 已启动");
    RCLCPP_INFO(this->get_logger(), "✅ 监听:/arm_controller/follow_joint_trajectory");
  }

private:
  rclcpp_action::Server<FollowJointTrajectory>::SharedPtr action_server_;

  // 1. 收到目标时调用
  rclcpp_action::GoalResponse handle_goal(
    const rclcpp_action::GoalUUID &,
    std::shared_ptr<const FollowJointTrajectory::Goal> goal)
  {
    RCLCPP_INFO(this->get_logger(), "📥 收到轨迹目标,关节数:%d",
                (int)goal->trajectory.joint_names.size());
    return rclcpp_action::GoalResponse::ACCEPT_AND_EXECUTE;
  }

  // 2. 收到取消指令时调用
  rclcpp_action::CancelResponse handle_cancel(const std::shared_ptr<GoalHandle>)
  {
    RCLCPP_WARN(this->get_logger(), "❌ 任务被取消");
    return rclcpp_action::CancelResponse::ACCEPT;
  }

  // 3. 开始执行轨迹
  void handle_accepted(const std::shared_ptr<GoalHandle> goal_handle)
  {
    std::thread{std::bind(&RobotArmActionServer::execute, this, _1), goal_handle}.detach();
  }

  // 【核心】执行轨迹 → 你在这里控制真实机械臂
  void execute(const std::shared_ptr<GoalHandle> goal_handle)
  {
    auto goal = goal_handle->get_goal();
    auto result = std::make_shared<FollowJointTrajectory::Result>();

    RCLCPP_INFO(this->get_logger(), "---------------------------------------");
    RCLCPP_INFO(this->get_logger(), "🚀 开始执行轨迹,点数:%d",
                (int)goal->trajectory.points.size());

    // 遍历所有轨迹点
    for (auto &point : goal->trajectory.points)
    {
      // ==============================================
      // 👇👇👇 【你写真实机械臂控制代码】
      // ==============================================
      std::vector<double> positions = point.positions;
      std::vector<double> velocities = point.velocities;

      RCLCPP_INFO(this->get_logger(), "📌 执行关节位置:");
      for (double p : positions) {
        RCLCPP_INFO(this->get_logger(), "  %.3f", p);
      }

      // 这里加:串口/CAN/以太网发给真机
      // 例如:send_trajectory_to_robot(positions, velocities);

      // 模拟延时(真机删除)
      rclcpp::sleep_for(std::chrono::milliseconds(100));
    }

    // 执行完成
    goal_handle->succeed(result);
    RCLCPP_INFO(this->get_logger(), "✅ 轨迹执行完成!");
  }
};

int main(int argc, char **argv)
{
  rclcpp::init(argc, argv);
  auto node = std::make_shared<RobotArmActionServer>();
  rclcpp::spin(node);
  rclcpp::shutdown();
  return 0;
}

三、CMakeLists.txt 必须加的依赖

cmake

复制代码
find_package(rclcpp REQUIRED)
find_package(rclcpp_action REQUIRED)
find_package(control_msgs REQUIRED)

add_executable(robot_arm_action_server src/robot_arm_action_server.cpp)
ament_target_dependencies(robot_arm_action_server
  rclcpp
  rclcpp_action
  control_msgs
)

install(TARGETS
  robot_arm_action_server
  DESTINATION lib/${PROJECT_NAME}
)

四、package.xml 必须加

xml

复制代码
<depend>rclcpp</depend>
<depend>rclcpp_action</depend>
<depend>control_msgs</depend>

五、这个程序的作用(超级重要)

它就是你真实机械臂的 "指令入口"!

指令流现在变成:

plaintext

复制代码
MoveIt / MoveIt Servo
    ↓
/arm_controller/follow_joint_trajectory
    ↓
【你的 C++ Action Server】
    ↓
真实机械臂硬件

你只要在 execute () 函数里写硬件控制代码,整个系统就通了!


六、如何测试?

  1. 启动你原来的 launch
  2. 启动这个 action server
  3. 在 RViz 里拖动机械臂 → 发送指令
  4. 你会看到 C++ 程序收到所有关节位置!

七、我再给你一句最关键的话

你现在的整个系统,指令最终就是发到这个 Action Server

你只需要在这里写真机驱动,就能控制真实机械臂

相关推荐
Nile几秒前
解密Palantir系列一:3. Palantir 是谁
大数据·人工智能·ai
m0_380167142 分钟前
加密市场数据的未来:实时化、多交易所与 AI-ready
人工智能·区块链
云天AI实战派2 分钟前
AI 智能体总是跑偏怎么办?ChatGPT/API/Agent 故障排查指南与全流程修复手册
大数据·人工智能·chatgpt·agent
星浩AI3 分钟前
(六)模型微调效果测试:基于 BERT 的中文评价情感分析[附源码]
人工智能·机器学习·llm
smile-yan10 分钟前
大厂故事之百度(3/4)AI商业化迷航——从技术强到落地难
人工智能·百度
vensli10 分钟前
消息跨端架构演进:基于 C++ 的多端一致性研发框架实践
java·人工智能·软件工程·安卓
云烟成雨TD10 分钟前
Spring AI Alibaba 1.x 系列【70】思考模式
java·人工智能·spring
MediaTea12 分钟前
人工智能通识课:大语言模型
人工智能·语言模型·自然语言处理
code 小楊13 分钟前
AI Agent 核心范式 ReAct 深度详解:原理、流程、源码、实战与工程优化
人工智能·科技·开源
小脑斧12314 分钟前
AI Skills 全链路自动化运营实践:抖音热点、小红书种草与文生图一体化方案
大数据·人工智能·小红书·skills·自动化运营