ROS总结理解

机器人操作系统入门_中科院软件所-重德智能机器人联合研究中心_中国大学MOOC(慕课)

可以参考视频学习

目录

.1ROS版本

 .2 ROS架构

.3 ROS与IDE安装

.4 Catkin与工作空间

5.ROS的Package结构

6.ROS的常用指令

7.Metapackage

8.Master和Node

.9 Topic和msg

.10 Service和srv

.11 Parameter Serve

12.Action

13.Gazebo

14.RViz

15.Rqt

16.Rosbag

 17.Client Library

References:


.1ROS版本

 .2 ROS架构

ROS可以看作是一种中间件,沟通了自己写的代码和真正的操作系统(如Linux)。ROS由四部分组成:框架+工具+功能+社区。

 ROS中的节点(Node)=电脑中的进程或可执行文件。ROS是一个模块化、分布式的架构,自带了进程管理和通信的相关功能。因此在开发的时候无需自己考虑进程的并行运行、协同调度等问题,简化了开发。

.3 ROS与IDE安装

关于ROS的安装,基本上直接按照官网安装流程(中文)安装即可,不难。安装完成后终端输入roscore,如果无报错说明安装成功。

推荐IDE:RoboWare Studio,官网是这里,但现在貌似上不去了。Github项目主页是这里,基于VS Code开发。官网打不开的话可以去Github下载deb包自己安装,点击这里去Github下载。

.4 Catkin与工作空间

Catkin(中文意思为柳絮))是ROS定制的编译构建系统,是对CMake的扩展。Catkin Workspace则是组织和管理package的文件夹,组织结构如下所示。

src是实际写代码的地方,可以放多个package,如下,其它是系统自动生成的。 

 package是Catkin编译的基本单元。

catkin_make用于初始化创建空间以及编译项目(常用),基本操作命令如下。

  • 初始化工作空间时,工作空间根目录下必须要有src文件夹,否则会提示没有src文件夹,新建不了。

在编译时注意两点:

  1. 一是要在工作空间的根目录下catkin_make,不然会报错;
  2. 二是catkin_make之后记得source一下catkin_ws/devel/setup.bash,否则可能会提示找不到可执行文件。 

建立工作空间可能会遇到如下问题。

提示找不到包,这时候pip install catkin_pkg安装一下就好了。建好的工作空间终端输出如下。

5.ROS的Package结构

中文可叫做功能包,是ROS软件的基本组织形式,是Catkin的基本编译单元。一个package可以包含多个可执行文件(节点)。Package的完整结构如下:

  • CMakeLists.txt(必须):规定Catkin的编译规则
  • package.xml(必须):自我描述,定义package的属性信息,如包名、版本、作者等。一般只需要改<build_depend><run_depend>就可以了。
  • scripts:用于存放一些shell或python脚本
  • include:源代码的头文件
  • src:源代码,如cpp文件、py文件等
  • msg:自定义消息格式,*.msg
  • srv:自定义服务,*.srv
  • action:自定义动作,*.action
  • config:参数、设置文件等,如*.yaml
  • launch:启动规则文件,*.launch,配合roslaunch命令可以一次运行多个可执行文件

6.ROS的常用指令

常用依赖:roscpp、rospy、std_msg、nav_msg等。直接在catkin_create_pkg时在包名后面空格加上即可。

全新新建工作空间终端代码:

mkdir -p ~/catkin_ws/src
cd catkin_ws
catkin_make

接着在工作空间中新建package:

catkin_create_pkg test roscpp rospy std_msg

这样便建好了一个包。

而对于从Github上clone或下载下来的代码,在建好了工作空间后,可以按照如下方式安装。

cd ~/catkin_ws/src
git clone https://github.com/DroidAITech/ROS-Academy-for-Beginners.git
cd ~/catkin_ws
rosdep install --from-paths src --ignore-src --rosdistro=kinetic -y
catkin_make
source ~/catkin_ws/devel/setup.bash

需要注意的是下载的代码需要放到工作空间的src文件夹下,

第二是需要在工作空间根目录下安装包所需的依赖以及CatkinMake。最后别忘了source一下。

当然如果嫌麻烦也可以将最后一行添加到~/.bashrc中,在终端中输入echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc即可。这样每次CatkinMake后,重新打开终端即可。

注意:

最好不要CatkinMake后直接就运行。因为在打开终端时会载入~/.bashrc的内容,但这个时候你还没有CatkinMake,所以你载入的其实是上一次CatkinMake后的结果。当然如果说你的package项目不是第一次编译、名称也没有改变,那么setup.bash中的内容也就没有变,这样CatkinMake前载入也是可以的。

7.Metapackage

