4. Moveit 添加ArbotiX关节控制器

ArbotiX提供了Joint Trajectory Action Controllers插件。此功能包既能驱动真实的机器人每个关节,同时提供了离线模式,此处用其离线模式来仿真虚拟的机器人。

1.首先建立配置文件arm.yaml

joints: {
    joint1: {id: 1, neutral: 205, max_angle: 169.6, min_angle: -169.6, max_speed: 90},
    joint2: {id: 2, max_angle: 134.6, min_angle: -134.6, max_speed: 90},
    joint3: {id: 3, max_angle: 150.1, min_angle: -150.1, max_speed: 90},
    joint4: {id: 4, max_angle: 150.1, min_angle: -150.1, max_speed: 90},
    joint5: {id: 5, max_angle: 150.1, min_angle: -150.1, max_speed: 90},
    joint6: {id: 6, max_angle: 360, min_angle: -360, max_speed: 90},
    finger_joint1: {id: 7, max_speed: 90},
}
controllers: {
    arm_controller: {type: follow_controller, joints: [joint1, joint2, joint3, joint4, joint5, joint6], action_name: arm_controller/follow_joint_trajectory, onboard: False }
}

(1)关节的最大角度、最小角度最大速度。

(2)控制类型、关节、接收的action消息名称。

2.运行ArbotiX节点

<launch>
    <!-- 不使用仿真时
要在 ROS 中通过 **MoveIt!** 集成你自定义的 `RobotConSys_SDK` 控制器,你需要完成以下几个核心步骤: --- ## ✅ 一、整体流程概述 | 步骤 | 内容 | |------|------| | 1. 创建 MoveIt! 配置包 | 使用 MoveIt! Setup Assistant | | 2. 编写 ROS 控制器接口 | 实现一个符合 `controller_interface` 的控制器 | | 3. 编写 MoveIt! 控制器管理器 | 将 SDK 控制逻辑与 MoveIt! 关联 | | 4. 修改 launch 文件 | 启动 MoveIt! 和你的 SDK 控制器节点 | | 5. 测试控制 | 在 RViz 中使用 Motion Planning 插件测试 | --- ## ✅ 二、Step-by-Step 实现 ### 🔧 Step 1:创建 MoveIt! 配置包 确保你已经有了机械臂的 URDF 模型(例如 `tr_arm.urdf`),然后运行: ```bash rosrun moveit_setup_assistant setup_assistant ``` 导入 URDF 并逐步配置以下内容: - Self-collisions - Planning groups(如 `arm`, `gripper`) - End effectors - Passive joints - Virtual joints 完成后生成 `moveit_config` 包,比如 `tr_arm_moveit_config`。 --- ### 🔧 Step 2:编写 ROS 控制器接口(基于 `controller_interface`) 你需要实现一个控制器插件,继承自 `controller_interface::Controller<...>`。通常你会实现一个 `JointGroupPositionController` 类似的东西。 #### 示例文件结构: ``` robot_package/ ├── include/ │ └── robot_arm_controller.hpp ├── src/ │ └── robot_arm_controller.cpp ├── plugin_description.xml ├── CMakeLists.txt └── package.xml ``` #### robot_arm_controller.hpp ```cpp #ifndef ROBOT_ARM_CONTROLLER_HPP #define ROBOT_ARM_CONTROLLER_HPP #include <controller_interface/controller.h> #include <hardware_interface/joint_command_interface.h> #include <vector> #include <string> #include "RobotConSys_SDK.h" namespace robot_arm_control { class RobotArmController : public controller_interface::Controller<hardware_interface::PositionJointInterface> { public: bool init(hardware_interface::PositionJointInterface* hw, ros::NodeHandle& nh) override; void starting(const ros::Time& time) override; void update(const ros::Time& time, const ros::Duration& period) override; void stopping(const ros::Time& time) override; private: std::vector<hardware_interface::JointHandle> joints_; std::vector<double> cmd_; RobotConSys_SDK sdk_; }; } // namespace robot_arm_control #endif ``` #### robot_arm_controller.cpp ```cpp #include "robot_arm_controller.hpp" bool robot_arm_control::RobotArmController::init(hardware_interface::PositionJointInterface* hw, ros::NodeHandle& nh) { // 获取关节名称 std::vector<std::string> joint_names; if (!nh.getParam("joint_names", joint_names)) { ROS_ERROR("No 'joint_names' param set."); return false; } // 注册所有关节 for (const auto& name : joint_names) { joints_.push_back(hw->getHandle(name)); cmd_.push_back(0.0); } if (!sdk_.Connect("192.168.1.100", 502)) { ROS_ERROR("Failed to connect to robot arm via SDK"); return false; } return true; } void robot_arm_control::RobotArmController::starting(const ros::Time& /*time*/) {} void robot_arm_control::RobotArmController::update(const ros::Time& /*time*/, const ros::Duration& /*period*/) { for (size_t i = 0; i < joints_.size(); ++i) { double pos = joints_[i].getPosition(); cmd_[i] = pos; } sdk_.MoveJ(cmd_); // 调用 SDK 接口发送关节角度 } void robot_arm_control::RobotArmController::stopping(const ros::Time& /*time*/) {} ``` --- ### 🔧 Step 3:注册控制器为插件 在 `plugin_description.xml` 中添加: ```xml <library path="lib/librobot_arm_controller"> <class name="robot_arm_control/RobotArmController" type="robot_arm_control::RobotArmController" base_class_type="controller_interface::ControllerBase"> <description> A controller using RobotConSys_SDK to control the robotic arm. </description> </class> </library> ``` 并在 `package.xml` 中添加: ```xml <export> <controller_interface plugin="${prefix}/plugin_description.xml"/> </export> ``` --- ### 🔧 Step 4:配置 MoveIt! 使用该控制器 在 `tr_arm_moveit_config/config/controllers.yaml` 中添加: ```yaml controller_list: - name: "arm_controller" action_ns: "follow_joint_trajectory" type: "FollowJointTrajectory" default: true joints: - joint1 - joint2 - joint3 - joint4 - joint5 - joint6 ``` 同时,在 `tr_arm_moveit_config/launch/move_group.launch` 中加载控制器: ```xml <rosparam file="$(find robot_package)/config/controllers.yaml" command="load"/> <node name="robot_arm_sdk_node" pkg="robot_package" type="robot_arm_sdk_node"/> ``` --- ### 🔧 Step 5:编译并运行 ```bash catkin_make source devel/setup.bash # 启动 MoveIt! roslaunch tr_arm_moveit_config move_group.launch roslaunch tr_arm_moveit_config moveit_rviz.launch ``` 在 RViz 中使用 Motion Planning 插件,点击 “Plan and Execute”,MoveIt! 就会调用你的 SDK 控制器来驱动机械臂! --- ## ✅ 三、注意事项 | 注意项 | 说明 | |--------|------| | SDK 线程安全 | 如果 SDK 不支持多线程,需加锁 | | 实时性要求 | 控制周期建议设置为 10ms~100ms | | 错误处理 | 建议加入 SDK 返回值判断和重连机制 | | MoveIt! 运动规划 | 可结合 OMPL 或 TRAC-IK 解算器进行逆运动学求解 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值