本次课程介绍ROS基础,今年的预备队培训也以ROS为主,最后在比赛中结合控制算法完成任务。
ROS又叫机器人操作系统,ROS提供了一种发布-订阅式的通信框架用以简单、快速地构建分布式计算系。
话题是ROS中最最常用的机制,话题也是ROS设计的高明之处,之前说了ROS是发布订阅的通信框架,这种框架搭建用的就是话题机制。
话题机制就是发布者和接收者的话题的名字相同就可以考虑连接,能否连接成功还需要参照发布者和接收者话题的类型是否一致,如果发布者和接收者都是同一个话题名字并且数据类型相同,那么就建立连接。否则不建立连接。
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
程序执行情况
这个警告好像无伤大雅,刚入门百度搜了一些每太看明白怎么解决。
再开一个新终端,用rostopic list打印正在执行的话题
rostopic list
可以看到我们的节点已经在运行了。
用rostopic echo打印节点的数据
rostopic echo counter -n 5
打印五条消息
用rostopic来检验他是否按照我们的预期速率发送
rostopic hz counter
ctrl+c停止打印,用rostopic info查看已经被声明的话题
rostopic info counter
用rostopic find来查询发布某种类型消息的所有话题
rostopic find std_msgs/Int32
先看下basic包的文件结构:
cd ~/catkin_ws/src/basic
ls
tree
ok下面开始操作
1、创建我们的消息类型,也就是创建Complex.msg文件
cd ~/catkin_ws/src/basic
mkdir msg
cd msg
vi Complex.msg
用vim编辑,先按键盘上的i进入输入模式,输入如下:
按Esc退出编辑模式,输入":wq"(注:引号内全部内容包括" : "),保存并退出。
2、编辑package.xml文件
cd ..
vi package.xml
2.1、在
在这些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:
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
程序作业提交截至日期为2020年08月02日23时59分,上传到群文件夹7.30程序作业中,程序作业需要提交源代码,截图运行结果,写上必要的文字说明。