ROS的简单入门

之前6月份零零星星的学了一点ros,长时间没用过,基本上忘了个精光。 上周过了旷视的实习生面试,明天就要入职了,所以准备在入职前稍微整理一下ros的基础内容。感谢youtuber AI葵[https://www.youtube.com/watch?v=MOVJknVF73A&list=PLDV2CyUo4q-IYaLRTXorccibStlBw0v9C&index=2]

1. ROS程序间怎样通信

image.png

http://akihikoy.net/notes/?text%2FROS%2FMinOverview

  • ROS Master 就是roscore这一步的操作。
  • Node表示一个接一个的程序,比如控制小乌龟移动转向的程序turtle_teleop_key和显示小乌龟的程序turtlesim_node。ROS里面的node无法直接相互通信,是通过topic进行通信,通过publisher node发布一个消息,由订阅这个topic的subscriber及时接收topic的消息。这样的好处是,publisher发布一个消息到topic后,很多个subscriber都可以订阅这个消息。

ROS node之间的通信方式主要有两种:topic和service。
通过topic通信时,不同的node可以向同一个topic发送,接受数据,发送数据的node不知道哪个node接收了数据,同样接收数据的node也不知道哪个node发送了数据。因为每个node都是相互独立的,只需要负责自己的功能和外部接口,不需要关心其他node的行为。这是一种开放式的收发数据的方式,是node之间的主要通信方式,有利于构造分布式大系统。
service是一种请求+反馈的通信机制。消息的传输只涉及两个node:发送请求的一方称为client,提供服务的一方叫做server。在通过service形式进行通信时,client首先向server请求服务,收到消息之后server运行事先设置好的服务功能,并返回消息给client。service通信一般用在事件触发情景中,例如满足某个命令就令node开启某项功能,并希望确认功能确实顺利开展。

显示各个node是怎样的结构,需要新开一个terminal

rqt_graph  //显示连接图
OR
rostopic list //显示在终端
OR
rostopic info /turtle1/cmd_vel
node_show1.png

node_show2.png

2. 建立工作环境

官方教程 http://wiki.ros.org/catkin/Tutorials/create_a_workspace
首先建立一个catkin的工作环境

$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make //类似C++的cmake,是专门的编译器

编译完还要执行
:~/catkin_ws $ source devel/setup.bash
这行命令表示,告诉ROS现在的工作环境就是在catkin_ws这个文件夹下面,因为以后会有很多不同的工作环境,每次执行ROS程序的时候,都必须告诉在哪一个工作环境下去执行,所以必须在catkin_ws下面执行上面那行source的命令。
也可以将上面的命令写进bashrc文件中,可以避免每次执行程序都打这一行。

gedit ~/.bashrc
然后加上
source ~/catkin_ws/devel/setup.bash
保存退出
source ~/.bashrc

3. 建立ROS Package

http://wiki.ros.org/cn/catkin/Tutorials/CreatingPackage
可以在ros package里面写我们想实现的程序了。
比如小乌龟的例子
:~/catkin_ws $ rosrun turtlesim turtlesim_node
这里的turtlesim就是package,而turtlesim_node就是package里面的程序,一个package里面有很多的程序可以调用。

//首先进入到创建的catkin工作空间中的src目录下面
$ cd ~/catkin_ws/src  

//再使用catkin_create_pkg命令来创建一个名为'tutorial'的新程序包,这个程序包依赖于std_msgs、roscpp和rospy:
$ catkin_create_pkg tutorial std_msgs rospy roscpp

//再进入到上一页,完成编译的动作,让ROS知道又新加了一个资料夹
cd ..
catkin_ws_make

怎样检验package有没有建立成功,可以新开一个terminal,输入roscd tutorial/,然后按enter,就会进入到新建的package的文件夹里面。

4. 使用rospy写出helloworld

在刚刚建立的tutorial文件加下面的src文件夹中,新建一个helloworld.py文件,然后使用sublime写入代码。

#!/usr/bin/env python   //告诉系统使用的是python语言

import rospy
from std_msgs.msg import String  #输出字符串,使用rospy专用的包

if __name__ == "main":
    #建立一个talker Node,anonymous = True可以让后来建的同名的talker自动改成talker1,talker2...
    rospy.init_node('talker', anonymous = True)
    #建立一个publisher,发布的格式为string,在系统内存里面存10个string
    pub = rospy.Publisher('chat', String, queue_size=10)
    #publisher发布消息的频率为每秒钟10次
    rate = rospy.Rate(10)
    
    while not rospy.is_shutdown():
        #建立字符串
        hello = 'hello world ! %s' % rospy.get_time()
        #pub发布字符串消息
        pub.publish(hello)
        #屏幕显示字符串消息
        rospy.loginfo(hello)
        #休眠0.1s
        rate.sleep()

在src文件夹里面建立一个helloworld.py文件,进入到src文件夹,让.py文件变成可执行,使用

chmod +x helloworld.py

roscore
rosrun tutorial helloworld.py
chat主题.png

5. 写出helloworld的subscriber

同样,先在tutorial/src文件夹下面新建一个helloworld_listener.py文件

#!/usr/bin/env python

import rospy
from std_msgs.msg import String  #输出字符串,使用rospy专用的包

def callback(data):   
    rospy.loginfo(rospy.get_caller_id() + 'I heard %s' % data.data)

if __name__ == '__main__':
    rospy.init_node('listener', anonymous = True)
    #建立一个Subscriber,订阅主题的名称是一样的‘chat’,订阅的格式为string,callback是个函数,当接收到topic更新所传来的信息的时候,就会调用callback这个函数
    pub = rospy.Subscriber('chat', String, callback)
    #防止主函数在收到更新之前结束,因为main函数是从上往下执行,spin就是在一直聆听主题的更新
    rospy.spin()
talker_listener.png

6. 可视化及模拟

安装turtlebot相关的所有功能包
sudo apt-get install ros-kinetic-turtlebot-*
安装完成后的功能包中包含了所有Turtlebot真机与仿真的功能,这里还是以gazebo仿真为主进行实践。
roslaunch是很多个rosrun,就是可以执行很多个rosrun,在一行能够执行

1. roscore
2. roslaunch turtlebot_gazebo turtlebot_world.launch

#可视化
3. roslaunch turtlebot_rviz_launchers view_robot.launch

#操控机器人
4. roslaunch turtlebot_teleop keyboard_teleop.launch
rviz.png

上面的图是rviz显示的图,实现的原理就是各个topic之间的传输。相机照的照片和激光扫描的点云图,发布到topic上,然后rviz作为subscriber可以看到照片和点云。

遇到的问题:

  • 运行roslaunch mybot_gazebo mybot_world.launch的时候,报错
    [https://answers.ros.org/question/265455/modulenotfounderror-no-module-named-re/]

解决方法:
vim .bashrc
在bashrc文件里面注释掉最后一行的anaconda的环境
source ~/.bashrc

  • gazebo加载异常缓慢
    [https://blog.csdn.net/puqian13/article/details/90635885]

你可能感兴趣的:(ROS的简单入门)