注:本章内容是在ROS系统下进行的,对ROS环境具有依赖,其它环境可能无法顺利执行。 一、创建自己的ros工作空间 在开发中我们做一些新功能或者测试一些功能,那么可能就会需要创建自己的ros工作空间,下面我们创建一个mywork_ws的ros工作空间。 一个工作空间最基本的组成有:src、build或devel(其中build和devel由编译生成),所以我们只需要创建一个文件夹(文件夹名称既工作空间名称),src是放软件功能包的地方。mywork_ws文件夹在用户文件主目录下创建。 1.1、mywork_ws下创建src 输入:$ mkdir -p ~/mywork_ws/src 1.2、进入mywork_ws文件夹 输入:$ cd ~/mywork_ws 1.3、使用catkin_make编译 即使这个工作空间是空的(即在'src'目录中没有任何软件包),你依然可以编译它,执行完该命令后,查看当前路径,会发现该空间除了 src,又多了 build 和 devel 文件夹。这两个文件夹中是一些配置信息、编译信息等。 输入:$ catkin_make
1.4、当然编译完这个工作空间还只停留在普通文件夹层面,如果我们想让ros系统认可,那么就要把这个文件添加到系统变量里。 输入 vim ~/.bashrc 1.5、如下图,同步添加工作空间信息。添加完并不会立即生效,需要用source ~/.bashrc或者重启终端, 这将确保ROS能够找到所有属于新建立的包的新消息类型和 Python模块。 输入:source ~/mywork_ws/devel/setup.bash catkin_make命令在catkin 工作空间中是一个非常方便的工具。后边在开发过程中也会经常用到,如修改了src源码,都需要重新编译功能才会更新。 二、编译重建ros工作空间 在前边的内容中我们已经学习过如何构建一个新的工作空间,现在学习怎么重新编译已经存在的工作空间,直接使用catkin_make指令可以直接编译,但是有时候会出现异常,在一些特殊情况下需要完整重新构建ros空间。如这本章内容我们以重新构建mywork_ws为例。 2.1、为了保证构建的完整性,需要重删除build与 devel两个文件。 警告:请不要在rm命令中包括src目录,否则会导致所有 catkin源文件丢失! 输入:$ cd ~/mywork_ws/ 输入:$ rm -r build/ devel/ 2.2、执行上面的命令之后,你就可以像往常一样重新构建数据包: 按顺序输入以下指令: l $cd ~/mywork_ws l $catkin make l $source devel/setup. bash 2.3、重新构建单独的catkin包。如果你在 catkin工作空间单独更新了一个包,并且想要重新构建它,请按照如下的顺序使用 catkin make变化命令: 按顺序输入以下指令: l $cd ~/mywork_ws l $catkin_make --pkg package_name l $source devel/setup. bash 三、理解 ROS节点 本节主要介绍 ROS 图(graph)概念,并说明roscore、rosnode和 rosrun 命令行工具的使用。 3.1、在本教程中我们将使用到一个轻量级的模拟器,请按顺序使用以下命令来安装: l $ sudo apt-get install ros-<distro>-ros-tutorials l #<distro>用你使用的ROS发行版本名称(例如kinetic、melodic等)替换掉''。 l roscore 3.2、roscore命令:roscore是你在运行所有ROS程序前首先要运行的命令。 输入:$ roscore 然后你会看到类似下面的输出信息: 注意:如果roscore运行后无法正常初始化,很有可能是存在网络配置问题。 解决办法: (1) 参考第四章节《机器人与电脑之间的联网设置Master配置》; (2) 如果roscore不能初始化并提示缺少权限,这可能是因为~/.ros文件夹归属于root用户(只有root用户才能访问)。 3.3、使用rosnode (1)打开一个新的终端, 可以使 rosnode 像运行roscore一样。如果你在rosnode的指令时出现下面问题说明当前无节点运行,这时候你需要启动至少一个节点如:roscore。
[size=9.0000pt](2)rosnode list指令列出活跃的节点。 输入:$ rosnode list
这表示当前只有一个节点在运行: rosout。rosout这个节点用于收集和记录节点调试输出信息,所以它总是在运行的。 (3)rosnode info命令返回的是关于一个特定节点的信息。 输入:$ rosnode info /rosout 通过下图可以看出,事实上由它发布/rosout_agg 这给了我们更多关于rosout的信息 3.4使用 rosrun rosrun允许我们使用功能包等名直接运行包内的节点(而不需要知道这个包的路径)。 (1)rosrun用法: 输入:$ rosrun [package_name] [node_name] (2)接着我们在一个新的终端运行turtlesim包中的 turtlesim_node。 输入$ rosrun turtlesim turtlesim_node 你会看到 turtlesim 窗口(如下图): 注意: 这里的 turtle 可能和你的 turtlesim 窗口不同,不同ros版本界面有些区别 (3)在一个 新的终端输入以下指令: 输入$ rosnode list 你会看到下图:
关闭 turtlesim 窗口停止运行节点 或者回到rosrun turtlesim终端并使用ctrl+C。 (4)现在让我们重新运行它,但是这一次使用Remapping Argument改变节点名称: 输入:$ rosrun turtlesim turtlesim_node __name:=my_turtle (5)现在,我们退回使用rosnode list: 输入:$ rosnode list 你会看见下图信息: 注意: 如果你仍看到 /turtlesim在列表中,这可能意味着你在终端中使用ctrl-C停止节点而不是关闭窗口 (6)如果尝试清除rosnode 列表,可以通过下边的指令,然后我们可以看到新的/my_turtle节点。 输入:$ rosnode cleanup (7)使用另外一个rosnode指令ping来测试: 输入:$ rosnode ping my_turtle 得到下图效果: 四、理解ROS话题 1、roscore 1.1 首先确保roscore已经运行, 打开一个新的终端: 输入:$ roscore 1.2 如果你没有退出在上一篇教程中运行的roscore,那么你可能会看到下面的错误信息: roscore cannot run as another roscore/master is already running. Please kill other roscore/master processes before relaunching 这是正常的,因为只需要有一个roscore在运行就够了。 2、turtlesim 在本教程中我们也会使用到turtlesim,请在一个新的终端中运行: 输入:$ rosrun turtlesim turtlesim_node 2.1、通过键盘远程控制turtle 我们也需要通过键盘来控制turtle的运动,请在一个新的终端中运行: 输入:$ rosrun turtlesim turtle_teleop_key 得到如下图页面: 提示:如果不能控制,请选中turtle_teleop_key所在的终端窗口以确保你的按键输入能够被捕获。 2.2 ROS Topics:紧接上章已经启动的turtlesim_node和turtle_teleop_key节点进行操作。 turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题来互相通信的。turtle_teleop_key在一个话题上输入消息并发布,而turtlesim则订阅该话题以接收消息。 3、rqt_graph 工具 3.1 下面让我们使用rqt_graph来显示当前运行的节点和话题。 rqt_graph能够创建一个显示当前系统运行情况的动态图形。是rqt程序包中的一部分。 3.2、在一个新终端中运行: 输入:$ rosrun rqt_graph rqt_graph 会得到类似下图所示的图形: 如果你将鼠标放在/turtle1/command_velocity上方,相应的ROS节点(蓝色和绿色)和话题(红色)就会有颜色显示。 正如你所看到的turtlesim_node和turtle_teleop_key节点正通过一个名为/turtle1/command_velocity的话题来互相通信。 4、rostopic介绍:rostopic命令工具能让你获取有关ROS话题的信息。 4.1、你可以使用帮助选项查看rostopic的子命令: 输入:$ rostopic -h 显示: 接下来我们将使用其中的一些子命令来查看turtlesim。 5、使用 rostopic echo:可以显示某个话题上发布的数据。 5.1、用法: 输入:rostopic echo [topic] 让我们在一个新终端中看一下turtle_teleop_key节点在/turtle1/command_velocit话题(非hydro版)上发布的数据。 输入:$ rostopic echo /turtle1/command_velocity 你可能看不到任何东西,因为现在还没有数据发布到该话题上,接下来我们通过按下方向键使turtle_teleop_key节点发布数据。 注意:如果turtle没有动起来的话就需要你重新选中turtle_teleop_key节点运行时所在的终端窗口。 现在当你按下向上方向键时应该会看到下面的信息: --- linear: 2.0 angular: 0.0 --- linear: 2.0 angular: 0.0 --- linear: 2.0 angular: 0.0 --- linear: 2.0 angular: 0.0 --- linear: 2.0 angular: 0.0 6、用 rostopic list:能够列出所有当前订阅和发布的话题。 6.1、让我们查看一下list子命令需要的参数,在一个新终端中运行: 输入:$ rostopic list -h 显示: 7、ROS Messages:话题之间的通信是通过在节点之间发送ROS消息实现的。 对于发布器(turtle_teleop_key和订阅器(turtulesim_node)之间的通信,发布器和订阅器之间必须发送和接收相同类型的消息。这意味着话题的类型是由发布在它上面的消息类型决定的。 使用rostopic type命令可以查看发布在某个话题上的消息类型。 8、使用 rostopic type:用来查看所发布话题的消息类型。 用法: 输入:rostopic type [topic] 可以看到: turtlesim/Velocity 我们可以使用rosmsg命令来查看消息的详细情况(非hydro版): 输入$ rosmsg show turtlesim/Velocity 显示: float32 linear float32 angular 现在我们已经知道了turtlesim节点所期望的消息类型,接下来我们就可以给turtle发布命令了。 9、使用 rostopic pub:可以把数据发布到当前某个正在广播的话题上。 用法: 输入:rostopic pub [topic] [msg_type] [args] 示例(非hydro版): $ rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity -- 2.0 1.8 上面的命令会发送一条消息给turtlesim,告诉它以2.0大小的线速度和1.8大小的角速度开始移动。 9.2、这是一个非常复杂的例子,因此让我们来详细分析一下其中的每一个参数。rostopic pub这条命令将会发布消息到某个给定的话题。 9.3、(-1单个破折号)这个参数选项使rostopic发布一条消息到turtle1/command_velocity后马上退出。 这是消息所发布到的话题名称。 turtlesim/Velocity 这是所发布消息的值。 --2.0 1.8 · 正如之前提到的,在一个turtlesim/Velocity消息里面包含有两个浮点型元素:linear和angular。 · 在本例中2.0是linear的值,1.8是angula的值。 · 这些参数其实是按照YAML语法格式编写的,这在YAML文档中有更多的描述。 9.4、你可能已经注意到turtle已经停止移动了,这是因为turtle需要一个稳定的频率为1Hz的命令流来保持移动状态。我们可以使用rostopic pub -r命令来发布一个稳定的命令流(非hydro版): 输入:$ rostopic pub /turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0 -1.8 这条命令以1Hz的频率发布速度命令到速度话题上。 我们也可以看一下rqt_graph中的连接情况,可以看到rostopic发布器节点(红色)正在与rostopic echo节点(绿色)进行通信: 我们也可以在一个新终端中通过rostopic echo命令来查看turtlesim所发布的数据。 10、使用 rostopic hz:这个命令可以用来查看数据发布的频率。 用法: 输入:rostopic hz [topic] 我们看一下turtlesim_node发布/turtle/pose时有多快: 输入:$ rostopic hz /turtle1/pose 你会看到: subscribed to [/turtle1/pose] average rate: 59.354 min: 0.005s max: 0.027s std dev: 0.00284s window: 58 average rate: 59.459 min: 0.005s max: 0.027s std dev: 0.00271s window: 118 average rate: 59.539 min: 0.004s max: 0.030s std dev: 0.00339s window: 177 average rate: 59.492 min: 0.004s max: 0.030s std dev: 0.00380s window: 237 average rate: 59.463 min: 0.004s max: 0.030s std dev: 0.00380s window: 290 现在我们可以知道了turtlesim正以大约60Hz的频率发布数据给turtle。 我们也可以结合rostopic type和rosmsg show命令来获取关于某个话题的更深层次的信息(非hydro版): 输入:$ rostopic type /turtle1/command_velocity | rosmsg show 到此,我们已经完成了通过rostopic来查看话题相关情况的过程,接下来我将使用另一个工具来查看turtlesim发布的数据。 11、使用 rqt_plot:此命令可以实时显示一个发布到某个话题上的数据变化图形。这里我们将使用rqt_plot命令来绘制正在发布到/turtle1/pose话题上的数据变化图形。 注意:如果你使用的是electric或更早期的ROS版本,那么rqt命令是不可用的,请使用rxplot命令来代替。 11.1、首先,在一个新终端中运行rqt_plot命令: 输入:$ rosrun rqt_plot rqt_plot 运行后会弹出一个新窗口,在窗口左上角的一个文本框里面你可以添加需要绘制的话题。 在里面输入/turtle1/pose/x后之前处于禁用状态的加号按钮将会被使能变亮,按一下该按钮,并对/turtle1/pose/y重复相同的过程,现在你会在图形中看到turtle的x-y位置坐标图。 同理减号按钮会显示一组菜单让你隐藏图形中指定的话题。 11.2、现在隐藏掉你刚才添加的话题并添加/turtle1/pose/theta,你会看到如下图所示的图形: 五、rviz可视化工具 简介:rviz是ros的一个可视化工具,用于可视化传感器的数据和状态信息。rviz支持丰富的数据类型,通过加载不同的Dispalys类型来可视化,每一个Dispaly都有一个独特的名字。 运行rviz 1.1、打开一个linux终端 输入:$ gedit ~/.bashrc 1.2、启动roscore roscore是 节点和程序的集合,这些 节点和程序是基于ROS的系统的先决条件。您必须 运行roscore才能使ROS节点进行通信。使用roscore命令启动它。 输入:$ roscore 如果顺利,会显示以下页面:
1.3、新开终端运行,打开rviz 输入:$ rosrun rviz rviz rviz的视角操作:
L: 单击并拖动围绕焦点旋转
M: 在相机向上和向右向量形成平面,按下中键并拖动焦点
R: 单击拖动鼠标 放大/缩小焦点 向上拖动放大,向下拖动缩小
滚轮: 放大缩小焦点 常见的display类型 六、机器人与电脑之间的联网设置Master ROS主从环境配置:ROS的主从环境其实是一种分布式通信方式。这里我们讲述ROS主从环境的配置步骤。 6.1、IP与Hostname 启动机器人后,机器人会启动随身WIFI,在PC上链接机器人WIFI。 首先,使用下面的命令,分别在xrrobot与您PC上执行,获取xrrobot主机和您PC的IP地址: 输入:$ ifconfig xrrobot机器人主机的默认IP已在出厂时设定为192.168.1.1,接入无线网后ip由路由器分配,也可进路由后台查看。 比如这里我们看到路由器为机器人分配的IP是192.168.5.242 6.2、根据路由器提供的IP我们需要设置路由器的master IP,设置方法如下:将ROS_MASTER_URI换成机器人实际的IP,然后保存,保存后重启终端生效 输入:$ gedit ~/.bashrc 七、发布一个hello world话题 7.1在 ~/ mywork _ws/src/my_ros_helloworld 工作空间的软件包目录下 创建 scripts文件夹(用于存储可执行文件,即python文件) 7.2在 ~/ mywork_ws/src/my_ros_helloworld/script中创建 hello_pub.py python脚本。下面是程序书写步骤 第一步:初始化节点,给节点起一个名字,用来告诉节点管理器:我来了,并创建节点句柄。这基本是所有话题通讯会做的事,这个节点名字可以随便取,但最好比较有明显的含义。 输入:pub = rospy.Publisher('chatter', String, queue_size=10) 第二步:创建一个发布者。这里发布者的名字可以随便取,好记有意思的名字即可,这里包括了消息类型和话题名。,那我们怎么确定消息类型和话题名字呢?下面这句话是固定操作,记住它:Publisher(大写)与后面的advertise,这都是发布消息的基本语句内容。 例:rospy .Publisher ("话题名字",类型,队列长度); 第三步:设置循环的频率,括号中是多少,就是每秒多少次 例:rate = rospy.Rate(10) 第四步:进入while()循环创建消息实例,发布消息即可。后面加上循环等待,这里的程序要根据消息的数据类型来写,这里不做介绍,在下面的代码中会有体现。 rate.sleep() # # coding=utf-8 #!/usr/bin/env python import rospy from std_msgs.msg import String、 def talker(): pub = rospy.Publisher('chatter', String, queue_size=10) # 当订阅者接收的不如发布的快,最多有10个最新的消息预留在缓存区中 rospy.init_node('hello', anonymous=True) # anonymous=True表示当有节点名称重复时,可以在后边自动加数字区分 rate = rospy.Rate(10) # 10hz 与rate.sleep()配合使用,表示以10hz的频率发布消息 while not rospy.is_shutdown(): #循环:检查rospy没有被关闭则执行 hello_str = "hello world %s" % rospy.get_time() rospy.loginfo(hello_str) #三个任务:消息被打印到屏幕;它被写入Node的日志文件;被写入rosout(可以使用rqt_console来提取消息) pub.publish(hello_str) #发布 rate.sleep() if __name__ == '__main__': try: talker() except rospy.ROSInterruptException: pass 修改 hello_pub.py 为可执行文件(用python hello_pub.py 命令单独运行,可不需要设置,用 rosrun my_ros_helloworld hello_pub.py命令运行则需要,否则会报错找不到可执行文件节点)。 chmod +x talker.py 八、订阅hello world话题 在~/ mywork_ws/src/my_ros_helloworld/script中创建 hello_sub.py python脚本 # coding=utf-8 #!/usr/bin/env python import rospy from std_msgs.msg import String def callback(data): rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data) def listener(): rospy.init_node('listener', anonymous=True) # anonymous=True真正的标志意味着rospy是唯一的 rospy.Subscriber('chatter', String, callback) # 订阅话题 rospy.spin() # spin()简单地保持python不退出,直到该节点停止 if __name__ == '__main__': listener() 运行结果: 九、学习ROS官方教程 十、如何寻找第三方ros数据包 1.1、有些时候关于ROS最难了解的就是其他开发者提供了什么。举个例子,假如你对在 Arduino机器人上运行ROS感兴趣,并且想知道是否有其他人已经创建了一个ROS包来完成这项工作,有下面4种搜索的方法你可以使用。 1.2、搜索 ROS Wiki ROS Wiki包含一个ROS包和堆的可搜索索引。如果开发者创建了某个ROS软件并希望和其他人共享,他们往往会向 ros-users邮件列表发布公告和存储库的链接。如果他们同时在ROs Wiki上创建了文档,那么在发布公告不久之后该数据包就会出现在索引搜索中。 最终的结果,你往往仅仅通过在 ROS Wiki上进行关键词搜索就能找到想要的东西。回到上面的 Anduin机器人的例子,如果我们在搜索框中输入“ Arduino”(请去除引号),那么会得到指向两个数据包的链接:rosserial arduino和ros_arduino_bridge。 1.3、使用 relocate命令 如果你清楚想要寻找的包的准确名称,并且希望找到该包的URL地址,那么可以使用 rosIe cate命令(该命令只有在你按照之前的描述安装了 reinstall之后才可用)。例如,为了找到ROs Groovy中 ros_ arduino_bridge包的地址,运行下面的命令 输入:$ roslocate uri ros_arduino_bridge 这条命令应该产生如下的结果: 这表示我们可以使用git命令安装该包到我们的个人 $ cd ~/catkin_ws/src $ git clone git:// github.comhbrobotics/ros_arduino_bridge.git $ cd ~/catkin_ws $ catkin_make $ source devel/setup.bash 1.4、浏览ROS软件索引点击 ROS Wiki每个页面上端的横幅中的 Browse software,可以浏览Wiki上完整的ROS包堆和存储库列表。
1.5、使用 Google搜索 如果其他的方法都失败了,你还可以尝试常规的 Google搜索。例如,搜索“ ROS face nition package2”就会得到一个指向面部识别数据包的链接。 十一、获取更多关于ros的帮助 1.获取更多关于ROS的帮助有几种获取额外帮助的来源。可能的最好出发点就是 ROS Wiki的主页。如前面部分描述的,请一定要利用页面右上角的搜索框。 如果你在Wiki上无法找到需要的帮助,可以尝试ROS问答论坛。问答站点是一个获取帮助的好地方。你可以浏览问题列表,搜索关键词,查看基于标签分类的不同话题,甚至可以在一个话题更新时收到E-mail通知。但是,请一定在发布新问题之前先搜索已有的问题列表避免重复提问。
添加小R科技官方ROS支持群1005688426 商务合作:service@xiaorgeek.com
|