我是靠谱客的博主 阳光糖豆,最近开发中收集的这篇文章主要介绍ros机器人高效编程 | 第2章 ROS架构及概念,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 2.1理解ROS文件系统级
      • 2.1.1工作空间
      • 2.1.2功能包
      • 2.1.3元功能包
      • 2.1.4消息
      • 2.1.5 服务
    • 2.2理解ROS计算图级
      • 2.2.1节点与nodelet
      • 2.2.2主题
      • 2.2.3服务
      • 2.2.4消息
      • 2.2.5消息记录包
      • 2.2.6节点管理器
      • 2.2.7参数服务器
    • 2.4ROS试用练习
      • 2.4.1ROS文件系统导览
      • 2.4.2创建工作空间
      • 2.4.3创建ROS功能包和元功能包
      • 2.4.4编译功能包
      • 2.4.5使用ros节点
      • 2.4.7 如何使用服务
      • 2.4.8 使用参数服务器
      • 2.4.9创建节点
      • 2.4.10编译节点
      • 2.4.11 创建msg和srv文件
      • 2.4.12 使用新建的srv和msg文件
      • 2.4.13 launch文件

ROS架构:

  • 文件系统级(Filesystem level):ROS的内部构成、文件夹结构、工作所需的核心文件。
  • 计算图级(Computation Graph level):进程和系统之间的通讯
  • 社区级(Community level):工具和概念

2.1理解ROS文件系统级

在这里插入图片描述

2.1.1工作空间

|---catkin_ws
	|---build:编译空间(build space),
	|   |--catkin 
	|   |--CmakeFiles	 为功能包和项目保存缓存信息、配置和其他中间文件
	|   ...
	|--devel:开发空间(Development space),用来保存编译后的程序
	|--src:源文件空间(Source space)

2.1.2功能包

|--myPkg
	|--include/package_name/:库的头文件
	|--msg/:定义非标准的消息
	|--scripts/:Bash、python等可执行脚本
	|--src/:源文件
	|--srv/:服务类型
	|--CMakeLists.txt : cmake的生成文件
	|--package.xml :功能包清单文件

node:package.xml的两个典型标记:
1.<build_depend>:当前功能包安装之前会先安装哪些功能包,新的功能包会使用这些包的功能
2.<run_depend>:运行功能包中的代码所需要的包

2.1.3元功能包

只有package.xml的特殊包

2.1.4消息

ROS通过一种简化的消息类型描述语言来描述ROS节点发布的数据值,通过这样的描述语言,ROS能够使用多种编程语言生成不同类型消息的源代码。
字段(field):数据的类型
常量(constant):字段的名称
例如:msg/myMsg.msg

int32    id
float    vel
string   name 

node:标头类型

unit32		seq
time		stamp
string		frame_id

主要用于添加时间、坐标系和序列号。正是通过标头类型才能够记录当前机器人运行的时间戳和坐标系

2.1.5 服务

实现节点之间的请求/响应通讯,srv/xxx.srv

2.2理解ROS计算图级

ROS会创建一个连接所有进程的网络,任何节点都可以访问该网络,并通过该网络与其他节点交互(信息的发布与接收)
在这里插入图片描述

2.2.1节点与nodelet

节点是各自独立的可执行文件,能够通过主题、服务器或参数服务器与其他进程(节点)通信。ROS通过使用节点将代码和功能解耦,提高了系统的容错能力和可维护性,是系统简化。
nodelet(动态加载节点),可以在单个进程中运行多个节点,每个nodelet为一个线程。这样可以不使用ROS网络的情况下与其他节点通信,效率高、避免网络拥塞。(摄像头、3D传感器爱数据传输)
ROS提供了处理节点和显示节点信息的工具,如rosnode

rosnode list:列出当前活动的节点
rosnode info NODE:输出节点信息
rosnode kill NODE:结束当前运行的节点
rosnode machine hostname :列出某一特定计算机上运行的节点
rosnode ping NODE:测试节点间的联通性
rosnode cleanup: 将无法访问的注册信息清除

Node:启动节点时更改参数(节点名称、主题名称、参数名称)

rosrun book_turtorials turtorialX topic1:=/topic2	  //topic1 改为 topic2
Rosrun book_tutorials tutorialX _param:=9.0	  //参数param改为 9.0(在param前加 _)

2.2.2主题

节点之间用来传输消息的总线
rostopic 工具:

rostopic list :消息列表
rostopic echo /topic :输出消息
rostopic info /topic :主题的信息(消息类型 订阅者、发布者)
rostopic bw /topic :带宽
rotopic hz /topic :频率
rostopic find message_type :按照类型查找主题
rostopic pub /topic type args :将数据发布到主题
rostopic type /topic: 输出主题的类型

2.2.3服务

直接与节点通讯并获取应答,服务由用户开发,节点不提供标准服务。
rosservice 工具:

rosservice list :服务清单
rosservice info /service :输出服务信息
rosservice call /service args: 根据命令行参数调整服务
rosservice find msg_type :按照类型查找服务
rosservice uri /service :输出服务的ROSRPC URI
rosservice type /service: 输出服务的类型

