这篇笔记主要记录ros_control机制及实现过程,对应下图绿框的部分。
ROS_Control
ros_control是一个功能包,它针对不同机器人类型提供了多种类型的控制器,并由一个conrol manager管理所有关节的控制器。用户通过ros_control可以实现ros上层应用与仿真环境或实际样机的连接。
contorller manager
提供通用接口来管理不同关节类型的控制器。controller manager的输入就是上层应用的输出。
controller
使用PID控制器完成对每个关节的位置/速度/力控制,并读取硬件资源接口的反馈状态,形成闭环控制。
Hardware resource interface
为上下两层提供硬件资源接口。gazebo仿真就用gazebo_ros_control插件,实机控制就通过以太网传输数据。
RobotHW
机器人硬件抽象层,通过读写方式直接与机器人硬件打交道。
控制器(由ros_controller提供)
机械臂用到的控制器包括:
- effort_controllers:控制关节的力或力矩
- joint_effort_controller:输入为力,根据PID转换为力/力矩
- joint_position_controller:输入为位置,根据PID转换为力/力矩
- joint_velocity_contorller:输入为速度,根据PID转换为力/力矩
- joint_state_controller: 发布所有注册在RobotHW上的关节状态,相应话题为/joint_states,消息类型为sensor_msgs/JointState
- position_controllers #直接控制joints的位置
- velocity_vontrollers #直接控制joints的速度
- joint_trajectory_controllers #控制joint的轨迹
- position_contorller
- velocity_controller
- effort_controller
- postion_velocity_controller
- position_velocity_acceleration_controller
Hardware Interface接口(补充第一讲,放在这主要是为了跟控制器对应)
Hardware interface在硬件层面上与ros_controllers中的插件相对应,主要包含:
JointCommandInterface类
- EffortJointInterface类
- PositionJointInterface类
- VelocityJointInterface类
JointStateInterface类
ActuatorStateInterface类
控制器搭建
在搭建好gazebo仿真模型的基础上(具体看第一讲),首先在config文件夹创建yaml配置文件
touch myrobot.yaml
为机械臂的关节配置PID控制器:
mybot:
joint_state_controller:
type: joint_state_controller/JointStateController
publish_rate: 50
# Position Controllers
joint1_position_controller:
type: effort_controllers/JointPositionController
joint: joint1
pid: {p: 100.0, i: 0.01, d: 10.0}
joint2_position_controller:
type: effort_controllers/JointPositionController
joint: joint2
pid: {p: 100.0, i: 0.01, d: 10.0}
<!-- 有几个关节就添加几个controller -->
然后在launch文件中添加:
<launch>
<!-- Load joint controller configurations from YAML file to parameter server -->
<rosparam file="$(find myrobot_gazebo )/config/myrobot.yaml" command="load"/>
<!-- load the controllers -->
<node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
output="screen" ns="myrobot" args="joint1_position_controller joint2_position_controller joint_state_controller"/>
<!-- convert joint states to TF transforms for rviz, etc -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
respawn="false" output="screen">
<remap from="/joint_states" to="/mybot/joint_states" />
</node>
</launch>
注意
- 命名空间要保持一致
- launch文件最好同时加载你之前保存过的rviz文件
- robot_state_publisher接收robot_state_controller发来的话题/joint_states,并发布话题/tf,最终体现为rviz根据gazebo中机械臂的状态随动
测试
cd ~/catkin_ws
catkin_make
roslaunch myrobot_gazebo myrobot_gazebo_world.launch