这段时间准备学习ROS,写个博客记录下,方便查阅。
这些知识大部分都是ROS官网教程的复现。

1、创建ROS工作空间

运行命令:
mkdir -p ~/catkin_ws/src (创建一个文件夹)
cd ~/catkin_ws/ (进入文件夹)
catkin_make (创建工作空间)
#如果是python用catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3

2、准备工作

安装ros-tutorials程序包:sudo apt-get install ros-“noetic”-ros-tutorials

3、创建ROS程序包

运行命令:
cd ~/catkin_ws/src(进入文件)
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp(创建一个名为beginner_tutorials的程序包,这个程序包依赖std_msgs,rospy,roscpp这三个包)

4、了解ROS

Nodes:节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信。
Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题。
Topics:话题,节点可以发布消息到话题,也可以订阅话题以接收消息。
Master:节点管理器,ROS名称服务 (比如帮助节点找到彼此)。
rosout: ROS中相当于stdout/stderr。
roscore: 主机+ rosout + 参数服务器 (参数服务器会在后面介绍)。

4.1ROS节点

roscore:运行行所有ROS程序前首先要运行的命令,给我的感觉就像是一个启动器。
rosnode:运行的节点。比如上一篇博客测试ROS用的那几行命令:1、roscore;2、rosrun turtlesim turtlesim_node;3、rosrun turtlesim turtle_teleop_key。每一个命令产生一个节点,如下图。
rosrun:使用包名直接运行一个包内的节点。还是以上篇博客测试用的命令举例,第二个命令运行turtlesim包里面的turtlesim_node节点。第三行命令运行turtlesim包中的turtle_teleop_key节点。

4.2ROS话题

通过以下两行命令安装rqt_graph,以便创建一个显示当前系统运行情况的动态图形。
sudo apt-get install ros-“noetic”-rqt
sudo apt-get install ros-“noetic”-rqt-common-plugins
运行命令:rosrun rqt_graph rqt_graph得到当前系统运行情况的动态图。

我运行着在上篇博客里面的测试例子。动态图显示有“/teteop_turle”和“/turtlesim”两个节点正在通过“/turtle1/cmd_vel”这个话题,进行交互。
通过命令rostopic echo + 话题名 可以显示这个话题发布的消息。
运行rostopic echo /turtle1/cmd_vel

我运行了上面命令,然后换到能控制乌龟移动的终端,按下方向键,在输入上面命令的终端中就即时显示出信息,这个信息就是/turtle1/cmd_vel话题上发布的信息。
我们再建立一个终端,然后运行rosrun rqt_graph rqt_graph

看到增加了一个新的节点“/turtlesim”,这就是刚才我们即时显示话题信息的节点。
再增加一个新的终端。输入rostopic list -v,显示发布和订阅的话题及其类型的详细信息。

rostopic type 命令用来查看所发布话题的消息类型
输入rostopic type /turtle1/cmd_vel

目前我也不知道这是个啥消息类型.。。。
输入rosmsg show geometry_msgs/Twist就可以查看这个消息类型的详情。

两个容器linear和angular,每个容器有3个元素,分别存储x,y,z,x,y,z的类型是float64。额,这个看得懂。

可以通过rostopic pub把数据发布到当前某个正在广播的话题上。
输入命令rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist – ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’,那个乌龟就会动,表示画乌龟的那个终端接受到了这个信息。
把上述命令改成rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 – ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’,就会以1HZ的速度发布信息到话题上,乌龟就会一直动。
OK,把刚才那个rqt_graph终端Ctrl+c中断,重新输入rosrun rqt_graph rqt_graph.得到一个看起来比以前更复杂的系统运行流程图。

现在的节点变成了4个。一个运行左边乌龟窗口的节点,一个输入上下左右控制乌龟的节点。一个输出显示当前话题信息的节点,一个不断给乌龟发布信息让乌龟转圈的节点(PS:按照我的理解roscore应该也算一个节点吧,rosnode list上也可以看到,但是没显示上去,可能是“系统节点”吧,感觉我们现在这个看运行图的终端也是个节点,但是也没显示)

通过rostopic hz查看数据发布的频率。
同样的,把显示运行图的终端Ctrl+c中断,然后输入rostopic hz /turtle1/pose(为什么是“/turtle1/pose”,猜测可能是因为产生的话题是“/turtle1/cmd_vel”,上级目录就是"/turtle1",估计系统底层方面的东西,不懂不懂,先放着,以后再弄清楚)