2.2.4消息

一个节点通过向特定的主题发布消息,从而将消息发送到另一个节点,消息具有简单的数据结构,包括ROS提供的【标准类型】和用户【自定义类型】。
自定义消息类型:包名/文件名.msg 如std_mags/String.msg 的消息类型std_mags/String
rosmsg工具:

rosmsg list :列出所有消息
rosmsg show :显示一条消息的字段
rosmsg package:列出包中的所有消息
rosmsg users: 搜索使用该消息类型的代码文件
rosmsg md5:显示一条消息的md5求和结果

2.2.5消息记录包

用.bag的格式保存【消息】、【主题】、【服务】和【其他ROS数据信息】,用可视化工具打开

rosbag : 用来录制、播放和执行其他操作
rqt_bag:用于可视化图形环境中的数据
rostopic :帮助查看节点发布的主题

2.2.6节点管理器

roscore运行,使ros节点之间能够互相查找

2.2.7参数服务器

节点通过此服务器来存储和检索运行时的参数

2.4ROS试用练习

创建包、使用节点、使用参数服务器、例子

2.4.1ROS文件系统导览

【1】 查看ros中新增加的内容,安装新功能包后使用

rospack profile

【2】 查看功能包的路径

rospack find pkg_nanme

【3】 查找元功能包

rosstack find pkg_name

【4】 查看功能包下文件列表

rosls pkg_name

【5】 进入功能包路径

roscd pkg_name 

2.4.2创建工作空间

step[1]: 创建工作空间

mkdir catkin_ws //!!创建工作空间文件夹
cd catkin_ws 
mkdir src 	//!! 源文件
cd src 
catkin_init_workspace //!! 初始化工作空间 
cd ..
catkin_make  //!!  编译

step[2] :在bash中添加新建工作空间路径

//-- 打开bashrc文件
sudo gedit ~/.bashrc 
//-- 在文末添加以下内容,保存退出
source ~/catkin_ws/devel/setup.bash
//-- 使路径生效
cd catkin_ws 
source devel/setup.bash

step[3]:查看工作空间

echo $ROS_PACKAGE_PATH

2.4.3创建ROS功能包和元功能包

cd catkin_ws/src 
catkin_create_pkg pkg_name std_msgs roscpp 
// std_msgs 依赖项【1】包含常见消息类型
// roscpp   依赖项【2】使用c++实现ROS的功能

2.4.4编译功能包

cd catkin_ws 
catkin_make // 方式【1】 编译工作空间的所有功能包
catkin_make -pkg pkg_name // 方式【2】单独编译一个功能包(pkg_name)

2.4.5使用ros节点

以turtlesim功能包为例子

//-- 安装
sudo apt-get install ros-kinetic-ros-tutorials
//-- 启动ros
roscore 
//-- 获得节点信息
rosnode 
//-- 启动turtlesim
rosrun turtlesim turtlesim_node
//-- 启动teleop_tuetle 节点
rosrun turtlesim turtle_teleop_key
//-- 查看话题
rostopic list 
//-- /turtle1/cmd_vel 控制乌龟运动的话题
rostopic info /turtle1/cmd_vel
// 消息类型: geometry_msgs/Twist 发布者:teleop_tuetle  接收者 turtlesim
//-- 消息具体值
rostopic echo /turtle/cmd_vel
//-- 通过命令行向 turtlesim 发布话题
// rostopic pub [话题名] [消息类型] [频率]  [消息]
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 10 '{linear:{x: 1,y: 0,z: 0},angular:{x: 0,y: 0,z: 1}}'
// node: [x: 1] x: 后有空格

2.4.7 如何使用服务

服务是节点之间通讯的另一种方法,服务允许节点发送请求和接收响应

同样以turtlesim为例

//-- 启动ros
roscore 
//-- 启动turtlesim
rosrun turtlesim turtlesim_node
//-- 启动teleop_tuetle 节点
rosrun turtlesim turtle_teleop_key
//-- 查看服务
rosservice list 
//-- 查看某个服务的类型
rosservice type /clear
//-- 调用服务(清除轨迹线)
rosservice call /clear
//-- 查看某类型的消息
rosservice type /spawn
rossrv show turtlesim/Spawn
// 等同于
rosservice type /spawn | rossrv show
/*
float32  x
float32  y
float32  theta
string  name 
---
string name 
*/ 
//-- 调用服务  
rosservice call /spawn 3 3 0.2 "new_turtle" //3 3 0.2 "new_turtle"对应 x y theta name 

2.4.8 使用参数服务器

参数服务器用于存储所有节点都可访问的数据,用rosparam工具来管理参数服务器。

rosparam set parameter value  //设置参数值
rosparam get parameter        //获取参数
rosparam load file            // 从文件中加载参数
rosparam dump file 			  //将参数存储到文件
rosparam delete parameter     // 删除参数
rosparam list 				  // 列出参数列表

更新2020/11/02

2.4.9创建节点

1.在ch2的src下创建 exampl1_a.cpp

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sstream>

