ROS之初见Hello World
前言
最近在玩ROS,笔记中断了一段时间。
ROS即Robot Operating System,机器人操作系统,是一个开源框架,主力语言是C++和python,提供了硬件抽象、设备驱动、库函数、可视化、消息传递和软件包管理等诸多功能。
咱先抛开机器人不谈,ROS的设计思路还是值得学习的,它内部的最小运行单位是节点(node),运行时,启动很多节点,每个节点完成一种特定的功能,且每个节点直接可以通信。相似功能的节点组成一个包(package)。从原理上讲,一个节点就是一个进程,多个节点的通信就是进程间的通信,而ROS中的进程间通信不是传统服务器中的管道、消息队列这些,而是基于TCP/IP协议的通信。
ROS框架中的进程间通信的方式有多种,像发布-订阅者模式和流行的开源中间件是一样的,其底层协议也是TCP和RPC,这个在后面文章中会详细说明。
先来熟悉一下ROS,就先从Hello World开始吧!!!
1、创建工作空间
在需要防止代码的地方打开命令行
#新建工作空间文件夹
mkdir catkin_ws && cd catkin_ws
#新建src文件夹
mkdir src
#初始化src目录,生成CMakeLists.txt,为功能包编译配置
cd src
catkin_init_workspace
这时候src目录下会出现CMakeLists.txt,指令提示如下:
Creating symlink "/home/eco/project/MyCode/test_ws/src/CMakeLists.txt" pointing to "/opt/ros/kinetic/share/catkin/cmake/toplevel.cmake"
可知,这个CMakeLists.txt只是一个ROS库中的链接,后面不要更改它
#回到工作空间,并对工作空间进行一次编译
cd ..
catkin_make
这时候,工作区下面会出现 build 和 devel 两个文件夹以及 .catkin_workspace 文件
#配置环境变量,使新建的工作空间可用
source devel/setup.bash
#查看配置的变量
echo $ROS_PACKAGE_PATH
到此,一个新的ROS工作空间已经创建完成
一个工作空间可以包含多个功能包,所有的功能包都在工作空间的src目录下
2、创建功能包
现在,我们想创建一个功能包,名称是 hello_world
#到工作空间的src目录下创建功能包
cd src
catkin_create_pkg hello_world
这时,工作空间的 src 目录下出现 hello_world 文件夹,这个名称就是功能包的名称及其唯一标志符,功能包创建完成
3、编写功能包源代码
本次,我们编写一个能打印 hello world 的程序
我们在功能包的目录新建一个 src 文件夹,用于存放C++的源代码,这个不是必须的,但是出于规范考虑,最好这样做,便于组织代码结构
cd hello_world
mkdir src && cd src
#创建代码文件
touch my_hello_world_node.cpp
在 my_hello_world_node.cpp 中编写代码
#include "ros/ros.h"
//ros.h是ROS提供的C++客户端库,后面需要在编译配置中添加依赖库roscpp
int main(int argc,char **argv)
{
//初始化ros节点并知名节点名称
//程序运行后,ros的计算图中被注册为hello_node名称标识的节点
ros::init(argc,argv,"hello_node");
//声明一个ros节点句柄,初始化ros节点必须的
ros::NodeHandle nh;
//ROS_INFO_STREAM是roscpp库中的打印信息方法,这里打印一个字符串
ROS_INFO_STREAM("hello world!!!");
}
4、功能包编译配置
这时候的工作空间是有两个 CMakeLists.txt 的,工作空间下的是链接,不要更改,修改功能包中的CMakeLists.txt,本次修改的内容有下面几种
4.1、添加依赖项
因为代码中用到了 ros/ros.h ,因此需要 roscpp 库
find_package(catkin REQUIRED COMPONENTS roscpp)
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
修改功能包目录下的 package.xml 文件,找到 <buildtool_depend>catkin</buildtool_depend>,并在下面添加内容:
<build_depend>roscpp</build_depend>
<build_export_depend>roscpp</build_export_depend>
<exec_depend>roscpp</exec_depend>
4.2、声明可执行文件
add_executable(my_hello_world_node src/my_hello_world_node.cpp)
#链接时需要链接哪些库,在find_package中定义
target_link_libraries(my_hello_world_node ${catkin_LIBRARIES})
至此,功能包的编译配置完成
5、功能包编译
前面说过,一个工作空间可以有多个功能包,因此编译功能包有两种方式:
- 编译工作空间内的所有功能包;
- 编译工作空间内的指定功能包;
5.1、编译所有功能包
cd ~/project/catkin_ws/
catkin_make
5.2、编译指定功能包
使用 DCATKIN_WHITELIST_PACKAGES 参数指定
cd ~/project/catkin_ws
catkin_make -DCATKIN_WHITELIST_PACKAGES="hello_world"
6、功能包启动运行
先启动ROS节点管理器,这个是所有节点运行的基础
roscore
然后激活工作空间
cd ~/project/catkin_ws
source devel/setup.bash
最后启动功能包中的节点
rosrun hello_world my_hello_world_node
rosrun 指令的第一个参数是功能包名,第二个参数是需要启动的节点名
输出
[ INFO] [1620370500.474021642]: hello world!!!
到此,第一个程序完成,后面会继续学习ROS和C++,并深入框架层面,研究其原理。
ROS之初见Hello World的更多相关文章
- 阿里云VPS服务器,ROS内网穿透
Aliyun Windows Server 2008 R2中建立vpn服务器,ros中使用pptp拨号连接 2.在Aliyun服务器中,修改hosts,将内网分配的ip映射到指定的域名,在Aliyun ...
- QT下调试基于ros的catkin项目
1.首先告诉qt ros的搜索路径,通过修改qt creator 桌面启动程序来实现 sudo gedit ~/.local/share/applications/DigiaQtOpenSour ...
- ROS学习(三)—— ROS文件系统
一.预备工作 使用ros0tutorials程序包,先下载: sudo apt-get install ros-<distro>-ros-tutorials 其中<distro> ...
- ROS学习(二)—— 配置ROS环境
一.管理环境 p { margin-bottom: 0.25cm; line-height: 120% } a:link { } 如果你在查找和使用ROS软件包方面遇到了问题,请确保你已经正确配置了脚 ...
- ROS学习(一)—— 环境搭建
一.配置Ubuntu软件仓库且选择ROS正确版本 二.添加source.list sudo sh -c 'echo "deb http://packages.ros.org/ros/ubun ...
- MongoDB 初见指南
技术若只如初见,那么还会踩坑么? 在系统引入 MongoDB 也有几年了,一开始是因为 MySQL 中有单表记录增长太快(每天几千万条吧)容易拖慢 MySQL 的主从复制.而这类数据增长迅速的流水表, ...
- [ROS] Studying Guidance
Reference: https://www.zhihu.com/question/35788789 安装指南:http://wiki.ros.org/indigo/Installation/Ubun ...
- ros::spin() 和 ros::spinOnce() 区别及详解
版权声明:本文为博主原创文章,转载请标明出处: http://www.cnblogs.com/liu-fa/p/5925381.html 博主提示:本文基于ROS Kinetic Kame,如有更(g ...
- Learning Roadmap of Robotic Operating System (ROS)
ROS Wiki: http://wiki.ros.org/ Robots Using ROS Textbooks: A Gentle Introduction to ROS Learning ROS ...
随机推荐
- SynchronousQueue核心源码分析
一.SynchronousQueue的介绍 SynchronousQueue是一个不存储元素的阻塞队列.每一个put操作必须等待一个take操作,否则不能继续添加元素.SynchronousQueue ...
- [倍增]luogu P4155 [SCOI2015]国旗计划
题面 https://www.luogu.com.cn/problem/P4155 问在环上最少取多少个区间能完全覆盖环 分析 首先发现是环,先把端点变为2n方便处理,注意离散化 其次要删去贡献不如其 ...
- 【Django笔记2】-创建应用(app)与模型(models)
1,创建应用(app) 一个完善的网站需要许多功能提供不同的服务.如果所有的功能都在一个文件中,不利于项目多人共同开发,以及后续的维护.此时可以针对一个要实现的功能,创建一个app,将多个app结 ...
- [Design Pattern With Go]设计模式-工厂模式
这次介绍的设计模式是工厂模式,这是一个比较常见的创建型模式.一般情况下,工厂模式分为三种:简单工厂.工厂方法和抽象工厂,下面慢慢举例介绍下. 简单工厂 考虑一个加密程序的应用场景,一个加密程序可能提供 ...
- Linux 磁盘管理(df fu fdisk mkfs mount)
Linux 磁盘管理 Linux磁盘管理好坏直接关系到整个系统的性能问题. Linux磁盘管理常用三个命令为df.du和fdisk. df : 列出文件系统的整体磁盘使用量 du : 检查磁盘空间使用 ...
- Qt开发技术:图形视图框架(一)基本介绍
前话 使用到Qt的视图框架. Qt视图框架介绍 简介 图形视图框架(The Graphic View Framework)用于管理和与大量定制的二维图形项目交互,以及用于可视化项目的视图小 ...
- 数据库MySQL四
一.测试题 二.复习 说明:sql中的函数分为单行函数和分组函数 调用语法:select 函数名(实参列表); 1>字符函数 concat(str1,str2,..):拼接字符 substr(s ...
- Druid 监控分布式解决方案
什么是 Druid Monitor Druid 是一个非常强大的数据库连接池,但是它的强大并不仅仅体现在作为一个高性能连接池加快数据访问上和连接管理上,它内置了一个强大的监控工具:Druid Moni ...
- 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之创建实例-12
自动化kolla-ansible部署ubuntu20.04+openstack-victoria之创建实例-12 欢迎加QQ群:1026880196 进行交流学习 实例创建 1. 创建 2. 查 ...
- 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之文件配置-08
自动化kolla-ansible部署ubuntu20.04+openstack-victoria之文件配置-08 欢迎加QQ群:1026880196 进行交流学习 文件配置 #controller ...