一直运行,伤不起,Ctrl+C结束。可以看到,正在以62HZ左右的频率发布数据。

运行rqt_plot命令可以实时显示一个发布到某个话题上的数据变化图形。
rosrun rqt_plot rqt_plot
在左上角那个位置输入turtle1/pose/x,点右边的加号。
然后输入turtle1/pose/y,点右边的加号,就能出现如下效果。

4.3ROS服务和参数

服务(services)是节点之间通讯的另一种方式。服务允许节点发送请求(request) 并获得一个响应(response)(PS:学了上面的内容我还以为ROS只用上述节点+话题方式通信呢.)
关于ROS服务的各种命令:
rosservice list 输出可用服务的信息
rosservice call 调用带参数的服务
rosservice type 输出服务类型
rosservice find 依据类型寻找服务find services by service type
rosservice uri 输出服务的ROSRPC uri
输入rosservice list 。

clear(清除),kill(终止),reset(重置),spawn(再生),这几个可以直译看出大概作用,其他的…慢慢学吧。。
rosservice type clear

空类型
rosservice type kill

kill类型?这是个啥类型?额,先不纠结这个问题。先记下,以后解答。。
rosservice call clear

小乌龟轨迹清空(PS:疑惑,这个clear是只针对这个节点还是针对ROS里面所启用的所有节点?用上面rosrun rqt_plot rqt_plot实验下)


前面画的东西也没清除啊,感觉似乎rosservice call clear针对的是特定的某个或者某些节点,懵逼中,希望大佬解惑。
通过rosservice type spawn| rossrv show了解详细信息。学到个新的办法,上面的rosservice type不能得到详细信息,这个在后面加| rossrv show能得到详细信息,等会可以看下上面的KILL类型。


kill类型包含一个string类型,应该是kill +x,终止x。
spawn类型包含x,y,theta,name,画—下面还有个name,为了区分下,第一个name叫n1,第二个name叫n2,个人理解,是指在n2窗口上的位置为x,y的地方,再生一个朝向为theta的名字为n1的乌龟。看了文档,对n2没做啥描述,懵。(后面学到了,那三条短线是为了分隔请求跟响应的,请求什么东西,然后谁来响应,最初的理解感觉也不算太错,哪个窗口来响应)
rosservice call spawn 2 2 0.2 “”

生成了一只新的乌龟,没写名字,名字自动为turtle2.
感觉可以开个终端,想办法让这只新乌龟也转起来。

依照刚学过的方法,不断给这只新乌龟发送信息,这只新乌龟就开始动起来了
rostopic pub /turtle2/cmd_vel geometry_msgs/Twist -r 1 – ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’

rosparam使得我们能够存储并操作ROS 参数服务器(Parameter Server)上的数据。
使用方法:
rosparam set 设置参数
rosparam get 获取参数
rosparam load 从文件读取参数
rosparam dump 向文件中写入参数
rosparam delete 删除参数
rosparam list 列出参数名

通过rosparam get语句得到background_r参数是69

再通过set语句进行更改:rosparam set /turtlesim/background_r 150,再运行rosservice call clear语句,旁边的窗口背景就变色了。

再通过get语句,现在的background_r 是150

rosparam get /可以得到所有参数

通过rosparam dump params.yaml语句,可以把所有参数信息保存在params.yaml中,然后再通过rosparam load params.yaml xxx把params.yaml中的信息加载在xxx空间上。

5、rqt_console 和 roslaunch的使用

5.1rqt_console和rqt_logger_level的使用

rqt_console属于ROS日志框架(logging framework)的一部分,用来显示节点的输出信息。rqt_logger_level允许我们修改节点运行时输出信息的日志等级(logger levels)(包括 DEBUG、WARN、INFO和ERROR)。
输入rosrun qt_console qt_console

再创建一个终端输入:rosrun rqt_logger_level rqt_logger_level

