读ROS官方教程

ROS Tutorial

ROS Tutorial链接

基本概念

  • catkin:ROS用于编译源码的工具,可以理解为是一个魔改的CMake?

  • Package:ROS代码的基本单元,一般会包含一些库、脚本、可知行文件等。

    • 都有自己独立的文件夹,不能套娃。
    • 至少有package.xmlCMakeLists.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下的特定包的路径,roslsroscp都与此类似

  • 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:录制bag
    • play:回放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

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

rviz Tutorial 链接

ROS Visualization的缩写。

  • 记得选fixed frame。初次运行某个程序的可视化时需要手动添加话题,添加后可以保存.rviz文件,这样再运行时就不用反复操作了。
  • 教程教了怎么用代码往RViz里画图,这些功能部分用GUI也能做。
  • 其余功能没有去了解。

Gazebo Tutorial

Gazebo (Classic) 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
    • 未完待续。。。
posted @ 2022-09-02 11:00  Harold_Lu  阅读(246)  评论(0编辑  收藏  举报