可以翻译为“元包”或“虚包”,其本身没有什么内容,只包含有package必备的CMakeLists.txtpackage.xml。但它依赖了其它包(在package.xml中指定),通过这种方式将多个包组合起来。这样做的好处就是在安装的时候就不需要一个个安装,而只安装一个metapackage就可以了。ROS中常见的Metapackage如下:

8.Master和Node

在ROS中,所有的Node都是通过Master管理的,因此如果想启动一个Node,必须先要启动Master(roscore)然后再启动节点(rosrun)。

话题通信中

发布者和订阅者都需要一个节点

(可以理解为连接master的一个端口,通信的话需要给一个端口进行通信) 

Master:节点管理器。每个node启动的时候都要向master注册,管理node之间的通信。启动Master的命令是roscore,启动master的同时也会顺带启动rosout(日志输出)和parameter server(参数服务器)。

Node:ROS的进程,package里的可执行文件运行的示例,一般以功能划分。启动Node的命令是rosun [pkg_name] [node_name](必须先启动好master);也可以以launch文件的方式启动:roslaunch [pkg_name] [*.launch](自动判断master是否运行,没有的话自动启动),这样可以一次启动多个node。rosnode命令则用于查看和管理node,常用功能如下。

实际项目中,一般将用于启动机器人的包命名成name_bringup,这样在终端输入roslaunch name_bringup name.launch就可以启动机器人了

.9 Topic和msg

 Topic:ROS中的异步通信方式,可以看作是一个“频道”,Node之间通过publish-subscribe机制通信,如下所示。

一个Topic可以被多个Node订阅,一个Node也可以发布多个Topic,同时一个Topic也可以由多个Node发送,是一种多对多的关系。Topic在代码层面是字符串。 

Message:Topic内容的数据类型(格式标准),定义在*.msg文件中。Message可以理解为类,而发布的一条条的信息则是类的对象。基本Message类型如下: 

例如ROS里定义的Image的Message格式如下: 

相关命令:

 

 上图是运动小乌龟的时候echo出来的消息

.10 Service和srv

Service:ROS中的同步通信方式,Node间可以通过request-reply方式通信,如下。相比于Topic的“发了就不再管”或“只管接收”的单向通信,Service更加“有来有回”,所以比较适用于一些修改等场景,返回结果是是否修改成功。 

节点(Node)就是Master分配给运行文件的端口

Topic和Service的对比: 

srv:Service通信的数据格式,定义在*.srv文件中。一个示例srv文件如下。 

 

Service常用命令如下: 

 此外在自定义了Topic或Service后,都需要在package.xml和CMakeLists.txt中修改对应内容,如下。

 

.11 Parameter Serve

参数服务器中存储各种参数的字典(键值对),可以用命令行、launch文件和node(API)读写。一般将系统中不常改变的参数、设置等放到参数服务器中。可以理解为参数服务器中的参数对于节点是共享的,节点可以读写内容。

命令行修改参数命令rosparam

launch文件中修改参数:

<param>一般用于单个参数设置,<rosparam>一般用于批量参数设置。

12.Action

 可以理解为升级版的Service。

 Action通信的数据格式定义在*.action中。一个简单的示例如下:

 

13.Gazebo

ROS下的机器人仿真工具,Gazebo基于ODE物理引擎,用于动力学、导航、感知等任务的模拟。官网是这里。直接点击Gazebo的图标即可启动。

14.RViz

全称The Robot Visualization tool,是一个方便监控和调试的可视化工具,其本质上就是将一些订阅得到的数据可视化地显示出来,从而方便调试。在终端中直接输入rviz即可启动(需要先启动Master)。

15.Rqt

可视化工具,显示一些抽象的信息,如rqt_graph用于显示系统的通信架构,rqt_plot用于绘制一些动态参数曲线(如线速度、角速度、IMU数据等),rqt_console用于查看日志等等。

16.Rosbag

ROS的命令行工具,用于记录和回放数据流。

 

基本使用:

 17.Client Library

Client Library是ROS提供的用于编程的API库,如建立node、发布消息、调用服务等。比较常用的两个是roscpprospy

roscpp常用函数如下:

 rospy常用函数如下:

 

References:

ROS学习笔记1

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 将ROS消息转换为Protobuf消息需要进行以下步骤: 1. 定义一个.proto文件来描述Protobuf消息的结构。这个文件包含了消息类型、字段和其它相关信息。例如,定义一个名为`my_message`的消息类型,可以在.proto文件中添加如下代码: ``` message MyMessage { int32 id = 1; string name = 2; } ``` 2. 使用Protobuf编译器将.proto文件编译为对应的语言文件(如C++、Python等)。可以通过以下命令来编译: ``` protoc my_message.proto --cpp_out=. ``` 3. 在ROS中创建一个节点,用于订阅ROS消息并将其转换为Protobuf消息。可以使用相应的ROS消息类型和Protobuf消息类型来创建订阅器和发布器。例如,在C++中,可以使用`ros::Subscriber`和`ros::Publisher`类来实现。 4. 在订阅器的回调函数中,接收到ROS消息后,将其转换为Protobuf消息,并发布到相应的话题上。可以使用Protobuf提供的函数来实现消息的转换和序列化。 5. 在另一个ROS节点中订阅Protobuf消息。可以使用与步骤3中类似的方式创建订阅器,并在回调函数中处理接收到的Protobuf消息。 注意事项: - 在使用Protobuf编译器编译.proto文件时,根据需要选择对应的目标语言。 - 在ROS节点中使用的消息类型和命名必须与.proto文件中定义的消息类型和字段名保持一致,以确保正确的转换和序列化。 - 在转换消息时,需要注意消息字段的类型转换,并适当处理消息的可选字段和默认值。 - 在使用Protobuf消息时,需要安装相应的Protobuf库和依赖项。 这是一个大致的回答,具体实现细节和代码可以根据具体情况进行调整和编写。 ### 回答2: ROS (Robot Operating System) 是一个用于构建机器人软件的开源框架,而 Protocol Buffers (protobuf) 是一种用于序列化结构化数据的语言无关、平台无关、扩展性好的机制。 将ROS消息转换为protobuf消息可以提供更有效的信息传输和跨语言交流。这可以通过使用生成的消息定义和转换函数来实现。 首先,需要按照ROS和protobuf的规范进行消息定义。在ROS中,消息定义通过.msg文件来完成,而在protobuf中,消息定义通过.proto文件来完成。这些文件中包含了变量的名称、类型和结构等信息。 其次,需要使用相应的工具将消息定义转换为可理解的protobuf格式。对于ROS,可以使用rosmsg工具将.msg文件转换为生成的消息类文件。对于protobuf,可以使用protoc工具将.proto文件转换为对应的代码文件。 接下来,可以使用生成的消息类文件在ROS和protobuf之间进行转换。在ROS环境中,可以使用rosbridge库或者自己编写的节点程序来处理消息转换的逻辑。在protobuf环境中,可以使用生成的代码文件来创建消息对象,并通过相应的序列化和反序列化函数将消息转换为二进制格式或文本格式。 最后,可以通过网络或文件等方式将转换后的protobuf消息发送到其他ROS系统或其他支持protobuf的系统中进行使用。 需要注意的是,由于ROS和protobuf之间存在一些差异,可能需要进行一些额外的处理,例如,添加ROS特定的字段或转换ROS特定的数据类型。 总结来说,将ROS消息转换为protobuf消息是一个多步骤的过程,需要进行消息定义、生成代码、消息转换等操作。通过这种方式,可以在不同的系统之间实现高效、可扩展和跨语言的消息传递。 ### 回答3: ROS(Robot Operating System)是一个用于编写机器人软件的框架,而protobuf(Protocol Buffers)是一种用于序列化结构化数据的语言无关、平台无关、可扩展性强的数据交换格式。 要将ROS消息转换为protobuf消息,可以按照以下步骤进行: 1. 首先,需要先定义一个.proto文件,该文件描述了消息的结构和字段。可以使用ROS中定义的消息类型作为protobuf消息的字段类型。例如,如果有一个ROS消息类型为sensor_msgs/Imu,可以定义一个protobuf消息类型来表示相同的结构。 2. 定义完成后,将.proto文件通过protobuf编译器进行编译,生成对应的编程语言文件(如C++、Python等)。可以使用以下命令将.proto文件编译为C++文件:`protoc -I=<proto文件路径> --cpp_out=<生成文件目录> <proto文件名称>.proto` 3. 编译后,就可以在代码中使用protobuf消息类型了。将ROS消息数据转换为protobuf消息数据,需要遍历ROS消息中的字段,并逐个赋值给protobuf消息的对应字段。 4. 使用protobuf库提供的序列化方法,将protobuf消息序列化为字节流。这可以通过protobuf提供的SerializeToString()方法或者其他语言对应的方法实现。 总结起来,将ROS消息转换为protobuf消息的步骤主要包括定义.proto文件、编译.proto文件生成代码、将ROS消息数据赋值给protobuf消息、使用protobuf库提供的方法进行序列化。 然后,可以使用protobuf库提供的方法将序列化的消息发送到需要的地方或者进行其他相关的操作。同样,也可以将接收到的protobuf消息反序列化为ROS消息,完成从protobuf到ROS消息的转换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值