系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
TODO:写完再整理
文章目录
前言
认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对ROS的ros_control控制中间件做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章
提示:以下是本篇文章正文内容
一、ros_control目的
用于仿真机器人和真实机器人连接的控制中间件,机器人仿真和真实环境区别是差了一个ros_control的功能包连接的区别
1、为开发者提供上层应用功能包和底层硬件的的控制连接的中间件【防盗标记–盒子君hzj】
2、包含一系列的控制接口、传动接口、硬件接口、控制器工具箱等等
方法一:使用ros_control功能包的接口(读写,write,read)
方法二:自己实现一个controller(其实不难的)【1、先关注moveit输出给我们什么信息(已经计算好的action信息,如速度,位置,加速度等)2、设计controller,使通讯驱动能达到action的要求,如插补的位置输出】
二、ros_control架构
ros_control其实是gazebo仿真中的一个插件
1、控制器管理器
作用:提供一种通用的接口来管理不同的控制器【防盗标记–盒子君hzj】
例子:有点像ros master
2、控制器
作用:读取硬件状态,,经过处理(PID算法等)发布控制指令,完成机械臂的每个关节的控制
例子
(1)力控制器:joint_effort_controller
(2)位置控制器:joint_position_controller
(3)速度控制器:joint_velocity_controller
(4)状态控制器:joint_state_controller
3、硬件抽象层
作用:机器人硬件抽象层和硬件资源直接打交道,通过write和read方法完成硬件操作【防盗标记–盒子君hzj】
4、硬件资源
作用
为上下两层的指令做连接接口(做上层的控制指令接口,接受到信息后,做下层的控制接口)
例子
用于连接摄像头、激光雷达,遥控器等传感器
使用USB、CAN等通讯接口和硬件资源层通讯
5、真实机器人的执行器
作用
执行受到的命令
三、ros_control的Gazebo运动控制实现流程
1.gazebo 已经实现了 ros_control 的相关接口
2.在已经创建完毕的机器人模型,编写一个单独的 xacro 文件,为机器人模型添加传动装置以及控制器
<robot name="my_car_move" xmlns:xacro="http://wiki.ros.org/xacro">
<!-- 传动实现:用于连接控制器与关节 -->
<xacro:macro name="joint_trans" params="joint_name">
<!-- Transmission is important to link the joints and the controller -->
<transmission name="${joint_name}_trans">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${joint_name}">
<hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
</joint>
<actuator name="${joint_name}_motor">
<hardwareInterface>hardware_interface/VelocityJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
</xacro:macro>
<!-- 每一个驱动轮都需要配置传动装置 -->
<xacro:joint_trans joint_name="left_wheel2base_link" />
<xacro:joint_trans joint_name="right_wheel2base_link" />
<!-- 控制器 -->
<gazebo>
<plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">
<rosDebugLevel>Debug</rosDebugLevel>
<publishWheelTF>true</publishWheelTF>
<robotNamespace>/</robotNamespace>
<publishTf>1</publishTf>
<publishWheelJointState>true</publishWheelJointState>
<alwaysOn>true</alwaysOn>
<updateRate>100.0</updateRate>
<legacyMode>true</legacyMode>
<leftJoint>left_wheel2base_link</leftJoint> <!-- 左轮 -->
<rightJoint>right_wheel2base_link</rightJoint> <!-- 右轮 -->
<wheelSeparation>${base_link_radius * 2}</wheelSeparation> <!-- 车轮间距 -->
<wheelDiameter>${wheel_radius * 2}</wheelDiameter> <!-- 车轮直径 -->
<broadcastTF>1</broadcastTF>
<wheelTorque>30</wheelTorque>
<wheelAcceleration>1.8</wheelAcceleration>
<commandTopic>cmd_vel</commandTopic> <!-- 运动控制话题 -->
<odometryFrame>odom</odometryFrame>
<odometryTopic>odom</odometryTopic> <!-- 里程计话题 -->
<robotBaseFrame>base_footprint</robotBaseFrame> <!-- 根坐标系 -->
</plugin>
</gazebo>
</robot>
3.将此文件集成进xacro文件
<!-- 组合小车底盘与摄像头 -->
<robot name="my_car_camera" xmlns:xacro="http://wiki.ros.org/xacro">
<xacro:include filename="my_head.urdf.xacro" />
<xacro:include filename="my_base.urdf.xacro" />
<xacro:include filename="my_camera.urdf.xacro" />
<xacro:include filename="my_laser.urdf.xacro" />
<xacro:include filename="move.urdf.xacro" />
</robot>
4.启动 Gazebo 并发布 /cmd_vel 消息控制机器人运动
<launch>
<!-- 将 Urdf 文件的内容加载到参数服务器 -->
<param name="robot_description" command="$(find xacro)/xacro $(find demo02_urdf_gazebo)/urdf/xacro/my_base_camera_laser.urdf.xacro" />
<!-- 启动 gazebo -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find demo02_urdf_gazebo)/worlds/hello.world" />
</include>
<!-- 在 gazebo 中显示机器人模型 -->
<node pkg="gazebo_ros" type="spawn_model" name="model" args="-urdf -model mycar -param robot_description" />
</launch>
5.Rviz查看里程计信息
编写launch文件
<launch>
<!-- 启动 rviz -->
<node pkg="rviz" type="rviz" name="rviz" />
<!-- 关节以及机器人状态发布节点 -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />
</launch>
添加rviz组件
【防盗标记–盒子君hzj】