读ROS官方教程
ROS Tutorial
基本概念
-
catkin
:ROS用于编译源码的工具,可以理解为是一个魔改的CMake? -
包
Package
:ROS代码的基本单元,一般会包含一些库、脚本、可知行文件等。- 都有自己独立的文件夹,不能套娃。
- 至少有
package.xml
和CMakeLists.txt
。 package.xml(Manifest)
:描述一个包的依赖项、版本、开源协议等信息的清单。- 这个链接描述了各个xml标签。
<build_depend>
、<build_export_depend>
、<exec_depend>
这几个现在推荐用一个<depend>
代替。
-
节点
Nodes
:一个通过ROS和其他Nodes
通信的程序。Client Libraries
:程序想要使用ROS,则需要包含这类库,分为C++的和Python的。
-
话题
Topics
:ROS中通信的媒介,一个节点可以订阅话题也可以向话题发布信息。 -
消息
Messages
:向话题发布的ROS数据。- 描述消息的文件需要放在节点的
msg
文件夹下。
- 描述消息的文件需要放在节点的
-
服务
Service
:ROS中各节点除了借助消息与话题之外的另一种通信方式,区别在于在消息与话题中,各个节点只与话题通信,节点之间不直接通信,而在服务中则两个节点直接通信(自己理解的)。- 描述服务的文件需要放在节点的
srv
文件夹下。
- 描述服务的文件需要放在节点的
-
参数
Parameter
:ROS中可以讲常需要调整的参数放入配置文件中,而不是写死在cpp
文件中,这样可以减少调参后重新编译的时间。
基本命令
大多数ROS命令都支持使用
-h
参数查看帮助文档。
常用
-
roscore
:以下三种功能的结合Master
:命名管理rosout
:向终端显示调试信息parameter server
:参数管理
-
rospack
rospack find
:返回包路径rospack depends
:返回包的所有依赖项,包括依赖项的依赖项rospack depends1
:返回包的直接依赖项
-
roscd
:进入$ROS_PACKAGE_PATH
下的特定包的路径,rosls
、roscp
都与此类似 -
catkin
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
:创建有若干依赖项的包catkin_make
:在catkin工作空间的根目录执行该命令,则会编译src文件夹下的所有包
-
roslaunch
:通过.launch
文件一口气启动多个节点
命令行工具
-
rosnode
:查看节点信息list
:列出各节点info
:查看某节点的信息ping
:测试节点的连接情况
-
rosrun [package_name] [node_name]
:运行节点- 添加
__name:=
参数来修改节点的名字
- 添加
-
rostopic
:ROS话题相关list
:查看所有的话题及其订阅者、发布者type
:查看某个具体话题的数据类型pub
:发布消息hz
:显示消息发布速率
-
rosmsg
:ROS消息相关show
:显示一类消息的具体内容
-
rosservice
:ROS服务相关list
:列出服务call
:调用某个服务type
/find
:获取某个服务的类型/根据类型寻找服务
-
rosparam
:ROS参数相关set
/get
:设置/获取参数load
/dump
:导入/导出参数list
:列出参数
-
rosed [package_name] [filename]
:默认用vim
打开特定包下的文件 -
rosbag
:录制活动过程中话题中的消息record
:录制bagplay
:回放bag
-
roswtf
:ROS错误自查,没仔细看
基础包
rqt
:ROS图形化显示信息的一套东西,下边的各位都是它的插件(虽然各个插件也都是一个包)rqt_graph
:显示话题之间的发布、订阅关系rqt_plot
:绘制消息数据的图线rqt_console
&rqt_logger_level
:用于筛选各个节点的输出信息,分为debug、info、warn、error和fatal
C++接口
基本操作
-
ros::init(argc, argv, "name of node");
初始化ROS。 -
ros::NodeHandle n;
初始化节点句柄。 -
ros::Rate loop_rate(10);
设置主循环单次时长,需要在主循环里配合调用loop_rate.sleep();
。 -
ros::spin()
用于调用所有可触发的回调函数,同时将进入循环,不会返回。这类似于在循环里反复调用ros::spinOnce()
,而后者只会去触发一次。- 按下
Ctrl-C
或者节点被master关闭都会退出循环。
- 按下
-
ROS_INFO("%s", msg.data.c_str())
是printf
/cout
在ROS中的替代物。 -
ros::ok()
可作为主循环继续进行的条件,当产生SIGINT
信号、当前节点被同名节点挤掉,或者所有的节点句柄都被销毁时它会返回false
。
话题相关
- 发布
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
实例化了一个发布者,advertise
后边紧跟着的是发布的消息的类型,两个参数分别是话题名称和缓存区大小。chatter_pub.publish(msg);
发布一条消息。
- 订阅
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
实例化了一个订阅者,其中第三个参数是收到消息时的回调函数。
消息、服务相关
-
当项目内有新建的msg/srv时,需要确保项目内的msg和srv被编译,再编译target,因此需要添加以下宏
add_dependencies(program_name ${${PROJECT_NAME}_EXPORTED_TARGETS})
。 -
ros::ServiceServer service = n.advertiseService("add_two_ints", add);
实例化了一个服务端对象,其中第二个参数是回调函数。创建后spin
即可等待服务请求。 -
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
实例化了一个客户端对象,然后再client.call(srv)
即可请求服务。
tf2 Tutorial
tf指transform,意义大概是坐标变换,tf2是tf的迭代版本。
概念
-
坐标系由树形结构组织
- 常用地面静止系叫做world
-
四元数
tf2::Quaternion
(暂时没细看)-
为避免运算误差而归一化:
tf2::Quaternion::normalize()
-
与
geometry_msgs::Quaternion
相互转换tf2::fromMsg(quat_msg, quat_tf); quat_msg = tf2::toMsg(quat_tf);
-
与欧拉角(roll, pitch, yaw)相互转换
tf2::Quaternion::setRPY()
-
进行姿态旋转
q_new = q_rot*q_orig
-
反转,即使处于第三个的w分量反号
-
相对旋转
q_2 = q_r * q_1; q_r = q_2 * q_1_inverse;
-
代码操作
节点之间通过发送变换消息与查找变换消息来交换坐标信息
- 数据类型是
geometry_msgs::TransformStamped
- tf2提供的发送对象是
tf2_ros::TransformBroadcaster
,接受对象是tf2_ros::TransformListener
- 查找坐标系见得相对关系首先需要建立缓存对象
tf2_ros::Buffer
,然后再tf2_ros::Buffer:lookupTransform()
- 错误常见在:查询了不存在的坐标系的坐标变换,或者时间戳超前等。
RViz Tutorial
ROS Visualization的缩写。
- 记得选fixed frame。初次运行某个程序的可视化时需要手动添加话题,添加后可以保存
.rviz
文件,这样再运行时就不用反复操作了。 - 教程教了怎么用代码往RViz里画图,这些功能部分用GUI也能做。
- 其余功能没有去了解。
Gazebo Tutorial
现在是2022,目前gazebo分出了两个分支,一个是ROS Noetic自带的Gazebo Classic (Gazebo Classic),另一个是由近几年开发的Ignition衍变出的新Gazebo。Gazebo 11已经是Gazebo Classic的最后一个版本,维护将会在2025年结束。不过现在装的是11,还是继续看11的文档。
建模
- GUI可以用于构建简单的机器人模型,但这个应该不是主流方法。如果要用,得注意关节的方向。
- 另外还教了用GUI构建场景,感觉暂时用不上也先略过
- 一个模型文件中应该包括(翻译官方文档):
- model.config : 元数据
- model.sdf : 模型的SDF描述
- model.sdf.erb : 嵌入了Ruby的模型SDF描述
- meshes : COLLADA和STL格式文件的存放位置
- materials: 材质和脚本文件存放位置
- textures : 存放图片格式文件
- scripts : 存放OGRE材质脚本
- plugins: 插件的源代码和头文件
与ROS配合
- 使用
roslaunch
- 未完待续。。。