ROS基础学习(超全学习记录)

最近一直在搞机器人slam,需要在ros中进行操作,ros就一些基础的知识做了简单的记录,供学习时翻看使用

一、ROS工程结构

1.1 catkin工作空间

Catkin工作空间是创建、修改、编译catkin软件包的目录。catkin的工作空间,直观的形容就是一个仓库,里面装载着ROS的各种项目工程,便于系统组织管理调用。

catkin的结构十分清晰,它包括了src、build、devel三个路径,在有些编译选项下也可能包括其他。但这三个文件夹是catkin编译系统默认的。它们的具体作用如下:

src/: ROS的catkin软件包(源代码包)

build/: catkin(CMake)的缓存信息和中间文件

devel/: 生成的目标文件(包括头文件,动态链接库,静态链接库,可执行文件等)、环境变量
1.2 软件包

Package不仅是Linux上的软件包,也是catkin编译得基本单元,我们使用 catkin_make 编译的对象就是每 个ROS的package。

+-- PACKAGE
    +-- CMakeLists.txt # package的编译规则(必须)
    +-- package.xml # package的描述信息(必须)
    +-- src/ # 源代码
    +-- include/ # 头文件
    +-- scripts/ # 可执行脚本
    +-- msg/ # 自定义消息
    +-- srv/ # 自定义服务
    +-- models/ # 3D模型文件
    +-- urdf/
    +-- launch/
  • CMakeLists.txt: 定义package的包名、依赖、源文件、目标文件等编译规则,是package不可少的成 分

  • package.xml: 描述package的包名、版本号、作者、依赖等信息,是package不可少的成分

  • src/: 存放ROS的源代码,包括C++的源码和(.cpp)以及Python的module(.py)

  • include/: 存放C++源码对应的头文件

  • scripts/: 存放可执行脚本,例如shell脚本(.sh)、Python脚本(.py)

  • msg/: 存放自定义格式的消息(.msg)

  • srv/: 存放自定义格式的服务(.srv)

  • models/: 存放机器人或仿真场景的3D模型(.sda, .stl, .dae等)

  • urdf/: 存放机器人的模型描述(.urdf或.xacro)

  • launch/: 存放launch文件(.launch或.xml)

开发自己的软件包:

catkin_create_pkg "packageName" "depends" 

自动生成的结构:

+-- test_pkg
    --- CMakeLists.txt
    +-- include
    +-- test_pkg
    --- package.xml
    +-- src
​

常用的depends软件包:

std_msgs 标准message(见3.2.3)
rospy python语言接口
roscpp C++语言接口
​
cmake常用命令
cmake_minimum_required() #CMake的版本号
project() #项目名称
find_package() #找到编译需要的其他CMake/Catkin package
catkin_python_setup() #catkin新加宏,打开catkin的Python Module的支持
add_message_files() #catkin新加宏,添加自定义Message/Service/Action文件
add_service_files()
add_action_files()
generate_message() #catkin新加宏,生成不同语言版本的msg/srv/action接口
catkin_package() #catkin新加宏,生成当前package的cmake配置,供依赖本包的其他软件包调用
add_library() #生成库
add_executable() #生成可执行二进制文件
add_dependencies() #定义目标文件依赖于其他目标文件,确保其他目标已被构建
target_link_libraries() #链接
catkin_add_gtest() #catkin新加宏,生成测试
install() #安装至本机
package.xml 常用标签
<pacakge> 根标记文件
<name> 包名
<version> 版本号
<description> 内容描述
<maintainer> 维护者信息
<license> 软件许可证
<buildtool_depend> 编译构建工具,通常为catkin
<build_depend> 编译依赖项,与Catkin中的
<run_depend> 运行依赖项

二、ROS通信架构

2.1、Master与node

1、Master

节点管理器,每个node启动前要向master注册,管理node之间的通信

2、roscore

启动master,也会启动rosout(日志管理)和parameter server(参数管理器)

3、node

ROS的进程、pkg里可执行文件运行的实例

$rosrun [pkg_name] [node_name] #启动
$rosnode list  #列出当前运行的node信息
$rosnode info [node_name] #显示某个node的详细信息
$rosnode kill [node_name] #结束某个node

4、roslaunch

启动master和多个node

$ roslaunch [pkg_name] [file_name.launch]

launch常用的标签

<launch> <!--根标签-->
    <node> <!--需要启动的node及其参数-->
    <include> <!--包含其他launch-->
    <machine> <!--指定运行的机器-->
    <env-loader> <!--设置环境变量-->
    <param> <!--定义参数到参数服务器-->
    <rosparam> <!--启动yaml文件参数到参数服务器-->
    <arg> <!--定义变量-->
    <remap> <!--设定参数映射-->
    <group> <!--设定命名空间-->
