现在的控制器是:
plaintext
arm_controller 类型:joint_trajectory_controller/JointTrajectoryController它提供Action 服务:
plaintext
/arm_controller/follow_joint_trajectory只要向这个 Action 发轨迹,机械臂就会动。
一、最快速测试(命令行,不用写代码)
直接在终端运行,机械臂立刻动!
1. 查看当前关节角度(确认能读到)
bash
运行
ros2 topic echo /joint_states2. 发送一条轨迹命令(直接复制)
bash
运行
ros2 action send_goal /arm_controller/follow_joint_trajectory control_msgs/action/FollowJointTrajectory "{ trajectory: { joint_names: [JM0, JM1-2, JM4-3, JM4, JM5, YB], points: [ { positions: [0.0, 0.0, 0.0, 0.0, 0.0, 0.0], time_from_start: {sec: 2, nanosec: 0} } ] } }"✅运行后机械臂会在 2 秒内走到全零位
这就证明:
你的 joint_trajectory_controller 工作正常!
二、Python 代码控制(最实用)
创建文件send_trajectory.py,直接复制运行:
python
运行
import rclpy from rclpy.action import ActionClient from rclpy.node import Node from control_msgs.action import FollowJointTrajectory from trajectory_msgs.msg import JointTrajectoryPoint class ArmController(Node): def __init__(self): super().__init__('arm_simple_controller') self._action_client = ActionClient( self, FollowJointTrajectory, '/arm_controller/follow_joint_trajectory' ) def send_goal(self): goal_msg = FollowJointTrajectory.Goal() # 填入你的关节名字(和你配置一致) goal_msg.trajectory.joint_names = [ "JM0", "JM1-2", "JM4-3", "JM4", "JM5", "YB" ] # 定义一个轨迹点 point = JointTrajectoryPoint() point.positions = [0.5, -0.3, 0.2, 0.0, -0.1, 0.4] # 目标角度 point.time_from_start.sec = 3 # 3秒到达 goal_msg.trajectory.points.append(point) # 等待Action服务器上线 self._action_client.wait_for_server() # 发送目标 self._action_client.send_goal_async(goal_msg) self.get_logger().info('轨迹已发送 → 机械臂运动中') def main(args=None): rclpy.init(args=args) arm = ArmController() arm.send_goal() rclpy.spin(arm) if __name__ == '__main__': main()运行:
bash
运行
ros2 run your_package send_trajectory.py✅机械臂会平滑运动到目标角度
三、MoveIt 如何使用它?(你最关心的)
MoveIt 不是直接调用,而是通过:
moveit_simple_controller_manager
它会自动连接:
plaintext
/arm_controller/follow_joint_trajectory你只需要在 MoveIt 配置文件simple_moveit_controllers.yaml写:
yaml
controller_list: - name: arm_controller action_ns: follow_joint_trajectory type: FollowJointTrajectory default: true joints: - JM0 - JM1-2 - JM4-3 - JM4 - JM5 - YB然后启动 MoveIt,就能用:
- MoveGroup
- Python API
- RViz 拖动
- C++ 代码
全部都能控制机械臂运动!
四、总结(超级简单)
你的joint_trajectory_controller运动方法只有 1 条:
向 Action /arm_controller/follow_joint_trajectory 发送轨迹 → 机械臂就会运动
三种使用方式:
- 命令行快速测试
- Python 代码直接控制
- MoveIt 高级规划(通过 simple_controller_manager)