最近一直在搞机器人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 ¬es); //从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 只播放某个话题