</launch> <!--根标签-->
​
2.2、Topic和msg

1、ROS中的异步通信方式,Node之间通过publish-subscribe机制通信

2、 一个Topic可以有多个Subscribers、多个Publishers

3、使用topic通信必须遵照指定的格式。topic是单向通信机制,发出方称为publisher,接受方称为subscriber。常用的topic相关命令有:

$ rostopic list  #列出当前所有的topic
$ rostopic info "topic_name"  #显示某个topic的属性信息,可查看publi sher和subscriber等
$ rostopic echo "topic_name"  #显示某个topic的内容
$ rostopic pub "topic_name" "value" ...  #向某个topic发布内容
​

4、 topic通信需要遵守预定义好的格式,这种格式被称为message(msg)。message的定义常放在*.msg文件中,基本的msg包括:

bool,int8,int16,int32,int64,float32,float64,string,time,duration,header,可变长数组array[],固定长度数组array[C]
$ rosmsg list  #列出系统所有的msg
$ rosmsg show /msg_name #显示某个msg内容
 
2.3、Service(多对一)和src

1、同步通信方式,Node之间通过request-reply方式通信

2、service是一种临时双向通信机制,它不仅可以发送消息,同时还会有反馈。所以 service 包括两部分,一部分是请求方(Clinet),另一部分是应答方/服务提供方(Server)。当需要某个数据时,Client就会发送一个request,等待server处理反馈回一个reply,这样通过类似"request-reply"的机制完成整个服务通信。

3、常用代码:

$ rosservice list #显示服务列表
$ rosservice info #service信息,可以查看server
$ rosservice type #打印服务类别
$ rosservice find #按服务类别查找服务
$ rosservice call #使用所提供的args调用服务
$ rosservice args #打印服务参数

4、srv,Service通信的数据格式,定义在*.srv中

举例:

my_pkg/srv/DetectHuman.src

    bool start_detect
    ---
    my_pkg/HumanPose[] pose data
my_pkg/msg/HumanPose.msg

    std_msgs/Header header
    string uuid
    int32 number_of_joints
    my_pkg/JointPos[] joint_data
my_pkg/msg/JointPos.msg

    string joint_name
    geometry_msgs/Pose pose
    float32 confidence

定义好之后要去修改package.xml(添加依赖),修改CMakeList.txt 添加相应文件

2.4、Parameterserver(参数服务器)

1、存储着各种参数的字典(实际就是键值对),Key-Value

Key/rosdistro/use_sim_time...
Value'kinetic''1.12.7'true

2、可用命令行,launch文件和node(API)读写

3、用命令行读写的方法(rosparam)

$ rosparam list           #列出当前所有参数
$ rosparam get param_key  #显示某个参数的值
$ rosparam set param_key_param_value #设置某个参数的值
$ rosparam dump file_name #保存参数到文件
$ rosparam load file_name #从文件读取参数
$ rosparam delete param_key #删除参数参数
​
YAML格式举例:
name:'Zhangsan'
age:20
gender:'M'
score:{Chinese:80,Math:90}
score_history:[85,82,88,90]
2.4、Action

1、类似Service,但是带有状态反馈,通常应用在长时间可抢占的任务中

2、action 是一种异步响应的通信方式,主要补充了 service 同步通信的不足。因service 中采用同步通信机制,客户端的程序需要等到服务器响应后才能运行其他程序。一个action也有client和server,client是动作发起者,server是执行者。

3、利用action进行请求响应,action的内容格式应包含三个部分,目标、反馈、结果。

  • 目标

    • client要求server做的事情

  • 反馈

    • server给client的实时反馈

  • 结果

    • server给client的最终反馈

4、action的规范文件格式如下:

uint32 dishwasher_id # Define the goal
---
uint32 total_dishes_cleaned  # Define the result
---
float32 percent_complete # Define feedback message

5、要使用action,在CMakeLists.txt 里应该有如下的内容:

File: CMakeLists.txt
...
find_package(catkin REQUIRED genmsg actionlib_msgs actionlib)
...
add_action_files(DIRECTORY action FILES DoDishes.action)
generate_message(DEPENDENCIES actionlib_msgs)
add_action_files(DIRECTORY action FILES Handling.action)
generate_message(DEPENDENCIES actionlib_msgs)

三、常用工具

3.1、Gazebo(仿真)

1、机器人仿真工具

2、ODE物理引擎

3、用于动力学、导航、感知等任务的模拟

4、操作:左键:平移;中键:旋转;滚轮:缩放

3.2、Rviz(可视化)

3.3、Rqt(可视化)

显示的东西更高级

rqt_graph #显示通信架构
rqt_plot #绘制曲线
rqt_console #查看日志
rosrun rqt_ #查看rqt所有工具

