机器人的定义与组成
机器人是什么?
- 1920年捷克斯洛伐克作家卡雷尔·查佩克在他的科幻小说《罗萨姆的机器人万能公司》中,根据Robota(捷克文,原意为“劳役”、苦工)和Robotnik(波兰文,愿意为“工人”),创造出“机器人”这个词
- 机器人(Robot)是自动执行工作的机器人装置。它既可以接受人类指挥,又可以运行预先编排的程序,也可以根据以人工智能技术制定的原则纲领行动。它的任务是协助或取代人类工作,例如生产业,建筑业,或是危险的生产(来自百度百科)
- 机器人是用以搬运材料、零件、工具的可编程的多功能操作器或是通过可改变程序动作来完成各种作业的特殊机械装置(来自美国机器人协会)
- 国际化标准(ISO)
- 机器人的动作机构具有类似于人类或其它生物体的某些器官(肢体、感受等)的功能
- 机器人具有通用性,工作种类多样,动作程序灵活易变
- 机器人具有不同程度的智能性,如记忆、感知、推理、决策、学习等
- 机器人具有独立性,完整的机器人系统在工作中可以不依赖于人的干预
机器人是如何组成的?
机器人的组成(控制角度)
- 执行机构:人体的手和脚,直接面向工作对象的机械装置
- 驱动系统:人体的肌肉和筋络,负责驱动执行机构,将控制系统下达的命令转换成执行机构需要的信号
- 传感系统:人体的感官和神经,主要完成信号的输入和反馈,包括内部传感系统和外部传感系统
- 控制系统:人体的大脑,实现任务及信息的处理,输出控制命令信号
机器人的控制回路
机器人系统构建
- 执行机构实现
- 驱动系统实现
- 内部传感系统实现
- 控制系统实现
- 外部传感系统实现
一个简单的服务机器人架构
执行机构实现
驱动系统实现
- 电源管理
- 5V供电;12V供电
- 电机驱动
- 电机控制接口
- 电机反馈接口
- 传感器采集
- 红外传感器
- 超声波传感器
- 防撞传感器
内部传感系统实现
- 根据单位时间内产生的脉冲数计算电机/轮子的旋转圈数
- 根据轮子的周长计算机器人的运动速度
- 根据运动速度积分计算里程
- 左图是惯性测量单元(IMU),右图是IMU实现原理
- 测量物体姿态和速度:包括
- 陀螺仪(测量角速度)加速度计(测量加速度)
- 地磁计(测量方向)
控制系统实现
常见控制器
外部传感系统构建
ROS规定了一系列常用传感器的消息格式。这些传感器发布的数据,都必须按照这样的消息格式进行发布
-
RGB相机
查看消息类型具体包含的内容:rosmsg show sensor_msgs/Image
-
RGBD相机
- 既能够提供rgb信息也能够提供点云深度信息
- ROS用
sensor_msgs/PointCloud2
来描述N维点云信息 - 查看消息类型具体包含的内容:
rosmsg show sensor_msgs/PointCloud2
-
IMU
- ROS用
sensor_msgs/Imu
来描述imu传感器的信息 - 查看消息类型具体包含的内容:
rosmsg show sensor_msgs/Imu
- ROS用
-
GPS
- ROS用
sensor_msgs/NavSatFix
来描述gps的定位信息 - 查看消息类型具体包含的内容:
rosmsg show sensor_msgs/NavSatFix
- ROS用
-
雷达
- ROS用
sensor_msgs/LaserScan
来描述二维激光雷达信息 - 查看消息类型具体包含的内容:
rosmsg show sensor_msgs/LaserScan
- ROS用
-
测距传感器
- ROS用
sensor_msgs/Range
测距传感器的信息包括(超声波,红外) - 查看消息类型具体包含的内容:
rosmsg show sensor_msgs/Range
- ROS用
完整示例
urdf机器人建模
urdf是什么?
- Unified Robot Description Format,统一机器人描述格式,简称为URDF
- URDF是ROS中一个非常重要的机器人模型描述格式,它使用XML格式描述机器人模型
- URDF中定义机器人各个部件的几何形状,物理特性以及部件之间的连接关系
- ROS同时也提供URDF文件的C++解析器
- 如下所示:
URDF描述文件通常由以下几个描述标签组成
<link>
用于描述机器人某个刚体部分的外观和物理属性,包括- 尺寸(size)
- 颜色(color)
- 形状(shap)
- 惯性矩阵(inertial matrix)
- 碰撞参数(collision properties)
<visual>
标签用于描述机器人link部分的外观参数<inertial>
标签用于描述link的惯性参数,<collision>
标签用于描述link的碰撞属性- 由图中可以看出
collision
的区域要大于visual
的区域,这就意味着只要有其它物体与collision
区域相交,就认为link
发生碰撞
<joint>
(关节)- 描述机器人关节的运动学与动力学属性
- 包括关节运动的位置和速度限制
- 根据关节运动形式,可以将其分为六种类型
<calibration>
:关节的参考位置,用来校准关节的绝对位置<dynamics>
:描述关节的物理属性,例如阻尼值、物理静摩擦力等,经常在动力学仿真中用到<limit>
:描述运动的一些极限值,包括关节运动的上下限位置、速度限制、力矩限制等<mimic>
:描述该关节与已有关节的关系<safety_controller>
:描述安全控制器参数
<robot>
- 完整机器人模型的最顶层标签
<link>
和<joint>
标签都必须包含在<robot>
标签内- 一个完整的机器人模型由一系列的
link
和joint
组成
操作小记
进入工作空间的src
目录下,然后创建功能包mbot_description
cd ~/ros_workspace/src
catkin_create_pkg mbot_description urdf xacro
在功能包中创建几个文件夹
- urdf:存放机器人模型的URDF或xacro文件
- meshes:放置URDF中引用的模型渲染文件
- launch:保存相关启动文件
- config:保存rviz的配置文件
在launch文件夹下创建文件display_mbot_base_urdf.launch,并写入代码
<launch>
<param name="robot_description" textfile="$(find mbot_description)/urdf/mbot_base.urdf" />
<!-- 设置GUI参数,显示关节控制插件 -->
<param name="use_gui" value="true"/>
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<!-- 运行robot_state_publisher节点,发布tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<!-- 运行rviz可视化界面 -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" />
</launch>
joint_state_publisher
:发布每个joint
(除fixed
类型)的状态,而且可以通过UI界面对joint
进行控制robot_state_publisher
:将机器人各个links
、joints
之间的关系,通过TF的形式,整理成三维姿态信息发布
在urdf文件夹下创建mbot文件夹,并在mbot文件夹下创建文件mbot_base.urdf,并写入代码,创建一个圆柱体
<?xml version="1.0" ?>
<robot name="mbot">
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
<material name="yellow">
<color rgba="1 0.4 0 1"/>
</material>
</visual>
</link>
</robot>
输入roslaunch mbot_description display_mbot_base_urdf.launch
,查看效果
修改mbot_base.urdf文件,使用圆柱体创建左侧车轮
<?xml version="1.0" ?>
<robot name="mbot">
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
<material name="yellow">
<color rgba="1 0.4 0 1"/>
</material>
</visual>
</link>
<joint name="left_wheel_joint" type="continuous">
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="left_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
</robot>
输入roslaunch mbot_description display_mbot_base_urdf.launch
,查看效果
修改mbot_base.urdf文件,使用圆柱体创建右侧车轮
<?xml version="1.0" ?>
<robot name="mbot">
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
<material name="yellow">
<color rgba="1 0.4 0 1"/>
</material>
</visual>
</link>
<joint name="left_wheel_joint" type="continuous">
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="left_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
<joint name="right_wheel_joint" type="continuous">
<origin xyz="0 -0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="right_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="right_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
</robot>
输入roslaunch mbot_description display_mbot_base_urdf.launch
,查看效果
修改mbot_base.urdf文件,使用球体创建前后支撑轮
<?xml version="1.0" ?>
<robot name="mbot">
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder length="0.16" radius="0.20"/>
</geometry>
<material name="yellow">
<color rgba="1 0.4 0 1"/>
</material>
</visual>
</link>
<joint name="left_wheel_joint" type="continuous">
<origin xyz="0 0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="left_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="left_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
<joint name="right_wheel_joint" type="continuous">
<origin xyz="0 -0.19 -0.05" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="right_wheel_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="right_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0" />
<geometry>
<cylinder radius="0.06" length = "0.025"/>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"/>
</material>
</visual>
</link>
<joint name="front_caster_joint" type="continuous">
<origin xyz="0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="front_caster_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="front_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
<material name="black">
<color rgba="0 0 0 0.95"/>
</material>
</visual>
</link>
<joint name="back_caster_joint" type="continuous">
<origin xyz="-0.18 0 -0.095" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="back_caster_link"/>
<axis xyz="0 1 0"/>
</joint>
<link name="back_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<sphere radius="0.015" />
</geometry>
<material name="black">
<color rgba="0 0 0 0.95"/>
</material>
</visual>
</link>
</robot>
输入roslaunch mbot_description display_mbot_base_urdf.launch
,查看效果