目录
1. JointTrajectoryController 是什么?
2. FollowJointTrajectory 是什么?
3. 它们如何配合?
4. 在配置文件中怎么看?
5. 运行时如何查看 Action?
6. 总结
在学习 ROS 2 控制机械臂时,我遇到了两个容易混淆的名字:
joint_trajectory_controller/JointTrajectoryController control_msgs/action/FollowJointTrajectory
它们看起来都和关节轨迹有关,但实际上一个是控制器插件,另一个是Action 接口。
先用一句话总结:
JointTrajectoryController 是执行者,FollowJointTrajectory 是它接收轨迹任务的 Action 接口。
1. JointTrajectoryController 是什么?
JointTrajectoryController 是 ros2_control 提供的控制器。它接收一组关节轨迹,并让对应关节按照轨迹运动。
例如,机械臂有多个关节,可以给它一组目标:
2 秒后: arm_1_joint 到 0.3 rad arm_2_joint 到 -0.5 rad arm_3_joint 到 0.8 rad
控制器会根据轨迹中的关节名称、目标位置和时间信息,生成关节命令并交给底层硬件接口。
在仿真中,底层接口连接 Gazebo 的关节;在真实机器人上,底层接口则连接实际硬件驱动。
2. FollowJointTrajectory 是什么?
FollowJointTrajectory 是一个 ROS 2 Action 类型:
control_msgs/action/FollowJointTrajectory
Action 适合耗时任务。客户端发送目标后,可以持续获取执行反馈,也可以取消任务,最后还会收到成功或失败结果。
机械臂执行轨迹通常需要一段时间,所以用 Action 发送和监控轨迹很合适。
3. 它们如何配合?
可以把它们的关系理解成:
MoveIt 或其他客户端 │ │ 发送 FollowJointTrajectory Action 目标 ▼ JointTrajectoryController │ │ 输出关节命令 ▼ ros2_control 硬件接口 │ ▼ Gazebo 仿真关节或真实机械臂
其中:
-
FollowJointTrajectory 定义了客户端和控制器之间如何通信。
-
JointTrajectoryController 接收并执行轨迹。
-
ros2_control 硬件接口负责把控制器命令传到底层。
4. 在配置文件中怎么看?
以机械臂控制器为例,控制器管理器的配置可能是:
controller_manager:
ros__parameters:
arm_controller:
type: joint_trajectory_controller/JointTrajectoryController
表示:加载一个名为 arm_controller 的控制器实例,并使用 JointTrajectoryController 插件。
控制器自己的参数还会指定要控制哪些关节,以及使用什么命令接口:
arm_controller:
ros__parameters:
joints:
– arm_1_joint
– arm_2_joint
– arm_3_joint
command_interfaces:
– position
state_interfaces:
– position
– velocity
配置中的 arm_controller 是实例名称;joint_trajectory_controller/JointTrajectoryController 是插件类型。它们也不是 Action 名称。
5. 运行时如何查看 Action?
控制器启动并激活后,可以用下面的命令查看 Action:
ros2 action list -t
通常会看到类似:
/arm_controller/follow_joint_trajectory
[control_msgs/action/FollowJointTrajectory]
这里:
- /arm_controller/follow_joint_trajectory 是 Action 名称。
- control_msgs/action/FollowJointTrajectory 是 Action 类型。
- arm_controller 是控制器实例名称。
6. 总结
理解这两个名字时,记住它们所在的层次:
JointTrajectoryController:负责执行轨迹的控制器插件
FollowJointTrajectory:客户端向控制器发送轨迹任务的 Action 接口
所以它们不是两个互相竞争的控制器,而是执行者与通信接口的关系。 MoveIt 规划出机械臂轨迹后,可以通过 FollowJointTrajectory 把轨迹交给 JointTrajectoryController 执行。
网硕互联帮助中心





评论前必须登录!
注册