3.4 Rosbag(记录消息)

1、ROS命令行工具,记录和回放数据流

2、rosbag工具

$ rosbag record <topic-names> #记录某些topic到bag中
$ rosbag record -a            #记录所有topic到bag中
$ rosbag paly <bag-files>     #回放bag

四、客户端库(Client Library)

  • Client Library提供ros编程的库,例如,建立node、发布消息、调用服务。。。

  • 类似于API,比API高级

  • roscpp、rospy

4.1、roscpp

1、主要包括:

ros::init()       #必备函数
ros::NodeHandle   #公共句柄,用来调用topic,service和一些接口
ros::master       #与master交互
ros::this_node    #查询进程
ros::service      #查询服务
ros::param        #查询参数管理器,不需要用到NodeHandle
ros::names        #包括处理ROS图资源名称的函数

2、ros::init()

void ros::init();   //解析ROS参数,为本node命名,::代表了作用域在ros空间下

3、ros::NodeHandle Class

常用成员函数:
//创建话题的publisher
ros::Publisher advertise(const string &topic,unit32_t queue_size);
//创建话题的subscribber
ros::Subscriber subscribe(const string &topic,unit32_t queue_size,void(*)(M));
//创建服务的server
ros::ServiceServer advertiseService(const string &service,bool(*srv_func)(Mreq&,Mreq &));
//创建服务的client
ros::ServiceClient serviceClient(const string &service_name,bool persistent=false);
//查询某个参数的值
bool getParam(const string &key,void &val);
//给参数赋值
bool setparam(const string &key,void val);

4、ros::master Namespace (命名空间)

常用函数
bool check(); //检查master是否启动
const string& getHost(); //返回master所处的hostname
bool getNodes(V_string &notes); //从master返回已知的node名称列表
bool getTopics(V_Topicinfo &topics); //返回所有正在被发布的topic列表
bool getURL(); //返回到master的URL地址
uint32_t getPort(); //返回master运行在端口
使用时无需创建对象,直接调用即可:ros::master::check();
4.2、rospy

1、Node,Topic,Service,Param,Time

2、rospy-Node

init_node(name) #注册和初始化node
get_master()    #获取master句柄
is_shutdown()   #返回是否关闭
on_shutdown(fn) #在node关闭时调用函数
get_node_uri()  #返回节点的URL
get_name()     

3、其余参考:Index of /en/api/rospy/html

五、TF & URDF

1、Transform(坐标转换,位置+姿态)

2、ROS里的TF:坐标转换的标准、话题、工具、接口

3、TF树

4、TF相关数据类型

向量             tf::Vector3
点              tf::Point
四元数           tf::Quaternion
3x3矩阵(旋转矩阵) tf::Matrix3x3
位姿             tf::Pose
变换             tf::Transform
带时间戳的以上类型  tf::Stamped<T>
带时间戳的变换     tf::StampedTransform

5、tf::TransformBroadcaster类(C++)

transformBroadcaster()
void sendTransform(const StampedTransform &transform)
void sendTransform(const std::vector<StampedTransform> &transforms)
void sendTransform(const geometry_msgs::TransformStamped &transform)
void sendTransform(const std::vector<geometry_msgs::TransformStamped> &transforms)
​

6、tf::TransformListener类

void lookupTranform(const std::string &target_frame,const std::string &source_frame,co
nst ros::Time &time,StampedTransform &transform)const
bool canTransform()
bool waitForTransform()const

7、URDF

URDF(Unified Robot Description Format)统一机器人描述格式,URDF使用XML格式 描述机器人文件。URDF语法规范,参考链接:urdf/XML - ROS Wiki,URDF组件,是由不同的功能包和组件组成

六、TF坐标变换

ROS坐标管理系统

1、查看tf树
rosrun rqt_tf_tree rqt_tf_tree 
2、TF静态坐标变换

七、rqt可视化工具集

1、rqt可视化工具集
· Node Graph  查看ros话题和节点通信的结构
· TF Tree     查看tf坐标关系链接
· Plot        图形化查看话题数据
· Dynamic Reconfigure 实时调参
· Image View   查看图片
· Bag          记录/复现  ROS进程
2、Node Graph
指令:rqt_graph
椭圆框:节点名
方形框 :话题名
·Node Only :只显示节点
·Node Topics(active):同时显示话题和节点
·Node Topics(all) :同时显示话题和节指令:

TF Tree

rosrun rqt_tf_tree rqt_tf_tree
3、Plot
rqt_plot
4、Image View
rqt_image_view
5、Bag
·rosbag record -a 记录所有话题
·rosbag play  播放一次
·rosbag play -r num  倍速播放
·rosbag play  --topic /topic_name 只播放某个话题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值