文件列表查看工具 tree
shell sudo apt install tree
tree
# 显示当前文件夹树状图 tree
tree -L 1
# 显示一级目录
工作空间:存放工程开发相关文件的文件夹。
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws # 回到工作空间根目录
catkin_make
source ~/catkin_ws/devel/setup.bash # 设置环境变量,使系统可以使用这个工作空间的功能包
package:ros 软件的基本组成形式,catkin 编译的基本单元,一个 package 包含多个可执行文件(节点)。catkin 逐个编译 package。
cd ~/catkin_ws/src
catkin_create_pkg pkg_name pkg_depends # 创建一个 pkg
cd ~/catkin_ws # 回到工作空间根目录
catkin_make
source ~/catkin_ws/devel/setup.bash
注意:必须回到工作空间根目录才能运行catkin_make
命令。
如果要编译单个功能包,可用如下命令:
catkin_make --pkg pkg_name
package基本结构 必须包含 CMakeList.txt,package.xml文件, 还包括 节点源码(include、src,scripts)、启动(launch)和配置文件(config)、自定义数据结构(msg,srv)等。
CMakeList.txt 规定 catkin 的编译规则,如源文件、依赖项目标文件。
package.xml 定义 package 的属性,如:包名,作者、版本号、依赖项等。一般只需要更改 build_depend 和 run_depend 项。
scripts 文件夹放脚本文件,如 shell文件(*.sh)和 python 文件(*.py)。
include 文件夹放 c++的头文件(*.h)。
src文件夹 放 c++的源文件(*.cpp)有时候 src也会放 python 文件。
消息 msg (*.msg)
服务 srv (*.srv)
动作 action (*.action)
launch (*.launch)
config (*.yaml)
package 常用指令
rospack find package_name # 查找某个 pkg 的地址
rospack list # 列出本地所有的 pkg
roscd package_name # 跳转到某个 pkg 路径下
rosls package_name # 列举出某个 pkg 下的文件信息
rosed package_name file_name # 编辑 pkg 中的文件
rosdep install pkg_name # 安装某个 pkg 所需的依赖
一个虚包,是多个 package 功能包的集合,以前叫 stack。
松耦合的分布式通信架构。
ros 中所有节点的管理者。
通俗的解释就是那么,这个master负责抄名单、给人指路,顺带记录点个人隐私。一旦master被启动,ROS的网络中就有了一位在背后默默抄名单的人。比如,节点A启动了,master就在小本本上记下A的名字以及它要干什么,节点B也是一样,这时候,A要订阅一个话题,就问master,谁在发布这个话题?master指了指B说,就是它。这时A找到了B,话题就联系上了,master也就完成了一次指路。
如果Master节点不慎关闭或宕机,已经启动的节点和建立的话题安然无恙,但后续新节点和新话题无法建立连接。by the way, ROS2.0 取消了 master 节点。
启动ros master命令: roscore
。其实执行 roscore 会启动三个工具:
rosrun pkg_name node_name # 启动节点
rosnode # 查看 rosnode 命令帮助信息
rosnode list # 列出当前运行的 node
rosnode info node_name # 显示某个 node 的详细信息
rosnode kill node_name # 结束运行
启动 master 和多个 node:roslaunch pkg_name file_name.launch
注:通常把机器人启动的包名命名为 robot_name_bringup.
一个简单的 launch文件示例:
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="sim1"/>
<node pkg="turtlesim" type="turtlesim_node" name="sim2"/>
launch>
node 节点属性
pkg :节点所在的功能包名称
type:节点的可执行文件名称
name:节点运行时的名称
话题 topic ,异步通信方式,node 之间通过 publisher/subscriber 模式通信,特点:
rostopic 的常用命令
rostopic list # 列出当前所有的 topic
rostopic info topic_name # 显示某个 topic 的属性信息
rostopic echo topic_name # 显示 topic 的内容
rostopic pub -r 10 topic_name ... # 以每秒十次的频率向某个 topic 发布内容
Message,topic传输的数据的数据类型(数据结构),通常定义在 msg 文件夹下的 *.msg 文件中。ros 提供了标准的 message 类型,用户也可以自定义。
基本的 msg 数据类型:
rosmsg 常用命令:
rosmsg list # 列出所有 msg
rosmsg show /msg_name # 显示某个 msg 内容
service,ros 同步通信机制,使用 client/server 模型, 客户端发送请求数据,服务端完成处理后返回应答数据。
同步:client 端发送请求后会阻塞,直到 server 端返回结果才会继续执行。
topic 与 service 对比。topic 适用于数据传输,service 适用于逻辑处理。
srv :service 的通信数据格式,定义在 *.srv 文件中。
srv 文件格式:
request message
---
reply message
rosservice list # 列出当前所有活跃的 service
rosservice info service_name # 显示某个 service 的属性信息
rosservice call service_name args # 调用某个 service
可通过网络访问的存储各种参数的全局共享字典,节点使用此服务器来存储和检索运行时的参数。可用命令行、launch文件和 node(API)读写。通常把不常改变的参数方法 parameter server 中。
rosparam list # 列出当前所有参数
rosparam get param_key # 显示某个参数的值
rosparam set param_key param_value # 设置某个参数的值
rosparam dump file_name # 保存参数到文件
rosparam load file_name # 从文件中读取参数
rosparam delete param_key # 删除参数
类似 server,带有状态反馈的通信方式。通常用于长时间、可打断的任务中。
action 通信的数据格式为 action,定义在 *.action 文件中。
action 的写法:
显示 计算图:rqt_graph
圆圈:节点
箭头:数据流向
方框:topic
图形化显示topic数据:rqt_plot
rosrun rqt_
:查看所有 rqt 命令。
ros命令行工具,记录和回放数据流。创建一个 topic,将需要记录的数据打上时间戳存放到.bag文件中。
公开数据集常打包成 .bag文件。
rosbag record topic-names # 记录某些 topic 到 bag 中
rosbag record -a bag-file-name # 记录所有 topic 到 bag 中. -a ,保存所有数据;-O,保存为压缩包
rosbag play bag-files-name # 回放 bag
client library,提供 ros 编程的库,将底层功能封装好,提供接口供用户调用,如建立 node,发布消息,调用服务等。主要包括 roscpp,rospy,roslisp 等。
定义好 .msg ,.srv等文件后要先执行 catkin_make 编译,以生成相应的 msg/__init__.py
文件
以供 import
导入
参考链接:http://docs.ros.org/api/rospy/html/
import rospy
init_node('node_name') #注册和初始化 node
get_master() # 获取 master 的句柄
is_shutdown() # bool 返回是否关闭
on_shutdown(fn) # 在 node 关闭时调用函数
get_node_uri() # str 返回节点的 URI
get_name() # str 返回本节点的全名
get_namespace() # str 返回本节点的命名空间
# 函数:
wait_for_service(service,timeout=None) # 阻塞直到服务可用
# Service 类 ,server 端
__init__(self,name,service_class,handler) # 构造函数 提供服务。handler 接收请求
shutdown(self) # 关闭服务
# ServiceProxy 类,client 端
__init__(self,name,service_class) # 构造函数 服务请求方 client = ServiceProxy(...)
call(self, *args,**kwds) # 发出请求,调用服务 client.call(request)
__call__(self, *args,**kwds) # 隐式调用 call函数 client(request)
# Time 类,时刻
now() # 返回当前时刻
get_rostime() # 当前时刻的 time 对象
get_time() # float 时间单位 s
sleep(duration)# 挂起
# Duration 类,时段
# Rate 类,频率
tf:坐标转换的标准、话题、工具、接口。
机器人每个部件定义为一个 link,每个 link 上固定一个 frame坐标系,frame 之间的坐标关系用 TF tree 描述。Brodercaster,是 publister,向 TF topic 发送TransformStamped.msg
数据。
TF tree 的消息类型:tf/tfMessage.msg (第一代),tf2_msgs/TFMessage.msg (第二代)
XML语言规范
path planning 算法主要有 global 的 Dijkstra,A*;local 的 DWA 等。ros 提供的 Navigation 包提供了这些算法.
Topic: /Map
Type:nav_msgs/OccupancyGrid.msg
imu odom
move_base:全局规划(静态),局部规划(动态),处理异常行为。
costmap:用于路径规划,两张,2 维,多层(static layer,obstacle layer,inflation layer)
Topic和Action通讯方式与机器人通信,获取机器人当前的状态(例如当前每个关节的位置)、各个传感器的数据等。通过TF库获取坐标系变换数据,包括机器人的位姿、其他物体位姿等全局信息。机器人控制器控制机器人的每个关节做运动,机器人控制器和Move_Group的通信方式是Action,将规划好的关节信息告诉机器人控制器,机器人控制器还会提供反馈信息.
ROS MoveIt!控制真实机械臂的一般框架:
【轨迹插补】MoveIt!规划得到的关节轨迹由一系列轨迹点组成,每两个点之间的时间间隔不定,基本是0.1~1秒之间,这个时间间隔对于底层控制来讲,是非常大的,很容易造成轨迹运动不圆滑、速度不均匀的现象,需要进一步细分到和控制周期匹配的间隔,也就是你可能常听说的“轨迹插补”,具体实现可以参考ros_control。