北邮机器人队2020预备队培训(三) —— ROS基础

前言

本次课程介绍ROS基础,今年的预备队培训也以ROS为主,最后在比赛中结合控制算法完成任务。

ROS是什么

ROS又叫机器人操作系统,ROS提供了一种发布-订阅式的通信框架用以简单、快速地构建分布式计算系。

ROS的三种机制 —— 话题

话题是ROS中最最常用的机制,话题也是ROS设计的高明之处,之前说了ROS是发布订阅的通信框架,这种框架搭建用的就是话题机制。

话题机制就是发布者和接收者的话题的名字相同就可以考虑连接,能否连接成功还需要参照发布者和接收者话题的类型是否一致,如果发布者和接收者都是同一个话题名字并且数据类型相同,那么就建立连接。否则不建立连接。
北邮机器人队2020预备队培训(三) —— ROS基础_第1张图片

话题发布与接收

实现过程

1、创建catkin工作区(这部分不清楚可以在wiki上看详细介绍):

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws
catkin_make
source devel/setup.bash

2、创建basic包

创建basic包依赖于std_msgs和rospy

cd ~/catkin_ws/src
catkin_create_pkg basic std_msgs rospy

进入basic的src目录

cd basic/src

创建并编辑topic_publisher.py文件

touch topic_publisher.py
gedit topic_publisher.py

复制一下代码进去并保存

#!/usr/bin/env python
import roslib; roslib.load_manifest('basic')
import rospy
from std_msgs.msg import Int32
rospy.init_node('topic_publisher')
pub = rospy.Publisher('counter', Int32)
rate = rospy.Rate(2)
count = 0
while not rospy.is_shutdown():
        pub.publish(count)
        count += 1
        rate.sleep()

设置文件执行权限

chmod u+x topic_publisher.py

返回catkin_ws目录并编译

cd ~/catkin_ws
catkin_make

写入环境变量并source环境变量文件使之生效

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

ctrl+alt+t打开新终端启动roscore

roscore

在原来的终端启动写好的发布消息的节点

rosrun basic topic_publisher.py

程序执行情况
北邮机器人队2020预备队培训(三) —— ROS基础_第2张图片
这个警告好像无伤大雅,刚入门百度搜了一些每太看明白怎么解决。
再开一个新终端,用rostopic list打印正在执行的话题

rostopic list

在这里插入图片描述
可以看到我们的节点已经在运行了。
用rostopic echo打印节点的数据

rostopic echo counter -n 5

打印五条消息
北邮机器人队2020预备队培训(三) —— ROS基础_第3张图片
用rostopic来检验他是否按照我们的预期速率发送

rostopic hz counter

北邮机器人队2020预备队培训(三) —— ROS基础_第4张图片
ctrl+c停止打印,用rostopic info查看已经被声明的话题

rostopic info counter

北邮机器人队2020预备队培训(三) —— ROS基础_第5张图片
用rostopic find来查询发布某种类型消息的所有话题

rostopic find std_msgs/Int32

在这里插入图片描述

自定义话题发布与接收

实现过程

先看下basic包的文件结构:

cd ~/catkin_ws/src/basic
ls
tree

北邮机器人队2020预备队培训(三) —— ROS基础_第6张图片
ok下面开始操作
1、创建我们的消息类型,也就是创建Complex.msg文件

cd ~/catkin_ws/src/basic
mkdir msg
cd msg
vi Complex.msg

用vim编辑,先按键盘上的i进入输入模式,输入如下:
北邮机器人队2020预备队培训(三) —— ROS基础_第7张图片
按Esc退出编辑模式,输入":wq"(注:引号内全部内容包括" : "),保存并退出。
2、编辑package.xml文件

cd ..
vi package.xml

2.1、在 rospy std_msgs
在这些build_depend附近加入:

  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

注意:如果是indigo版本的ros,exec_depend需要换成run_depend。
2.2
同上esc退出编辑模式,输入“:wq”保存并退出。
在这里插入图片描述
3、编辑CMakeLists.txt文件

vi CMakeLists.txt

3.1、修改find_package(),加上message_generation:
在这里插入图片描述
3.2修改catkin_package(),加上message_runtime:
北邮机器人队2020预备队培训(三) —— ROS基础_第8张图片
3.3修改add_message_files(),加上Complex.msg:
在这里插入图片描述
3.4修改generate_message(),去掉系统生成时加上的注释:
在这里插入图片描述
4、在basic包的src下添加message_publisher.py和message_subscriber.py文件:

cd src
vi message_publisher.py
vi message_subscriber.py

分别把代码粘贴进去:

message_publisher.py

#!/usr/bin/env python
import roslib; roslib.load_manifest('basic')
import rospy
from basic.msg import Complex

from random import random

rospy.init_node('message_publisher')

pub=rospy.Publisher('complex',Complex)

rate=rospy.Rate(2)

while not rospy.is_shutdown():
	msg=Complex()
	msg.real=random()
	msg.imaginary=random()
	pub.publish(msg)
	rate.sleep()

message_subscriber.py

#!/usr/bin/env python
import roslib; roslib.load_manifest('basic')
import rospy
from basic.msg import Complex

def callback(msg):
	print 'Real:',msg.real
	print 'Imaginary',msg.imaginary
	print

rospy.init_node('message_subscriber')
sub = rospy.Subscriber('complex', Complex,callback)
rospy.spin()

5、打开一个终端运行roscore:

roscore

6、返回catkin_ws的根目录,catkin_make编译并运行pub脚本

cd ~/catkin_ws
catkin_make
source devel/setup.bash
rosrun basic message_publisher.py

7、打开另一个终端,运行subscriber.py

rosrun basic message_subscriber.py

8、运行结果:
北邮机器人队2020预备队培训(三) —— ROS基础_第9张图片

作业

  1. 实现文档中的教程,自定义其他类型的话题,测试发布与接收,截图记录。
  2. 根据第二次作业的路径规划,思考如何根据路径来规划机器人的速度,例如我们给了十个控制点,使用你的程序设计出了合理的可导的路径曲线,你的曲线是由点构成的,那我们这些点目前就包含了两个信息(x,y),现在我希望你再给你的点加上一个速度的信息(x,y,speed),如何根据路径来规划出合理的速度呢?提供以下几点作为参考,大家可以先做猜想设计合理并且容易修改的程序:
  • 机器人的加速度能否满足你规划的需求,通俗的说就是我在做相邻的两个点规划时规划了如下两个速度(x1 = 0.51,y1 = 0.52,speed1 = 1m/s),(x2 = 0.52,y2 = 0.53,speed2 = 1000m/s),显然这两个点信息不合理!所以你设计的函数最好加入加速度这个可调节的变量。
  • 机器人在启动和准备停下的过程需要合理的加减速 机器人启动时速度是0,我们不能直接赋值一个10m/s的速度!
  • 在过大弯的时候我们的机器人跟地面的摩擦力可能不够,这样提供的向心力会不够,机器人容易甩出轨迹,当我们设计轨迹速度时在曲率较大的时候可能需要做减速处理

作业提交

程序作业提交截至日期为2020年08月02日23时59分,上传到群文件夹7.30程序作业中,程序作业需要提交源代码,截图运行结果,写上必要的文字说明。

你可能感兴趣的:(北邮机器人队培训,python)