概述
文章目录
- 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架构及概念所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复