int main(int argc,char**argv)
{
	//--step1:创建节点
	ros::init(argc,argv,"example1_a");
	//--step2:创建句柄
	ros::NodeHandle n;
	//--step3:创建发布者
	ros::Publisher ch2_pub=n.advertise<std_msgs::String>("message",1000);
	//--step4:设置频率
	ros::Rate loop_rate(10);
	//--step5:发布消息
	while(ros::ok())
	{
		//--step5.1:创建消息变量
		std_msgs::String  msg; //!!待发布的消息
		std::stringstream ss;	 //!!
		ss<<"i am the example1_a node";
		msg.data=ss.str();
		//--step5.2:发布消息
		ch2_pub.publish(msg);
		//--step5.3:
		/**
		 * spinOnce 函数负责处理所有的ROS内部事件(如读取订阅的消息)
		 * 与spin函数不同,spinOnce在不中断的情况下运行主程序
		 */
		ros::spinOnce();
		//--step5.4:10HZ的频率将程序挂起
		loop_rate.sleep();
	}
	return 0;	
}

2.在ch2的src下创建example1_b.cpp

#include <ros/ros.h>
#include <std_msgs/String.h>

void callBack(const std_msgs::String::ConstPtr& msg)
{
	ROS_INFO("i heard:[%s]",msg->data.c_str());
	
}
int main(int argc,char** argv)
{
	ros::init(argc,argv,"example1_b");
	ros::NodeHandle n;
	ros::Subscriber ch2_sub=n.subscribe<std_msgs::String>("message",1000,callBack);
	ros::spin();
	return 0;
}

2.4.10编译节点

1.修改CMakeList.txt,添加如下

//!!Declare a C++ executable With catkin_make all packages are built within a single CMake context.
//!! The recommended prefix ensures that target names across packages don't collide
add_executable(example1_a src/example1_a.cpp)
add_executable(example1_b src/example1_b.cpp)

//!! Specify libraries to link a library or executable target against
target_link_libraries(example1_a 
 ${catkin_LIBRARIES}
)
target_link_libraries(example1_b 
 ${catkin_LIBRARIES}
)

2.编译

catkin_make --pkg ch2

3.运行

//-- 终端1
roscore
//-- 终端2 
rosrun ch2 example1_a
//-- 终端3
rosrun ch2 examle1_b

2.4.11 创建msg和srv文件

1.创建msg

//--ch2文件下
mkdir msg
cd msg
touch ch2_msg1.msg
//-- 写入以下内容
int32 A
int32 B
int32 C

2.创建srv

//-- ch2文件下
mkdir srv
cd srv
touch ch2_srv1.srv
//--写入以下内容
int32 A
int32 B
int32 C
---
int32 sum
/*
“---”以上节点发给服务  
“---”以下服务发给节点
*/

3.修改package.xml,添加如下:

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

4.修改CMakeList.txt

//-- 1.find_packsge
find_package(catkin REQUIRED COMPONENTS
  roscpp
  std_msgs
  message_generation
)
//-- 2.
add_message_files(
   FILES
   ch2_msg1.msg
)
//-- 3.
add_service_files(
  FILES
  ch2_srv1.srv
)
//-- 4.
generate_messages(
  DEPENDENCIES
  std_msgs
)
//-- 5.
catkin_package(
 CATKIN_DEPENDS roscpp std_msgs message_runtime
)

5.编译、查看

catkin_make --pkg ch2
rosmsg show ch2/ch2_msg1
rossrv show ch2/ch2_srv1

2.4.12 使用新建的srv和msg文件

2.4.13 launch文件

问题:ros话题和服务的区别?
回答:ROS话题和服务
node1:xx.xml的命名貌似不能数字开头 …
node2:在调试时出现修改后还显示之前的信息,关闭所用终端 删除build devel 重新打开终端运行

拓展1:XML
在这里插入图片描述
(1)第一bai个是XML的声明,其中version属性是必du须写的。

(2)encoding属性的值表示用于读取文zhi档的字符集,第二个是一个文档定义的描述。

(3)第三个是一个命名空间的引用,可以关联到特定的命名空间

2、XML简介

(1)XML 指可扩展标记语言(EXtensible Markup Language)。

(2)XML 是一种很像HTML的标记语言。

(3)XML 的设计宗旨是传输数据,而不是显示数据。

(4)XML 标签没有被预定义。您需要自行定义标签。

(5)XML 被设计为具有自我描述性。

(6)XML 是 W3C 的推荐标准。

3、XML 和 HTML 之间的差异

(1)XML 不是 HTML 的替代。

(2)XML 和 HTML 为不同的目的而设计:

(3)XML 被设计用来传输和存储数据,其焦点是数据的内容。下面是一个便签,存储为XML
在这里插入图片描述
(4)HTML 被设计用来显示数据,其焦点是数据的外观。

(5)HTML 旨在显示信息,而 XML 旨在传输信息。

最后

以上就是阳光糖豆为你收集整理的ros机器人高效编程 | 第2章 ROS架构及概念的全部内容,希望文章能够帮你解决ros机器人高效编程 | 第2章 ROS架构及概念所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(52)

评论列表共有 0 条评论

立即
投稿
返回
顶部