1. catkin-tools
1.1. 安装
使用catkin build编译时,需要安装catkin-tools
- Installing on Ubuntu with apt-get
-
sudo sh -c
'echo "deb http://packages.ros.org/ros/ubuntu `lsb_release -sc` main" > /etc/apt/sources.list.d/ros-latest.list'
-
wget http:
/
/packages.ros.org
/ros.
key -O
- | sudo apt-key
add -
-
-
sudo apt-get update
-
sudo apt-get install python-catkin-tools
- Installing on other platforms with pip
pip install -U catkin_tools
1.2. Initializing Workspaces初始化工作空间
初始化具有默认布局的工作区(
src
/
build
/
devel
)在当前目录中:
-
catkin init
-
catkin init --workspace .
-
catkin config --init
-
mkdir src && catkin build
在不同目录中具有默认布局:
catkin init --workspace /tmp/path/to/my_catkin_ws
显式扩展另一个工作区:
catkin config --init --extend /opt/ros/indigo
初始化具有源空间
other_src
的工作空间:
catkin config --init --source-space other_src
or a workspace with
build
,
devel
, and
install space
ending with the suffix
_alternate
:
catkin config --init --space-suffix _alternate
1.3. Configuring Workspaces配置工作空间
查看当前配置:
catkin config
设置和复位CMake选项:
catkin config --cmake-args -DENABLE_CORBA=ON -DCORBA_IMPLEMENTATION=OMNIORB catkin config --no-cmake-args
将安装切换到指定的安装空间:
catkin config --install
1.4. Building Packages编译包
Build all the packages
catkin build
Build one at a time, with additional debug output
catkin build -p 1
迫使CMake重新配置每一个:
catkin build --force-cmake
Build a specific package and its dependencies:
catkin build my_package
or ignore its dependencies:
catkin build my_package --no-deps
Build packages包含当前的工作目录:
catkin build --this
but don’t rebuild its dependencies:
catkin build --this --no-deps
Build packages有额外的CMake参数:
catkin build --cmake-args -DCMAKE_BUILD_TYPE=Debug
and save them to be used for the next build:
catkin build --save-config --cmake-args -DCMAKE_BUILD_TYPE=Debug
Build all packages 在给定目录中:
catkin build $(catkin list -u /path/to/folder)
or in the current folder:
catkin build $(catkin list -u .)
1.5. Cleaning Build Products
清理 the build, devel, and install spaces (if they exist):
catkin clean
… or just the build space:
catkin clean --build
… or just clean a single package:
catkin clean PKGNAME
… or just delete the build directories(生成目录) for packages which have been disabled or removed:
catkin clean --orphans
1.6. Create Packages
快速创建workspace中的catkin packages:
Creates catkin workspace resources like packages:
catkin create pkg
1.7. Environment Utility
It can be used to both print the current environment variables and run a command in a modified (修改的)environment.It is primarily used in the build stage command reproduction.
Run an arbitrary command in a modified environment:
catkin env [-h] [-i] [-s] [NAME=VALUE [NAME=VALUE ...]] [COMMAND] [ARG [ARG ...]]
1.8. List Package Info
It is used to find and list information about catkin packages. By default(默认情况下), it will list the packages in the workspace containing the current working directory. It can also be used to list the packages in any other arbitrary directory.
Lists catkin packages in the workspace or other arbitray folders:
catkin list [-h] [--workspace WORKSPACE] [--profile PROFILE] [--deps | --rdeps] [--depends-on [PKG [PKG ...]]] [--rdepends-on [PKG [PKG ...]]] [--this] [--quiet] [--unformatted]
1.9. Locate Directories定位路径
It can be used to locate important locations in the workspace such as the active
source
,
build
,
devel
, and
install
spaces, and package directories in the workspace.
Get the paths to various locations in a workspace:
catkin locate [-h] [--workspace WORKSPACE] [--profile PROFILE] [-e] [-r] [-q] [-s | -b | -d | -i] [--shell-verbs] [--examples] [PACKAGE]
1.10. Manage Profiles
创建所有应用程序服务器运行时环境。该命令创建概要文件,即定义 Deployment Manager、定制概要文件或独立应用程序服务器的运行时环境的文件集合。
It has several sub-commands for profile management.有多个子命令用于配置文件管理
Manage config profiles for a catkin workspace:
-
catkin profile [-h] [--workspace WORKSPACE] {list,
set,add,rename,remove} ...
-
-
sub-command
help:
-
list List the available profiles.
-
set Set the active profile by name.
-
add Add a new profile by name.
-
rename Rename a given profile.
-
remove Remove a profile by name.
1.11. Controlling Color Display控制彩色显示
Disable colors when building in a shell that doesn’t support it (like IDEs):
catkin --no-color build
… or enable it for shells that don’t know they support it:
catkin --force-color build
1.12. Profile Cookbook
Create “Debug” and “Release” profiles and then build them in independent build and devel spaces:
catkin config --profile debug -x _debug --cmake-args -DCMAKE_BUILD_TYPE=Debug catkin config --profile release -x _release --cmake-args -DCMAKE_BUILD_TYPE=Release catkin build --profile debug catkin build --profile release
快速从头开始建立一个包Quickly build a package from scratch to make sure all of its dependencies are satisfied, then clean it:
catkin config --profile my_pkg -x _my_pkg_test catkin build --profile my_pkg my_pkg catkin clean --profile my_pkg --all
1.13. Manipulating Workspace Chaining操纵空间链接
Change from implicit to explicit chaining[从隐性到显性链接:]:
catkin clean catkin config --extend /opt/ros/indigo
Change from explicit to implicit chaining:
catkin clean catkin config --no-extend
1.14. Building With Other Job Servers
Build with
distcc
:
CC="distcc gcc" CXX="distcc g++" catkin build -p$(distcc -j) -j$(distcc -j) --no-jobserver
2. Gazebo
ROS中的工具就是帮助我们完成一系列的操作,使得我们的工作更加轻松高效。ROS工具的功能大概有以下几个方向:仿真、调试、可视化。本节课我们要学习的Gazebo就是实现了仿真的功能,而调试与可视化由Rviz、rqt来实现,我们下节再依次介绍。
2.1. 认识 Gazebo
对于Gazebo,大家可能并不陌生,因为我们在前面的学习过程中已经数次用到这个仿真环境,无论是在topic通信还是在service通信中,我们的demo都是在Gazebo中实现。
Gazebo是一个机器人仿真工具,模拟器,也是一个独立的开源机器人仿真平台。当今市面上还有其他的仿真工具例如V—Rep、Webots等等。但是Gazebo不仅开源,也是是兼容ROS最好的仿真工具。
Gazebo的功能很强大,最大的优点是对ROS的支持很好,因为Gazebo和ROS都由OSRF(Open Source Robotics Foundation)开源机器人组织来维护,Gazebo支持很多开源的物理引擎比如最典型的ODE。可以进行机器人的运动学、动力学仿真,能够模拟机器人常用的传感器(如激光雷达、摄像头、IMU等),也可以加载自定义的环境和场景。
2.2. 仿真的意义
仿真不仅仅只是做出一个很酷的3D场景,更重要的是给机器人一个逼近现实的虚拟物理环境,比如光照条件、物理距离等等。设定好具体的参数,让机器人完成我们设定的目标任务。比如一些有危险因素的测试,就可以让机器人在仿真的环境中去完成,例如无人车在交通环境复杂的交通要道的效果,我们就可以在仿真的环境下测试各种情况无人车的反应与效果,如车辆的性能、驾驶的策略、车流人流的行为模式等,又或者各种不可控因素如雨雪天气,突发事故,车辆故障等,从而收集结果参数指标信息等等,只有更大程度的逼近现实,才能得出车辆的真实效果。直到无人车在仿真条件下做到万无一失,才能放心的投放到真实环境中去使用,这即避免了危险因素对实验者的威胁,也节约了时间和资源,这就是仿真的意义。
通常一些不依赖于具体硬件的算法和场景都可以在Gazebo上仿真,例如图像识别、传感器数据融合处理、路径规划、SLAM等任务完全可以在Gazebo上仿真实现,大大减轻了对硬件的依赖。
2.3. 演示
和我们前面的实例测试一样,我们打开教材的模拟场景,输入
roslaunch robot_sim_demo robot_spawn_launch
2.4. 操作说明
- 平移:鼠标左键
- 旋转:鼠标滚轮中键
- 放缩:鼠标滚轮
- 界面左侧是控制面板
- 导入模型就在控制面板的insert,可以直接拖入模拟空间,也可以按需自制模型拖入。
2.5. 小结
虽然Gazebo目前的功能还称不上强大,同时还存在着一些BUG,但是对于我们的入门学习也已经是足够了,随着版本的更新,Gazebo也在越来越强大。
3. RViz
调试和开发都离不开这个工具——RViz(the Robit Visualization tool)机器人可视化工具,可视化的作用是直观的,它极大的方便了监控和调试等操作。
3.1. 演示
依然打开教材的模拟场景,输入
roslaunch robot_sim_demo robot_spawn_launch
,之后在命令行打开新的终端直接输入
rviz
打开工具。
和Gazebo一样,也会显示出一个3D环境,不过操作上有所不同,具体操作如下:
- 平移:鼠标滚轮中键
- 旋转:鼠标左键
- 放缩:鼠标滚轮
- 左侧控制面板,可以添加插件
RViz的插件种类繁多功能强大,非常适合我们开发调试ROS程序。
3.2. 差异
虽然从界面上来看,RViz和Gazebo非常相似,但实际上两者有着很大的不同,Gazebo实现的是仿真,提供一个虚拟的世界,RViz实现的是可视化,呈现接收到的信息。左侧的插件相当于是一个个的subscriber,RViz接收信息,并且显示。所以RViz和Gazebo有本质的差异。
3.3. 小结
RViz和Gazebo是我们常用的ROS工具,更好的利用这些工具是我们ROS进阶的基础。具体的操作和使用可以参考我们的官方演示视频,跟着视频去实战演练,熟悉这两个工具。
4. rqt
rqt是一个基于qt开发的可视化工具,拥有扩展性好、灵活易用、跨平台等特点,主要作用和RViz一致都是可视化,但是和RViz相比,rqt要高级一个层次。
- rqt_graph :显示通信架构
- rqt_plot :绘制曲线
- rqt_console :查看日志
- rqt_bag: 查看数据中消息的分布情况
4.1. rqt_graph
rqt_graph是来显示通信架构,也就是我们上一章所讲的内容节点、主题等等,当前有哪些Node和topic在运行,消息的流向是怎样,都能通过这个语句显示出来。此命令由于能显示系统的全貌,所以非常的常用。
4.2. rqt_plot
rqt_plot将一些参数,尤其是动态参数以曲线的形式绘制出来。当我们在开发时查看机器人的原始数据,我们就能利用rqt_plot将这些原始数据用曲线绘制出来,非常的直观,利于我们分析数据。
4.3. rqt_console
rqt_console里存在一些过滤器,我们可以利用它方便的查到我们需要的日志。
4.4. rqt_reconfigure
参数配置神器,使用方法是
rosrun rqt_reconfigure rqt_reconfigure
在这里,可以选择任何左侧节点以对其进行重新配置
4.5. rqt_bag
查看数据中消息的分布情况
还可以直接查看数据,只需在消息条上鼠标右南然后选择view即可,甚至可以直接查看图像。
4.6. 实例测试
-
首先打开我们教材的模拟场景,输入
roslaunch robot_sim_demo robot_spawn_launch
-
输入命令语句
rqt_graph
,显示出了当前环境下运行的Node和topic,十分直观的看到通信结构以及消息流向。注意在椭圆形的代表节点,矩形代表topic。 -
输入命令语句
rqt_plot
,显示出曲线坐标窗口,在上方输入框里添加或者删除topic,比如我们查看速度,可以在框里设置好topic后,移动机器人,就可以看到自动绘制的线速度或者角速度曲线。 -
输入命令语句
rqt_console
,显示日志的输出,配合
rqt_logger_level
查看日志的级别。
4.7. 小结
rqt_graph这个功能是强大的,它使得我们初学者可以直观的看到ROS的通信架构和信息流,方便我们理解的同时,也使得我们能够最快的纠错等等。rqt_plot绘制数据曲线图,也是极大的帮助我们了解数据的变化态势,理解数据流的作用,用曲线来显示我们的操作,精确直观。rqt_console配合rqt_logger_level,查看日志,对于查找错误和DeBug都有很大帮助。
5. rosbag
rosbag是一个这是一套用于记录和回放ROS主题的工具。它旨在提高性能,并避免消息的反序列化和重新排序。rosbag package提供了命令行工具和代码API,可以用C++或者
python
来编写包。而且rosbag命令行工具和代码API是稳定的,始终保持向后的兼容性。
rosbag对软件包来操作,一个包是ROS用于存储ROS消息数据的文件格式,rosbag命令可以记录、回放和操作包。指令列表如下:
命令 | 作用 |
---|---|
|
确定一个包是否可以在当前系统中进行,或者是否可以迁移。 |
|
压缩一个或多个包文件。 |
|
过滤器 |
|
在包文件中修复消息,以便在当前系统中播放。 |
|
获取相关命令指示帮助信息 |
|
总结一个或多个包文件的内容。 |
|
以一种时间同步的方式回放一个或多个包文件的内容。 |
|
用指定主题的内容记录一个包文件。 |
|
重新索引一个或多个包文件。 |
5.1. 基本操作指令
显示包的详细信息
rosbag info <bag>
播放bag包
rosbag play <bag>
以2Hz的频率播放bag包
rosbag play -r 2 <bag>
过滤单个topic
rosbag filter my.bag only-tf.bag "topic == '/tf'"
过滤多个topic
rosbag filter input.bag output.bag "topic == '/velodyne_point_cloud' or topic =='/visensor/imu' or topic == '/visensor/left/image_raw'"
根据时间过滤
-
rosbag filter input.bag output.bag
"t.to_sec() <= 1284703931.86"
-
-
rosbag filter orign.bag new.bag
"t.secs >=576210103 and t.secs <=576210303"
5.2. bag_to_pcd
-
从bag包转pcd
rosrun pcl_ros bag_to_pcd <input_file.bag> <topic> <output_directory> rosrun pcl_ros bag_to_pcd data.bag /velodyne_points ./wtj
从data.bag中提取/velodyne_points 话题数据到wtj 文件夹中。
-
通过发布,订阅实时转
-
检查topic:rosbag info XXX.bag
-
发送message: $ rosbag play XXX.bag
-
订阅需要的话题:$rosrun pcl_ros pointcloud_to_pcd input:=/velodyne_points
在当前目录下将话题实时转为pcd文件。
-
显示生成的pcd文件
pcl_viewer 1513648255448748.pcd
5.3. 录包
rosbag record命令是用于在ros系统中录取系统中其他ros节点发出来的topic的message。录取的的包可以使用rosbag play命令来回放,订阅这些消息的node节点就可以收到这些消息,进而执行对应的程序。这样的话,就可以将自动驾驶汽车或者无人机、机器人等自动化机器在室外一些环境下遇到的问题,通过录包的方法拿到办公室来仔细研究解决。
rosbag record命令在终端下显示完整命令参数如下:
-
kitty@kitty-TM1705:~$ rosbag record -
help
-
Usage: rosbag record TOPIC1 [TOPIC2 TOPIC3 ...]
-
-
Record a bag file with the contents of specified topics.
-
-
Options:
-
-h, --
help show this
help message and
exit
-
-a, --all record all topics
-
-e, --regex match topics using regular expressions
-
-x EXCLUDE_REGEX, --exclude=EXCLUDE_REGEX
-
exclude topics matching the follow regular expression
-
(subtracts from -a or regex)
-
-q, --quiet suppress console output
-
-o PREFIX, --output-prefix=PREFIX
-
prepend PREFIX to beginning of bag name (name will
-
always end with
date stamp)
-
-O NAME, --output-name=NAME
-
record to bag with name NAME.bag
-
--
split
split the bag when maximum size or duration is reached
-
--max-splits=MAX_SPLITS
-
Keep a maximum of N bag files, when reaching the
-
maximum erase the oldest one to keep a constant number
-
of files.
-
--size=SIZE record a bag of maximum size SIZE MB. (Default:
-
infinite)
-
--duration=DURATION record a bag of maximum duration DURATION
in seconds,
-
unless
'm', or
'h' is appended.
-
-b SIZE, --buffsize=SIZE
-
use an internal buffer of SIZE MB (Default: 256, 0 =
-
infinite)
-
--chunksize=SIZE Advanced. Record to chunks of SIZE KB (Default: 768)
-
-l NUM, --
limit=NUM only record NUM messages on each topic
-
--node=NODE record all topics subscribed to by a specific node
-
-j, --bz2 use BZ2 compression
-
--lz4 use LZ4 compression
-
--tcpnodelay Use the TCP_NODELAY transport hint when subscribing to
-
topics.
-
--udp Use the UDP transport hint when subscribing to topics.
rosbag record TOPIC1 [TOPIC2 TOPIC3 …] 这是最简单的使用方法是。比如录取message_1的命令:rosbag record message_1;
通常的使用都是根据需求和可选的参数配合使用的,比如要录所有的topic,使用rosbag record -a命令。
5.4. 查看消息
rostopic echo [topic name]
当echo topic:
/radar_all_tracker
时,如果只想接收 header,使用方式如下,
rostopic echo /radar_all_tracker | grep header -A4
-A4
表示接收 header 后四行
6. Rosbridge
Rosbridge是一个用在ROS系统和其他系统之间的一个功能包,就像是它的名字一样,起到一个”桥梁”的作用,使得ros系统和其他系统能够进行交互.Rosbridge为非ROS程序提供了一个JSON API,有许多与Rosbridge进行交互的前端,包括一个用于Web浏览器交互的WebSocket服务器。Rosbridge_suite是一个包含Rosbridge的元程序包,用于Rosbridge的各种前端程序包(如WebSocket程序包)和帮助程序包。
6.1. Rosbridge主要包含两部分内容:协议(Potocol)和实现(Implementation)
6.1.1. 协议
Rosbridge Protocol提供了非ROS程序与ROS通信的具体的格式规范,规范基于JSON格式,包括订阅topic,发布message,调用server,设置参数,压缩消息等等.例如订阅topic的格式规范如下:
-
{
-
"op":
"subscribe",
-
"topic":
"/cmd_vel",
-
"type":
"geometry_msgs/Twist"
-
}
此规范与所用的编程语言和传输方式无关,任何可以发送JSON格式的语音和传输方式都可以Rosbridge protocol进行交流,并且与ROS进行交互.
6.1.2. 实现
Rosbridge_suite元程序包是实现Rosbridge Protocol并提供WebSocket传输层的包的集合。
这些软件包包括:
-
Rosbridge_library : 核心rosbridge软件包。Rosbridge_library负责获取JSON字符串并将命令发送到ROS,反过来接收处理ROS发过来的信息,将之转换为JSON字符串,并将结果转交给非ROS程序。
-
rosapi : 通过服务调用来访问某些ROS操作,这些服务通常为ROS客户端库保留的服务.这些操作包括获取和设置参数,获取主题列表等等。
-
rosbridge_server : 虽然Rosbridge_library提供JSON到ROS转换,但它将传输层留给其他人。Rosbridge_server提供了一个WebSocket连接,所以浏览器可以与ROS“交谈”。Roslibjs是一个浏览器的JavaScript库,可以通过rosbridge_server与ROS进行交流。
6.2. 安装与使用
6.2.1. 安装
Rosbridge是基于ROS的,首先要确保自己正确的安装完成了ROS之后可以启动终端执行命令:
sudo apt-get install ros- <rosdistro> -rosbridge-server
中间的为自己的ROS版本,依照自己的版本进行安装.
6.2.2. 使用
关于更深入的使用,可以参考本课程的视频课程,简单的入门使用可以参考链接如下:
7. moveit
2012年,一款叫做moveit!的移动操作软件诞生了,moveit!最初在Willow Garage由Sachin Chitta,Ioan Sucan,Gil E. Jones,Acorn Pooley,Suat Gedikli,Dave Hershberger开发,它融合了研究者在运动规划、操纵、3D感知、运动学、控制和导航方面的最新进展,为操作者提供了一个易于使用的平台,使用它可以开发先进的机器人应用,也被广泛应用于工业,商业,研发和其他领域。由于以上特性,moveit!一跃成为在机器人上最广泛使用的开源操作软件,截止2017年,已经被用于超过65台机器人。
moveit的使用通过为用户提供接口来调用它,包括C++、Python、GUI三种接口。ROS中的
move_group
节点充当整合器,整合多个独立组件,提供ROS风格的Action和service。
move_group
通过ROS topic和action与机器人通讯,获取机器人的位置、节点等状态,获取数据再传递给机器人的控制器。
move_group
节点获取到节点状态信息或者机器人变换信息时候,会通过控制器的接口去处理这些信息,比如进行坐标转换、规划场景、3D感知。另外,
move_group
的结构比较容易扩展,不仅具有独立的能力如抓放,运动规划,也可扩展自公共类,但实际作为独立的插件运行。moveit!系统结构图如下:
参考文献