一、图概念概述
Nodes:节点,一个节点即为一个可执行文件,它可以通过ROS与其它节点进行通信。
Messages:消息,消息是一种ROS数据类型,用于订阅或发布到一个话题。
Topics:话题,节点可以发布消息到话题,也可以订阅话题以接收消息。
Master:节点管理器,ROS名称服务 (比如帮助节点找到彼此)。
rosout: ROS中相当于stdout/stderr。
roscore: 主机+ rosout + 参数服务器 (参数服务器会在后面介绍)。
1.1 节点
一个节点其实只不过是ROS程序包中的一个可执行文件。ROS节点可以使用ROS客户库与其他节点通信。节点可以发布或接收一个话题。节点也可以提供或使用某种服务。
(节点是ros中非常重要的一个概念,为了帮助初学者理解这个概念,这里举一个通俗的例子:
例如,咱们有一个机器人,和一个遥控器,那么这个机器人和遥控器开始工作后,就是两个节点。遥控器起到了下达指 令的作用;机器人负责监听遥控器下达的指令,完成相应动作。从这里我们可以看出,节点是一个能执行特定工作任 务的工作单元,并且能够相互通信,从而实现一个机器人系统整体的功能。在这里我们把遥控器和机器人简单定义为两个节点,实际上在机器人中根据控制器、传感器、执行机构等不同组成模块,还可以将其进一步细分为更多的节点,这个是根据用户编写的程序来定义的。)
rosnode 显示当前运行的ROS节点信息。rosnode list 指令列出活跃的节点: $ rosnode list
1.2 话题
turtlesim_node节点和turtle_teleop_key节点之间是通过一个ROS话题来互相通信的。turtle_teleop_key在一个话题上发布按键输入消息,而turtlesim则订阅该话题以接收该消息。
**通俗来讲:**作者和读者相当于两个节点,两者之间通过报纸平台这个(即话题)来进行通信,报纸上的内容(即信息)。作者发布(publish)话题,读者订阅(subscriber)话题。
rostopic list能够列出所有当前订阅和发布的话题。
在运行ros工程之后才能查到list,否则会报错:
ERROR: Unable to communicate with master!
查看一下list子命令需要的参数,在一个终端中运行:$ rostopic list
1.3服务
服务(services)是节点之间通讯的另一种方式。服务允许节点发送请求(request) 并获得一个响应(response)。
rosservice可以很轻松的使用 ROS 客户端/服务器框架提供的服务。
rosservice提供了很多可以在topic上使用的命令:$ rosservice list
rosservice list 输出可用服务的信息
rosservice call 调用带参数的服务
rosservice type 输出服务类型
rosservice find 依据类型寻找服务find services by service type
rosservice uri 输出服务的ROSRPC
rosservice type使用方法: rosservice type [service]
rosservice call 使用方法: rosservice call [service] [args]
执行$ rosservice call clear
正如我们所期待的,服务清除了turtlesim_node的背景上的轨迹。
二、编译运行ROS程序
编译命令:
catkin_make
如果不带任何参数的话,catkin_make 默认编译工作空间下(一般为src)的所有功能包。
编译ros获取图像时 报如下错误:
CMake Error at /opt/ros/kinetic/share/catkin/cmake/catkinConfig.cmake:83 (find_package):
Could not find a package configuration file provided by “cv_bridge” with any of the following names:
cv_bridgeConfig.cmake
cv_bridge-config.cmake
安装对应ros版本的cv-bridge包:$ sudo apt-get install ros-kinetic-cv-bridge
出现此类错误都可以用这种方式解决。
注意下载包的命令格式为:sudo apt install ros-kinetic-缺失的包名
再次编译之后可能会报无法找到usr/lib -lr 类似的错误,打开CMakeLists看最后是不是有这两句话,删除即可。正确如下:
${OpenCV_LIBRARIES}后面没有一些-l -… - …之类的东西
1.打开第一个终端—启动发布器
roscore 是在运行所有ROS程序前首先要运行的命令。
$ roscore
如果你没有退出上次在运行的roscore,那么你可能会看到下面的错误信息:
roscore cannot run as another roscore/master is already running.
Please kill other roscore/master processes before relaunching
2.打开第二个终端—飞机的通信程序
#如果使用catkin,确保你在调用catkin_make后,在运行你自己的程序前,已经source了catkin工作空间下的./devel/setup.sh文件
$ source ~/Project/ROS/catkin_ws/devel/setup.bash
$ roslaunch bebop_driver bebop_nodelet.launch
3.打开第三个终端—运行自己写的控制
$ source ~/Project/ROS/catkin_ws/devel/setup.bash
$ rosrun bebop_control bebop_control_node
rosrun 允许你使用包名直接运行一个包内的节点(而不需要知道这个包的路径)。
可以在devel/lib下查看包名和节点名,如下:
用法: $ rosrun [package_name] [node_name]
包名是CMakeLists所在的文件夹的名字,节点名是CMakeLists中定义的节点的名字。
三、CMakeLists文件
1.基本输入:
#声明cmake最低版本
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12.1)
#声明一个cmake工程
PROJECT(bebop_capture)
set(CMAKE_BUILD_TYPE "Release")
set(CMAKE_CXX_FLAGS "-std=c++11")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -Wall -g")
- opencv和catkin依赖库:
在安装ROS时内部已经安装了opencv,虽然直接在终端查不到opencv的版本,是因为其路径的原因。通过以下find_package
命令会自动查找opencv
#指定依赖库
#set(OpenCV_DIR /usr/local/share/OpenCV)
find_package(OpenCV REQUIRED)
catkin_package(CATKIN_DEPENDS message_runtime std_msgs)
2.ROS 包
#ROS包搜索
find_package(catkin REQUIRED COMPONENTS
cv_bridge
geometry_msgs
sensor_msgs
std_msgs
std_srvs
image_transport
message_generation
roscpp
rospy
)
3.include目录
#include目录
include_directories(
${OpenCV_INCLUDE_DIRS}
${catkin_INCLUDE_DIRS}
${CMAKE_CURRENT_SOURCE_DIR}/include
)
4.添加一个可执行程序
#添加一个可执行程序
#语法:add_executable(程序名 源代码文件)
add_executable(bebop_capture_node src/bebop_capture.cpp)
#将程序名链接到库上
#语法:target_link_libraries(程序名 库)
target_link_libraries(bebop_capture_node
${catkin_LIBRARIES}
${OpenCV_LIBRARIES}
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)