经过了n久的实验跟操作,有点懵,因为console窗口只显示WARN信息,INFO信息没显示(跟绝ros官网教程里面默认是显示info信息的)。经过多次实验,rqt_logger_level这个窗口形同虚设,可能我什么地方没弄对吧,希望有大佬解答。
日志等级按以下优先顺序排列:
Fatal
Error
Warn
Info
Debug
Fatal是最高优先级,Debug是最低优先级。通过设置日志等级你可以获取该等级及其以上优先等级的所有日志消息。比如,将日志等级设为Warn时,你会得到Warn、Error和Fatal这三个等级的所有日志消息。(我实验可能出了点问题,这个日志等级形同虚设)

5.2使用roslaunch

roslaunch可以用来启动定义在launch文件中的多个节点。
执行roscd beginner_tutorials

出现问题,设置当前终端下的ROS_PACKAGE_PATH环境变量:
export ROS_PACKAGE_PATH=~/“noetic”_workspace/sandbox:$ROS_PACKAGE_PATH
然后再roscd beginner_tutorials

唉!直接cd进去吧。
mkdir launch(创建文件夹)
cd launch(进入文件夹)

sudo gedit turtlemimic.launch(创建文件)
复制粘贴以下内容(括号内内容删去):

<launch>(表明这是一个launch文件)
(创建了两个节点分组,其中一个名为turtulesim1,另一个名为turtlesim2,两个组里面都使用相同的turtlesim节点并命名为sim。这样可以让我们同时启动两个turtlesim模拟器而不会产生命名冲突。)
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group><group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>(启动模仿节点,并将所有话题的输入和输出分别重命名为turtlesim1和turtlesim2,这样就会使turtlesim2模仿turtlesim1)
<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node></launch>

通过roslaunch命令来启动launch文件:
roslaunch beginner_tutorials turtlemimic.launch

报错,通过百度,得知是因为setup.bash文件没有进一步说明包的来源
进入devel目录下,运行:source setup.bash

返回先前的目录运行roslaunch beginner_tutorials turtlemimic.launch,出现两个乌龟窗口。现在roscd可以运行了,猜测刚才的无法使用roscd和rqt_logger_level都是因为setup.bash文件没有进一步说明包的来源造成的,目前roscd得到验证,等会试试rqt_logger_level。

新建一个终端,输入:rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 – ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, -1.8]’

两个窗口都在运动。
运行rosrun rqt_graph rqt_graph

可以看到正在运行的这些节点之间的关系。
运行的窗口太多,看着太麻烦,把除roscore之外的窗口全部关闭。

6、使用rosed编辑ROS中的文件

rosed 是 rosbash 的一部分。利用它可以直接通过package名来获取到待编辑的文件而无需指定该文件的存储路径了。
运行rosed roscpp Logger.msg测试下

没安装VIM编辑器,运行sudo apt install vim 安装VIMM编辑器

VIM用着不是很趁手,换个编辑器。

6.1下载vscode

下载地址:https://code.visualstudio.com/Download#

下载完成后建立一个共享文件夹,因为我们的是虚拟机,把下载后的文件放到共享文件夹中(PS:其实也可以直接在虚拟机上的浏览器上下载。。)

设备->共享文件夹

进入/mnt文件,创建一个文件,跟这个共享文件链接起来
命令是:sudo mount -t vboxsf 共享文件夹名称 /mnt/要链接起来的文件夹名称
我把默认的win10_ubuntu共享文件夹改成了win10_ubuntu_share

进入共享文件夹。
sudo dpkg -i code_1.48.2-1598353430_amd64.deb(后面这一串就是刚才下的vscode安装包)
安装完成后,修改成rosed的默认编辑器:
export EDITOR=‘code -w’
现在测试下完成没。
运行rosed roscpp Logger.msg
打开了vscode的界面,不是VIM,结束。

