一、.ROS中的控制器插件
1.ros_control是什么?
1)为开发者提供的机器人控制中间件;
2)包含一系列控制器接口、传动装置接口、硬件接口、控制器工具等;
3)可以帮助机器人应用功能包快速落地。
控制器管理:提供一种通用的借口来管理不同的控制器
控制器:读取硬件状态,发布控制指令,完成每个joint的控制
硬件资源:为上下两层提供硬件资源的接口
机器人硬件抽象:机器人硬件抽象和硬件资源直接打交道,通过write和reaf方法完成硬件操作
真实机器人:执行接收到的命令
2.控制器(Controllers):
joint_state_controller:监控机器人状态
joint_effort_controller
joint_position_controller:最常用!
joint_velocity_controller
二、完善机器人模型
1)为Link添加惯性参数和碰撞属性(注意物理参数,这里将质量设置的很小,惯性设置的较大,让我们仿真稳定)
2)为joint添加传动装置
3)添加gazebo控制器插件
启动:可能会出现PID增益不存在的报错,需要修改参数配置的形式
roslaunch probot_gazebo probot_anno_gazebo_world.launch
三、构建MoveIt!+Gazebo仿真
划重点!!!
Joint Trajectory Controller :
接收action发来的trajecotry轨迹,并完成每个轴的插补运算,让每个轴动起来
1)参数配置,配置控制器arm_joint_conotroller的类型、关节、增益等参数
probot_anno:
arm_joint_controller:
type: "position_controllers/JointTrajectoryController"
joints:
- joint_1
- joint_2
- joint_3
- joint_4
- joint_5
- joint_6
gains:
joint_1: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint_2: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint_3: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint_4: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint_5: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint_6: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
2)控制器启动,probot_anno_trajectory_controller.launch,启动了一个arm_joint_controller控制器
<launch>
<rosparam file="$(find probot_gazebo)/config/probot_anno_trajectory_control.yaml" command="load"/>
<node name="arm_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
output="screen" ns="/probot_anno" args="arm_joint_controller"/>
</launch>
插补运算提供了三种算法(默认使用五次样条):
1)线性样条:位置连续、速度、加速度不连续
2)三次样条:位置和速度连续,加速度不连续
3)五次样条:位置、速度、加速度都连续
Joint State Controller:
监控关节实时状态
1)参数配置,设置发布频率50hz,即20ms一次
probot_anno:
# Publish all joint states -----------------------------------
joint_state_controller:
type: joint_state_controller/JointStateController
publish_rate: 50
2)控制器启动,probot_anno_gazebo_states.launch,与上面的类似
<launch>
<!-- 将关节控制器的配置参数加载到参数服务器中 -->
<rosparam file="$(find probot_gazebo)/config/probot_anno_gazebo_joint_states.yaml" command="load"/>
<node name="joint_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
output="screen" ns="/probot_anno" args="joint_state_controller" />
<!-- 运行robot_state_publisher节点,发布tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
respawn="false" output="screen">
<remap from="/joint_states" to="/probot_anno/joint_states" />
</node>
</launch>
注意区分joint_state_publisher和robot_state_publisher
Follow Joint Trajectory
封装trajectory成action,并发出去
1)参数配置,注意这个文件是在MoveIt!中的probot_annp_moveit_config功能包中,这个文件将会被probot_anno_moveit_controller_manager.launch加载,启动时会自动启动这个controller
controller_manager_ns: controller_manager
controller_list:
- name: probot_anno/arm_joint_controller
action_ns: follow_joint_trajectory
type: FollowJointTrajectory
default: true
joints:
- joint_1
- joint_2
- joint_3
- joint_4
- joint_5
- joint_6
probot_annp_moveit_config功能包中,后缀.xml没有用!
<launch>
<arg name="moveit_controller_manager" default="moveit_simple_controller_manager/MoveItSimpleControllerManager"/>
<param name="moveit_controller_manager" value="$(arg moveit_controller_manager)"/>
<!-- gazebo Controller -->
<rosparam file="$(find probot_anno_moveit_config)/config/controllers_gazebo.yaml"/>
</launch>
最终的launch文件:
<launch>
<!-- Launch Gazebo -->
<include file="$(find probot_gazebo)/launch/probot_anno/probot_anno_gazebo_world.launch" />
<!-- ros_control arm launch file -->
<include file="$(find probot_gazebo)/launch/probot_anno/probot_anno_gazebo_states.launch" />
<!-- ros_control trajectory control dof arm launch file -->
<include file="$(find probot_gazebo)/launch/probot_anno/probot_anno_trajectory_controller.launch" />
<!-- moveit launch file -->
<include file="$(find probot_anno_moveit_config)/launch/moveit_planning_execution.launch" />
</launch>
这边最后调用的moveit_planning_execution.launch包含了很多文件的,需要仔细分析
实际运行:
roslaunch probot_gazebo probot_anno_bringup_moveit.launch
观察trajectory数据:
rostopic echo /probot_anno/arm_joint_controller/follow_joint_trajectory/goal
数据格式为:关节空间的轨迹,可以进行细插补
观察每个关节位置的曲线
rosrun rqt_plot rqt_plot
订阅/probot_anno/joint_states/position[5]
最后,尴尬的是仿真了40几分钟的时候,gazebo中的机械臂翻了,应该是重力的影响,可以尝试把底座固定在地面上,添加一个固定关节。