底层包括三个级别:(1)发动机、编码器;(2)发动机控制器和驱动器;(3)驱动程序和pid控制器整合到一起的基控制器。
中间层:movebase级别,路径规划
高层:slam,语义,图像
参考https://blog.csdn.net/ktigerhero3/article/details/65443920
具体操作过程如下:
可知机器人简单控制至少
(1)编辑机器人模型
(2)编辑gazebo属性,加载连接器控制驱动插件
(3)编辑gazebo属性,加载ros控制插件
(4)编辑.launch文件
(5)安装键盘控制器包
(6)运行.launch和键盘控制器程序,让小车动起来。
首先应进行urdf和xacro的相关学习:
参考:https://blog.csdn.net/sunbibei/article/details/52297524
和https://blog.csdn.net/qingdu007/article/details/97780621
进行xacro文件编写:
比较三篇参考博客发现,一个主要不同点就是宏定义的不同,ros控制机器人运动中,仅定义了惯性,而xacro文件编写学习笔记中定义了大段的重复代码,节省了时间。但有一个疑问,就是soloworks的urdf文件中没个link位置不一样,二参考博客中则相同,所以暂时先按参考博客中走。
本文拟将大段重复代码定义,从而节省时间。
修改过程中发现SolidWorks导出的urdf文件中包含:collision,inertial,visual三个部分,而参考博客中ros控制机器人运动中则无inertial。暂时按照有inertial进行修改。
先是定义了宏,然后描述了parent link,最后定义
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro"
xmlns:sensor="http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor"
xmlns:controller="http://playerstage.sourceforge.net/gazebo/xmlschema/#controller"
xmlns:interface="http://playerstage.sourceforge.net/gazebo/xmlschema/#interface"
name="smallrobot_xacro">
<xacro:macro name="default_leg" params="number">
<link name="leg_${number}">
<visual>
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
<geometry>
<mesh
filename="package://smallrobot/meshes/robot.STL"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"
<geometry>
<mesh
filename="package://smallrobot/meshes/robot.STL"/>
</geometry>
</collision>
<inertial>
<mass value="0.006"/>
<inertia ixx="0.0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
</inertial>
</link>
<joint name="r_${number}" type="continuous">
<parent link = "robot"/>
<child link = "leg_${number}"/>
<origin xyz="0 0 0" rpy="0 0 0"/>
<axis xyz="0 1 0"/>
</joint>
</xacro:macro>
<link name="robot">
<visual>
<origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0"/>
<geometry>
<mesh
filename="package://smallrobot/meshes/robot.STL"/>
</geometry>
<material name="gray">
<color rgba="0 0 0 1"/>
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"
<geometry>
<mesh
filename="package://smallrobot/meshes/robot.STL"/>
</geometry>
</collision>
<inertial>
<mass value="0.12793"/>
<inertia ixx="0.0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
</inertial>
</link>
<xacro:default_leg number="1"/>
<xacro:default_leg number="2"/>
<xacro:default_leg number="3"/>
<xacro:default_leg number="4"/>
<xacro:default_leg number="5"/>
<xacro:default_leg number="6"/>
</robot>
<!-- Drive controller -->
<gazebo>
<plugin name="skid_steer_drive_controller" filename="libgazebo_ros_skid_steer_drive.so">
<updateRate>100.0</updateRate>
<robotNamespace></robotNamespace>
<leftfrontjoint>r4</leftFrontJoint>
<rightFrontJoint>r3</rightFrontJoint>
<leftbackJoint>r6</leftbackJoint>
<rightbackJoint>r1</rightbackJoint>
<leftmiddleJoint>r5</leftmiddleJoint>
<rightmiddleJoint>r2</rightmiddleJoint>
<wheelSeparation>4</wheelSeparation>
<wheelDiameter>0.1</wheelDiameter>
<commandTopic>cmd_vel</commandTopic>
<odometryTopic>odom</odometryTopic>
<robotBaseFrame>base_footprint</robotBaseFrame>
<odometryFrame>odom</odometryFrame>
<torque>1</torque>
<topicName>cmd_vel</topicName>
<broadcastTF>1</broadcastTF>
</plugin>
</gazebo>
<!-- ros_control plugin -->
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/robot</robotNamespace>
</plugin>
</gazebo>