ros学习笔记
目录结构
|--src 源代码
| |--package 是编译的基本单位
| |--CMakeLists.txt 编译规则、依赖等
| |--package.xml 属性信息
| |--scripts 脚本文件夹
| | |--python脚本
| | |--shell脚本
| |--include 头文件.h
| |--src C++源文件
| |--srv 服务
| | |--*.srv
| |--msg 消息
| | |--*.msg
| |--action 动作
| | |--*.action
| |--launch launch配置文件
| | |--*.launch
| |--config 参数配置文件
| | |--*.yaml
|--build cmake和catkin缓存中间文件
|--devel 编译生成的目标文件
CMakeLists.txt
package.xml
catkin工作空间
命名规则为 workspace_name/src
创建命令为
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make
catkin_make
作用为编译,同时可以起到初始化工作空间的目的
在编译完之后要用source命令刷新当前环境 source ~/catkin_ws/devel/setup.bash
,刷新完之后才能运行编译生成的ros可执行环境。但是每个终端都需要运行才行,可以直接更新到.bashrc文件中echo "source ~/catkin_ws/devel/setup.bash " >> ~/.bashrc
,直接更新环境变量。
rosbuild是早期的编译命令,现在已经被catkin_make淘汰
包管理指令
- rospack
查找某个包的地址rospack find package_name
列出本地所有包rospack list
- roscd 跳转到某个包路径下
roscd package_name
- rosls 列出包文件信息
rosls package_name
- rosed 编辑包中文件
rosed package_name file_name
- catkin_create_pkg 创建包
catkin_create_pkg pkg_name [deps]
deps是依赖名,可以有多个 - rosdep 安装依赖
rosdep install package_name
Metapackage
功能相似的包的集合,主要用于安装的时候使用。sudo apt-get install ros-kinetic-[Metapackage_name]
通信架构(计算图层级)
master
节点管理器,每个node启动时都需要在master进行注册,类似与微服务架构中的服务管理***能。
roscore 命令
roscore
该命令功能:
启动master节点
启动rosout节点 负责日志输出
启动parameter server 参数服务器
node 节点
一个node实际上就是一个进程,master实际上也是一个node,但是它的功能是对其他node进行管理。
由于机器人一般都有非常多的零部件,所以每个部分一般都需要一个进程对其进行管理,例如摄像头模块、雷达模块等都需要单独的进程才能完成任务,这里的每个进程在ros中被称为节点node。
rosrun命令
该命令的功能是启动一个node
rosrun [pkg_name] [node_name]
rosnode命令
管理和查看某个node信息
rosnode list
列出在运行的node信息
rosnode info [node_name]
显示某个node的详细信息
rosnode kill [node_name]
结束运行某个node
roslaunch命令
roslaunch [pkg_name] [file_name.launch]
启动master节点以及多个node
其中的.launch文件就配置了需要启动的node有关信息【启动规则】
通信方式
Topic
异步通信方式 publish-subscribe通信机制
nodeA向这个Topic发送(publish)消息,然后nodeB订阅(subscribe)这个Topic,然后nodeB就能收到nodeA发送的消息。所以可以进行一对多的消息发送,也可以多对一。
Message topic通信方式定义的数据类型 定义在.msg文件中
每个msg文件定义一种通信格式,相当于面向对象中的类,然后node在发送的时候是发送一个msg格式的数据。
基本格式包括:bool,int8,int16,int32,uint,float32,float64,string,time,duration,header,不定长数组array[],定长数组array[n]
- sensor_msgs/Image(sensor_msgs/msg/Image.msg) 定义了传输一幅图的数据格式
rostopic list
列出当前所有topicrostopic info /topic_name
显示某个topic的属性信息rostopic echo /topic_name
显示某个topic的内容rostopic pub /topic_name ...
向某个topic发布内容rosmsg list
列出系统上所有msgrosmsg show /msg_name
显示某个msg内容 (这里显示的是msg的格式内容)
Service
同步通信方式 request-reply方式通信
srv Service通信格式,定义在.srv文件中
- rosservice 与 rostopic对应
rosservice list
列出当前所有活跃的service
rosservice info service_name
显示某个service的属性信息
rosservice call service_name args
调用某个service - rossrv 与 rosmsg对应
rossrv list
列出系统上所有srv
rossrv show srv_name
显示某个srv内容
异同
后续
在定义了msg和srv后需要对package.xml和CMakeList.txt进行修改,添加相关依赖才能运行。
Action
类似Service,在通信过程中有执行状态的反馈,更常用于那些执行时间较长,并且可能需要中断和被抢占的任务节点中。
action通信的数据格式 定义在.action文件中
Parameter Server
参数服务器,存储各种参数的一种字典格式。可以使用命令行,launch文件和node节点的api进行读写。
感觉像是一种全局变量的维护方式。
命令行
命令 | 含义 |
---|---|
rosparam list | 列出当前所有参数的值 |
rosparam get param_key | 显示某个参数的值 |
rosparam set param_key param_value | 设置某个参数的值 |
rosparam dump file_name | 保存参数到文件(文件格式为YAML文件) |
rosparam load file_name | 从文件读取参数 |
rosparam delete param_key | 删除参数 |
launch文件
node(API)
略
常用工具
Gazebo
仿真工具,模拟器,ODE物理引擎
RViz The Robot Visualization tool
可视化调试工具
rqt
可视化工具,基于qt开发
rqt_graph:显示通信架构
rqt_plot:绘制曲线
rqt_console:查看日志
rosbag
命令行工具,记录和回放数据流(top数据流)
命令 | 含义 |
---|---|
rosbag record <topic_names> | 记录某些topic的数据到bag文件中 |
rosbag record -a | 记录所有topic到bag文件中 |
rosbag play <bag-files> | 回放bag文件中记录的数据 |
Moveit
机械臂常用的专用工具
Client Library
ROS编程的库 对API进行了进一步的封装,一些标准接口。
编程的具体方法与细节。
http://docs.ros.org/api/
roscpp C++的接口
官方文档:http://docs.ros.org/en/api/roscpp/html/
具体见该https://www.bilibili.com/video/BV1mJ411R7Ni?p=22&spm_id_from=pageDriver 视频中有一系列例子及讲解。
#include<ros/ros.h>
//导入自定义的一些msg之类的头文件
...
ros::init()
ros::NodeHandle
ros::master
ros::this_node
ros::service
ros::param
ros::names
rospy python的接口
import rospy
import math
from topic_demo.msg import gps #自己定义的各种msg等等都需要import
Node
Topic
其中queue_size(队列长度)如果传入为None会变成同步方式,只有是一个整数才是异步方式。
Service
Param
Time
Time是表示时刻的类
Duration是表示时间(持续时间)的类
TF & URDF
TF: TranForm 坐标系变换
URDF:机器人描述规范
TF树
机器人每个frame(以每个部件为中心的坐标系)之间的连接关系,每个连接关系都有一个node来进行维护,这些节点将消息发布到tf的topic中,然后从这些消息中就可以恢复得到一棵完整的tf树,这些消息可以反映每个部件之间的相对位移关系。
tf的具体消息格式以及消息发送和接收方法略【详情见视频】
命令 | 含义 |
---|---|
rosrun tf view_frames | 根据当前的tf树(最近5s内的tf消息)创建一个tf图 |
rosrun rqt_tf_tree rqt_tf_tree | 查看当前的tf树(动态变化) |
rosrun tf tf_echo [reference_frame] [target_frame] | 查看两个frame之间的变换关系 |
urdf Unified Robot Description Format
定义机器人结构
- link 核心部件
- joint 两个link之间的连接部件(连接关系)
出错处理
依赖安装
rosdep install --from-paths src --ignore-src --rosdistro=kinetic -y
报错信息如下
ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
robot_sim_demo: Cannot locate rosdep definition for [yocs_cmd_vel_mux]
navigation_sim_demo: Cannot locate rosdep definition for [dwa_local_planner]
slam_sim_demo: Cannot locate rosdep definition for [hector_mapping]ERROR: the following packages/stacks could not have their rosdep keys resolvedto system dependencies
使用sudo apt-get install ros-kinetic-[] 命令将缺失的包都进行安装再次运行即可。