ROS学习记录(一)相关推荐

  1. ros学习记录:Gazebo加载速度慢,长时间停在“Preparing your world”

    前言 ros学习记录笔记,一个小白的自留地,欢迎大佬批评指正~ 一.问题描述 Gazebo加载速度慢,长时间停在"Preparing your world" 二.解决办法 1.下载 ...

  2. Webots+ROS学习记录(4)——六轮全地形移动机器人

    Webots+ROS学习记录(4)--六轮全地形移动机器人 有了以上经验,可以创造出一个全地形的移动机器人如图1 第一步,创建robot节点,并给robot节点编写相应参数 注意,这里的机身不能再使用 ...

  3. ROS学习记录(二)阿克曼转向车运动学模型及在gazebo中搭建仿真环境

    前言:该篇是ROS学习记录的第二篇,如果还没关注过之前文章的读者,如有需要可以通过下方传送门去看之前的文章: ROS学习记录(一) Plugin插件 这两天关注了古月老师的公众号,看到了其中一篇课程推 ...

  4. ROS学习记录9——urdf文件的创建与使用

    零.前言 在学习这一节之前,至少得明白如何创建一个工作空间,如何编译工作空间,如何运行工作空间里的文件(把工作空间的环境目录添加到环境里).如果有不会的,请看鄙人的ROS学习记录3. 本节默认工作空间 ...

  5. 【ROS学习记录】2021/7/2 Gazebo+rviz仿真(一)

    [ROS学习记录]2021/7/2 Gazebo+rviz进行turtlebot2仿真问题记录 ##小插曲 今天ubuntu挂载u盘一直读取失败所以做了一些令人窒息的操作,晚上开机就进入了initra ...

  6. ROS学习记录 | 便于回顾

    ROS学习记录 | 便于回顾 ROS环境搭建 ROS部分基础知识 ROS环境搭建 step1 创建工作空间目录结构 mkdir catkin_ws cd catkin_ws mkdir src cd ...

  7. ros学习记录1 Hello World 使用c++

    声明:整个学习是我跟着奥特学园进行的,不是原创,只是记录自己的学习过程 步骤 创建命名空间 mkdir -p catkin_ws/src //其中前者是工作空间的名称,后者为存放源码的位置 cd ./ ...

  8. ROS学习记录(一) Plugin插件

    前言:最近在学习无人驾驶路径规划和ROS的一些基础理论,过程中遇到了一些问题,写这个系列记录一下个人的学习过程. 遇到这个问题的初衷是看了小巨同学一篇帖子 使用自定义RRT*全局规划器建图导航 文中提 ...

  9. ROS学习记录(七) 连接单片机

    这次的记录来源于最近在把ROS和STM32联系在一起,更多是填坑吧. 一.使用串口联系ROS和下位机 主要参考: ROS中串口操作 中间遇到了一个问题,按照上一个文章进行操作,总会打开串口失败, 解决 ...

最新文章

  1. mysql导入分卷_php实现mysql备份恢复分卷处理的方法_PHP
  2. php如何实现根据地区内筛选,PHP区块查询实现方法分析
  3. 浮躁的国内测试界-2006年测试人员招聘感悟
  4. ECMAScript面向对象(三)——之继承
  5. python增量爬虫_python增量爬虫pyspider
  6. C#面向对象15 多态
  7. oracle 存储过程详细介绍(创建,删除存储过程,参数传递等)1
  8. python html表格模版,python-如何使用模板(例如Jinja2)将列值列表呈现到表中
  9. c语言怎么编程打开文件,怎么用c语言打开文件
  10. 云计算云存储的一些基本概念
  11. NI LabVIEW开发环境(2.生成installer安装程序exe)
  12. Keil MDK 编译器 AC5 和 AC6 优化选项重要内容和区别
  13. 通过源码分析Mybatis运行原理
  14. C、C++数组初始化,数组赋值
  15. android 粒子爆炸特效
  16. HTTP状态信息和描述
  17. 风雨哈佛路,我在折戟沉沙的路上浴火重生
  18. 课程作业2-大一纯网页课程作业——垃圾分类网站设计
  19. dell inspiron 只有一个飞行模式 没有wifi_Kindle 上的电子书为什么没有封面?恢复封面你只需这样做!...
  20. 【Mysql学习之旅-2】经典sql面试题及答案分析

热门文章

  1. LeetCode题解(1373):二叉搜索子树的最大键值和(Python)
  2. duang!!!为什么函数可以返回unique_ptr
  3. 如何在三个月内成为一名全栈开发
  4. iOS应用架构谈-组件化方案
  5. python苹果下载软件助手哪个好_python Mac版下载-python官方下载[编程开发]-华军软件园...
  6. 监听服务器app登录用户信息,监控服务器状态app
  7. input( ) 输入函数和注释
  8. I2S音频杂音问题调查小结
  9. Android studio修改项目名称和包名
  10. 2019 字节跳动双指针字符串题目 万万没想到之聪明的编辑