AI+智能服务机器人应用基础
**作者:韩海霆
前言
欢迎使用 Markdown编辑器
你好!这是我学习如何使用 Markdown编辑器 来编写我的一个学习笔记和完成我的学习报告作业,通过 Markdown编辑器 所展示的页面让老师和大家更好阅读我的学习报告。、
欢迎使用 VMware Workstation
这是在我的机器人专业课洪老师作业要求下第N+1使用 VMware Workstation虚拟机 搭建乌班图ROS系统。如果你想学习如何使用 VMware Workstation 虚拟机安装并且使用乌班图+ROS, 可以仔细阅读这篇文章,了解一下 我的第N+1次的ROS安装和学习《AI+智能服务机器人应用基础》【个人笔记】的基本知识和有关基于树莓派的机器人多功能搭建的一个理论学习和实操操作,仅供大家参考,我们一起学习交流。
VMware Workstation创建新的虚拟机
VMware Workstation安装和创建新的虚拟机在很多平台有很多博主对 VMware Workstation 安装和创建新的虚拟机的过程简单、不繁琐;同时在博客上也有比较详细的教程,在本文章就推荐个人认为比较好的博客给予大家参考,在这里就不详细描述:
过程遇到问题,解决如下:
- VMware Workstation密钥问题 :在网上搜VMware Workstation密钥有很多都尝试直至破解成功就行;
- 乌班图有三大版本 乌班图版本选择版本 根据个人需求选择各自需要的版本;
AI+智能服务机器人应用基础
一、服务机器人整体认识
随着科学技术的发展,机器人技术和人工智能技术的日益成熟,人们不仅仅希望机器人能够在工厂之中完成固定、重复的劳作,还希望机器人能够机器人能够在日常生活之中为人类提供便利,“服务机器人”的概念出现在我们的视野之中。
服务机器人的认识是学习服务机器人的基础部分,对服务机器人的定义、发展、分类、应用、机械构成、控制方式、编程方式的了解,在应用服务机器人具有重要作用。
(未完成,待更新)
二、ROS 机器人操作系统的认识
ROS (Robot Operating System)即机器人操作系统,是如今最流行的机器人软件架构,它包含了大量工具软件、库代码和约定协议,为机器人研究提供了代码复用的支持将搭建和控制机器人的难度大幅地降低。本项目中,我们将会学习使用ROS机器人操作系统的基本命令,操作PC(个人计算机)通过网络远程登录Castle-X机器人并学习ROS机器人操作系统的核心——“通信机制”。
项目1、小海龟
任务1 创建 ROS 工作空间与功能包
(未完成,待更新)
任务2 使用 launch 文件启动节点
调用ROS的小海龟
代码如下:
启动ROS Master
roscore
启动小海龟仿真
rosrun turtlesim turtlesim_node
启动海龟控制节点
rosrun turtlesim turtle_teleop_key
流程图片:
效果展示:
结论:
- launch(文件格式):以一种特殊的XML(标记语言)格式编写,可以同时运行多个nodes(节点)的文件。
- 本节没什么难度,傻瓜式跟着操作就行
三、ROS通信架构
ROS核心概念:节点
在ROS的世界里,最小的进程单元就是节点(node)。一个软件包里可以有多个可执行文件,可执行文件在运行之后就成了一个进程(process),这个进程在ROS中就叫做节点。
从程序角度来说,node就是一个可执行文件(通常为C++编译生成的可执行文件、Python脚本) 被执行,加载到了内存之中;
从功能角度来说,通常一个node负责者机器人的某一个单独的功能。
由于机器人的功能模块非常复杂,我们往往不会把所有功能都集中到一个node上,而会采用分布式的方式,把鸡蛋放到不同的篮子里。例如有一个node来控制底盘轮子的运动,有一个node驱动摄像头获取图像,有一个node驱动激光雷达,有一个node根据传感器信息进行路径规划……这样做可以降低程序发生崩溃的可能性,试想一下如果把所有功能都写到一个程序中,模块间的通信、异常处理将会很麻烦。
四、 ROS通信方式
本实验主要学习ROS(机器人操作系统)的核心通信机制
话题机制,介绍了话题通信机制的模型和通信流程,并且学习了使用 python语言(面向对象的解释型计算机程序设计语言)编写最基本的发布者和订阅者节点来实现话题通信机制。
项目1、使用话题机制实现节点间通信
任务1 创建一个话题的步骤(订阅者)
任务要求:
订阅者节点名称:std学号
订阅的话题名:/turtle/pose
消息的数据类型:turtlesim::Pose
特殊要求:
收到订阅的消息后,将消息打印出来,并保留2位小数
订阅的话题名为/turtle/pose并观察现象和分析
-1. 进入communication_tutorials/scripts(路径)目录。新建一个终端,输入以下命令
-2. 创建监听器文件并赋予权限。在之前的终端中依次输入以下命令
-3. 在之前的终端输入以下命令,添加下面的代码到新建 demo1.py
流程展示(附代码)①
>②
>③
#### 终端指令
$ roscd communication_tutorials/scripts
$ touch demo1.py
$ chmod +x demo1.py
$ gedit demo1.py
# demo1.py 代码内容如下:
#!/usr/bin/env python
#coding:utf-8
import rospy
from turtlesim.msg import Pose
def poseCallback(msg):
rospy.loginfo("Turtle pose: x:%0.6f, y:%0.6f", msg.x, msg.y)
def pose_subscriber():
rospy.init_node('pose_subscriner', anonymous=True)
rospy.Subscriber("/turtle1/pose", Pose, poseCallback)
rospy.spin()
if __name__ == "__main__":
pose_subscriber()
任务2 创建一个话题的步骤(发布者)
发布者编程要求:
发布者节点名称:std学号
发布者的话题名:/turtle1/cmd_vel
消息的数据类型:geometry_msgs::Twist
特殊要求:控制小乌龟走四边形轨迹
-1. 进入自己的工作空间 castle_ws 下的 src 文件
我的工作空间为 hht_ws
-2. 创建新的功能包这里我的功能包命名为 project_turtorials
-3. 创建 scripts 文件夹并且进入此文件夹
-4. 创建消息发布者demo0.py
并赋予权限
-5. 在终端输入$ gedit demo0.py
,添加代码到新建的 demo0.py(文件名称)
流程展示(附demo0.py代码)
①
> ②
③
④
#### 终端指令
$ cd ~/castle_ws/src
$ catkin_crete_pkg project_tutorials std_msgs rospy roscpp
$ roscd project_tutorials
$ mkdir scripts
$ cd scripts
$ touch talker.py
$ chomd +x demo0.py
# demo0.py 代码内容如下:
#!/usr/bin/env python
#coding:utf-8
# license removed for brevity
import rospy
import time
from geometry_msgs.msg import Twist
turn = True
def std2024060135():
global turn
rospy.init_node('std2024060135', anonymous=True)
turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)
rate = rospy.Rate(1)
while not rospy.is_shutdown():
vel_msg = Twist()
if turn:
vel_msg.linear.x = 1.0
vel_msg.angular.z = 0.0
turn = False
else:
vel_msg.linear.x = 0.0
vel_msg.angular.z = 1*3.14/2
turn = True
turtle_vel_pub.publish(vel_msg)
rospy.loginfo("Publish turtle velocity command[%0.2f m/s,%0.2f rad/s]",vel_msg.linear.x, vel_msg.angular.z)
rate.sleep()
# while not rospy.is_shutdown():
# vel_msg = Twist()
# vel_msg.linear.x = 1
# vel_msg.linear.y = 0
# vel_msg.linear.z = 0
# vel_msg.angular.x = 0
# vel_msg.angular.y = 0
# vel_msg.angular.z = 0
# turn = False
# time.sleep(0.5)
# vel_msg.linear.x = 0
# vel_msg.linear.y = 1
# vel_msg.linear.z = 0
# vel_msg.angular.x = 0
# vel_msg.angular.y = 0
# vel_msg.angular.z = 0
# time.sleep(0.5)
# turtle_vel_pub.publish(vel_msg)
# rospy.loginfo("Publish turtle velocity command[%0.2f m/s,%0.2f rad/s]",vel_msg.linear.x, vel_msg.linear.y)
# rate.sleep()
#while not rospy.is_shutdown():
# vel_msg = Twist()
# vel = Counter()
# vel_msg.linear.x = 1
# turtle_vel_pub.publish(vel_msg)
# rospy.loginfo("Publish turtle velocity command[%0.2f m/s,%0.2f rad/s]",vel_msg.linear.x, vel_msg.linear.y)
# rate.sleep()
if __name__ == '__main__':
try:
std2024060135()
except rospy.ROSInterruptException:
pass
我的的小结
这里我是用python代码是因为python没有像C++那样多出很多编译操作和BUG
demo0代码中 >rate = rospy.Rate(1)< 这里Rate是乌龟的运动频率,当我把频率设置为5的时候,小乌龟走出的形状是圆形的
任务要求小乌龟走的是正方形,我这里定义一个真假值,然后用判断语句去执行相应步骤。在这里我认为还有其他方法,比如可以用for循环让小乌龟执行每一步骤后停止换方向再执行前进等
五、 ROS通信架构
服务通信
前面我们介绍了ROS的通信方式中的topic(主题)通信,我们知道topic是ROS中的一种单向的异步通信方式。然而有些时候单向的通信满足不了通信要求,比如当一些节点只是临时而非周期性的需要某些数据,如果用topic通信方式时就会消耗大量不必要的系统资源,造成系统的低效率高功耗。
service方式在通信模型上与topic做了区别。Service通信是双向的,它不仅可以发送消息,同时还会有反馈。所以service包括两部分,一部分是请求方(Clinet),另一部分是应答方/服务提供方(Server)。
请求方(Client)会发送一个request,要等待server处理,反馈回一个reply,这样通过类似“请求-应答”的机制完成整个服务通信。
项目1、客户端Client的编程实现
任务1 创建一个客户端
客户端编程要求:
客户端节点名称:std学号
特殊要求:运行后随机位置出现小乌龟,并每隔2秒出现1只小乌龟,超过5只后停止;
提示:
如何实现一个客户端
- 初始化ROS节点;
- 创建一个 Cilent 实例;
- 发布服务请求数据;
- 等待 Server 处理之后的应答结果。
#!/usr/bin/env python
import sys
import rospy
from turtlesim.srv import Spawn
def turtle_spawn():
rospy.init_node('turtle_spawn')
#发现 /spawn 服务后创建一个服务客户端,连接名为 /spawn 的 service
rospy.wait_for_service('/spawn')
try:
add_turtle = rospy.ServiceProxy('/spawn', Spawn)
#请求服务调用,输入请求数据
response = add_turtle(2.0, 2.0, 0.0, "turtle2")
return response.name
except rospy.ServiceException, e:
print"Service call failed: %s"%e
if __name__ == "__main__":
#服务端用并显示调用结果
print"Spwan turtle successfully [name:%s]"%(turtle_spawn())
任务2 创建一个服务端
代码如下:
参数服务器
参数服务器,作为ROS中另外一种数据传输方式,有别于topic和service,它更加的静态。参数服务器维护着一个数据字典,字典里存储着各种参数和配置。
action主要弥补了service通信的一个不足,就是当机器人执行一个长时间的任务时,假如利用service通信方式,那么client会很长时间接受不到反馈的reply,致使通信受阻。当service通信不能很好的完成任务时候,action则可以比较适合实现长时间的通信过程,action通信过程可以随时被查看过程进度,也可以终止请求,这样的一个特性,使得它在一些特别的机制中拥有很高的效率。
任务3 参数的使用与编程方法
任务要求如下:
从课件的第12页开始,完成程序功能编写。
发挥主观能动性,遇到问题分析、查找资料并解决
最终完成一份实验报告。
尝试改变小乌龟仿真器的背景颜色。
六、机器人的坐标系统
机器人的坐标变换一直以来是机器人学的一个难点,我们人类在进行一个简单的动作时,从思考到实施行动再到完成动作可能仅仅需要几秒钟,但是机器人来讲就需要大量的计算和坐标转换。
认识TF
TF是一个ROS世界里的一个基本的也是很重要的概念,所谓TF(TransForm),就是坐标转换。在现实生活中,我们做出各种行为模式都可以在很短的时间里完成,比如拿起身边的物品,但是在机器人的世界里,则远远没有那么简单。
当机器人的"眼睛"获取一组数据,关于物体的坐标方位,但 是相对于机器人手臂来说,这个坐标只是相对于机器人头部的传感器,并不直接适用于机器 人手臂执行,那么物体相对于头部和手臂之间的坐标转换,就是TF。
坐标变换包括了位置和姿态两个方面的变换,ROS中的tf是一个可以让用户随时记录多个坐标系的软件包。tf保持缓存的树形结构中的坐标系之间的关系,并且允许用户在任何期望的时间
点在任何两个坐标系之间转换点,矢量等
项目1、TF广播与监听的编程实现
**实操作业要求如下:**
参考课件第17~22页,完成TF广播与监听的程序功能编写。
理解turtle1向turtle2坐标转换所使用的函数是何意义,并在代码附近添加注释
(后续补充)
七、机器人模型搭建
URDF基础
URDF介绍
URDF:即 Unified Robot Description Format, 为统一的机器人描述格式,是 ROS(机器人操作系统) 中一个非常重要的机器人模型描述格式。ROS 可以解析 文件中使用 XML(标记语音) 格式描述的机器人模型,同时提供 URDF(模型 格式) 文件的 C++(计算机程序设计) 解析器。
获取机器人URDF模型文件的途径通常有
-自己写
-机器人制造商提供其机器人的URDF模型
-通过机械设计软件导出URDF文件
项目1、制作URDF模型
任务1 添加基本模型
我们以构建一个小车为例子,为大家讲解这部分的内容:(相关的示例代码可以从urdf_demo中找到)
首先构建base_link作为小车的父坐标系,然后在base_link基础上,再构建左轮,右轮 和雷达 link. 最后不同的link之间通过joint来连接。参考代码如下:
<robot name='mycar'>
<link name="base_link"/>
<link name="right" />
<link name="left"/>
<link name="rplidar" />
<joint name="right_joint" type="continuous ">
<parent link="base_link" />
<child link="right" />
</joint>
<joint name="letf_joint" type="continuous ">
<parent link="base_link"/>
<child link="left"7>
</joint>
<joint name="rplidar_joint" type="fixed">
<parent link="base_iink"/>
<child link=" rplidar/>
</robot>
首先将urdf_demo功能包拷贝到~/catkin_ws/src/目录下
随后进入工作空间进行编译:
cd ~/catkin_ws
catkin_make
随后打开新的终端,输入
roslaunch urdf_demo display_urdf_link_joint.launch
回车之后, 发现所有的link和joint都在一起了
任务2 添加机器人link之间的相对位置关系
在基础模型之上,我们需要为机器人之间link来设相对坐标位置和旋转方向的关系,URDF中通过来描述这种关系。
随后打开新的终端,输入命令
roslaunch urdf_demo display_urdf_link_position.launch
回车之后,发现所有的link和joint已经有在固定的位置上了
任务3 添加模型的尺寸,形状和颜色等添加模型的尺寸,形状和颜色等
在已经设置好模型的link基础上,添加模型的形状(例如圆柱或长方体),相对于link的位置,颜色等。其中形状用来描述,颜色用来描述。
尝试修改描述的内容,为小车底盘绘制成圆柱形cylinder;
尝试修改描述的内容,将小车底盘绘制成红色。
任务4 显示URDF模型
想要在rviz中显示出我们制作好的小车的URDF模型,可以写一个launch文件,参考如下:
效果如下:
项目2、制作xacro模型
(略)
项目3、 制作gazebo模型
(略)
项目4、小乌龟的运动控制
(略)
项目5、机器人的运动控制
(略)
项目6、实操练习
综上模块学习,以下为实操过程展示:
- ①ROS为用户提供了一个检查URDF语法的工具:
- ②Tab键补全:
- ③执行检查:
- ④首先将urdf_demo功能包拷贝到~/catkin_ws/src/目录下:
- ⑤随后进入工作空间进行编译:
⑥cd ~/catkin_ws:
⑦catkin_make:
- ⑧在终端输
roslaunch urdf_demo display_urdf_link_joint.launch
- ⑨但是会跳出错误
- **`把这里面文档中这句话全部删除,再重新运行
roslaunch urdf_demo display_urdf_link_joint.launch
随后打开新的终端,输入命令
$ roslaunch urdf_demo display_urdf_link_position.launch
回车之后,发现所有的link和joint已经有在固定的位置上了
想要在rviz中显示出我们制作好的小车的URDF模型,可以写一个launch文件,参考如下
打开终端输入
$roslaunch urdf_demo display_urdf_color_geometry.launch
效果如下:
另外,我们可以输入
$ rosrun rqt_tf_tree rqt_tf_tree
可以看到以下tf 树:
rosrun turtlesim turtlesim_node
- 打开新的终端,输入
roslaunch urdf_demo display_xacro.launch
,回车之后,发现所有的link和joint已经有在固定的位置上了,并且小车颜色和形状已经固定完成。
- 打开新终端,输入
- 查看话题与节点的拓扑图