ROS基础

一、一些概念

  • 通信机制:每个节点都是完成一个固定的功能,他们之间会有一个传输完成通讯,每个节点的编程语言不一定是一样的,只要有统一的通讯标准就行。
  • 节点:执行单元,独立运行的可执行文件;节点在系统中的名称必须是唯一的;不同的节点可以使用不同语言,可以分布式运行在不同的主机。
  • 节点管理器:为节点提供命名和注册服务;跟踪和记录话题/服务通信等,辅助节点建立链接、相互查找;提供参数服务器。
  • 话题:Topic节点间用来传输数据的重要总线;使用发布/订阅模型,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一。(异步通信)
  • 消息:使用编程语言无关的,msg文件定义,编译过程中生成对应的代码文件
  • 服务:使用客户端/服务器(C/S)模型,客户端发送请求数据,服务器完成处理后返回应答数据(会返回而Topic做不到)使用编程语言无关的.srv文件定义,编译过程中生成对应的代码文件
    话题与服务的区别

在这里插入图片描述

  • 参数:全局共享字典。

二、文件系统
在这里插入图片描述
第一个src里面再编译后会有一个CMakeLists.txt。

使用:
  ROS的文件系统使用有两种情况,1是工作空间,2是单个功能包。
1、对于工作空间的创立(可能有多个功能包)
创建工作空间

mkdir ws
cd ws , 
mkdir src/
cd src
catkin_init_workspace  初始化(会产生第一个src文件夹下的CMakeLists.txt)
创建功能包(src下面)

一个功能包包括:CMakeLists.txt; package.xml; src; include等。

编译工作空间
在ws里面 catkin_make 也可只对某一个功能包编译
catkin_make DCATKIN_WHITELIST_PACKAGES=“需要单独编译的包名”
设置环境变量
source devel/setup.bash
由于每一个source只在一个终端有效,因此可以加上
echo “source ~ /ws/devel/setup.bash”>>~/.bashrc,就不用在每个终端下设置环境变量了。
这时生成的可执行文件再build/工程名/下

创建功能包
a、创建catkin软件包(src下面)
catkin_create_pkg 包名 依赖
b、创建一个catkin工作区并生效配置文件
在根目录下catkin_make一下,要将这个工作空间添加到ROS查找中,需要source一下生成的配置文件
source devel/setuo.bash
当打开一个新的终端时,环境可能会被重置,还要手动source一下。
c、构建软件包(只要安装了这个包的所有依赖项,就可以开始编译软件包了)
  使用catkin_make指令(和上面的2一样啊)会在工作空间中生成build和devel。build是构建空间的默认位置,cmake和make在这里被调用来配置和构建软件包而devel目录是开发空间的默认位置, 在安装软件包之前,这里可以存放可执行文件和库。 可以认为catkin_make是在标准的CMake工作流程中依次调用了cmake和make,所谓标准的CMake工作流程如下:
在CMake工作空间下

$ mkdir build
$ cd build
$ cmake ..
$ make

  但是直接运行以上指令是无效的,因为根目录下没CMakeLists.txt文件,当有这个文件时,可以使用上面的指令

2、对于单个功能包的编译
一般就是个功能包,进入文件夹
mkdir bulid
cd bulid
cmake …
make
即可
自己写的时候也可以,

二、节点
  这是ROS软件包中的一个可执行文件。节点通过ROS客户端和其他节点通信,节点可以发布或订阅话题,也可以提供或使用服务。

rosrun pkg_name node_name 可以直接运行软件包内的节点而不需要知道包的路径
//更改节点名称
$ rosrun pkg_name node_name __name:=my_turtle

三、
1、话题(topic)
  两个节点之间可以通过话题相互进行通讯,可使用rqt_graph来显示当前运行的节点和话题
rostopic echo [topic] 可以显示在某个话题上发布的数据
2、消息
  话题的通信是通过节点间发送ROS消息实现的,发布者和订阅者必须发送和接受相同 类型 的消息,话题的类型是由它上面消息的类型决定的,通过rostopic type [topic] 查看消息的类型

  使用rostopic pub可以将数据发布到当前某个正在广播的话题上
rostopic pub -1 [topic] [msg_type] – [args]

  • [topic]要发布到的话题的名称 [msg_type]使用的消息的类型
  • -1 只发布一条信息然后推出 – 这一选项(两个破折号)用来告诉选项解析器,表明之后的参数都不是选项

四、
1、服务(service)
  服务是节点间的另一种通讯方式,允许节点发送一个请求并获得一个响应

rosservice calll [service] [args]  用给定的参数调用服务
rosparam能让我们在ROS参数服务器上存储和操作数据,使用rosparam list 可以看到节点在参数服务器上的参数
rosparam set [param_name] [args] 可以设置参数,使用 rosservice call /clear 使得修改的参数生效

rosed
利用rosed可以直接通过软件包名编辑包中的文件,无需键入完整路径
rosed [pkg_name] [file_name]

五、
1、创建ROS消息和服务

  • msg(消息):msg文件就是文本文件,用于描述ROS消息的字段。它们用于为不同编程语言编写的消息生成源代码。
  • srv(服务):一个srv文件描述一个服务。它由两部分组成:请求(request)和响应(response)。
  • msg文件存放在软件包的msg目录下,srv文件则存放在srv目录下。

2、使用msg
创建msg
在pkg里面创建msg文件夹,定义一个新的消息echo “int64 num” > msg/Num.msg (创建和定义)
为确定msg文件能够被转化成程序语言的源代码,需要在package.xml里加入
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
在CMakeLists.txt文件里已经存在的find_package调用添加message_generation项,直接将message_generation加入到find_package里就行
还要确保导出消息的运行时依赖关系:

    catkin_package(
      ...
      CATKIN_DEPENDS message_runtime ...
      ...)
找到如下代码块:
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )
删除#符号来取消注释,然后将Message*.msg替换为你的.msg文件名,就像下边这样:
取消下面的几行注释
# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )
使用rosmsg show msg_name 来查看(记得catkin_make 和source)

3、使用srv
需要上面的13步


编写简单的发布者和订阅者
  创建发布者节点(可执行文件),该节点将不断广播消息
在pkg中创建src来放源代码文件,创建talker.cpp
流程:

  • 初始化ROS系统
  • 向主节点宣告我们要在那个话题上发布什么类型的信息
  • 发送信息的频率

  创建订阅者节点,创建listener.cpp
流程:

  • 初始化ROS系统
  • 订阅话题
  • 开始spin自循环,等待消息的到达
  • 当消息到达后,调用回调函数
    修改CMakeLists.txt,创建可执行文件talker和listener
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)

2、测试发布者和订阅者
roscore
工作空间中catkin_make和source一下
rosrun pkg_name 发布者——name
打开新终端,catkin_make和source一下
rosrun pkg_name 订阅者——name


编写简单的服务和客户端
创建服务节点,在src中创建.cpp
1、录制和回放数据
创建临时目录用来记录数据
mkdir file_name
cd file_name
rosbag record topic
rosbag play topic
2、从bag文件中读取消息
通过rosbag info bag_name查看话题名称(记录了哪些话题的数据)
运行roscore
订阅话题并复读该话题上发布的所有内容,同时用tee命令转储到一个yaml格式的文件中以便之后查看:
rostopic echo /topic_name | tee topic1.yaml
play bag文件
上面这种读取消息的方式很缓慢,可以使用ros_readbagfile脚本提取感兴趣的话题
通过rosbag info bag_name查看话题名称(记录了哪些话题的数据)
然后使用ros_readbagfile,大体格式如下:
ros_readbagfile <mybagfile.bag> [topic1] [topic2] [topic3] […]
如:
time ros_readbagfile demo.bag /obs1/gps/fix /diagnostics_agg | tee topics.yaml

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值