• 【gazebo要素5】ROS是如何接入gazebo的


    一、前提

            示例如何将ros的节点以plugin的形式加入到gazebo中,使它们配合构成虚拟场景。

            假如我们构造了传感器,名叫 Velodyne 的传感器功能齐全,但我们没有任何挂钩到机器人中间件,如果想让 ROS和 Gazebo结合,就必须有中间物,这里名叫plugin的中间体。 与 ROS 结合使用的好处之一是可以轻松地在真实世界和模拟世界之间切换。为了实现这一点,我们需要让我们的传感器与 ROS 生态系统很好地配合。

    二、添加 ROS 传输

            我们将修改我们当前的插件以包含 ROS 传输机制,其方式类似于我们在上一个教程中添加 Gazebo 传输机制的方式。

            我们假设您的系统上当前安装了 ROS。

    1. 加入头文件到 velodyne_plugin.ccp文件.

      1. #include
      2. #include "ros/ros.h"
      3. #include "ros/callback_queue.h"
      4. #include "ros/subscribe_options.h"
      5. #include "std_msgs/Float32.h"
    2. 追加一些成员变量到插件( plugin).

      1. /// \brief A node use for ROS transport
      2. private: std::unique_ptr rosNode;
      3. /// \brief A ROS subscriber
      4. private: ros::Subscriber rosSub;
      5. /// \brief A ROS callbackqueue that helps process messages
      6. private: ros::CallbackQueue rosQueue;
      7. /// \brief A thread the keeps running the rosQueue
      8. private: std::thread rosQueueThread;
    3. 在 Load 函数的末尾,添加以下内容。

      1. // Initialize ros, if it has not already bee initialized.
      2. if (!ros::isInitialized())
      3. {
      4. int argc = 0;
      5. char **argv = NULL;
      6. ros::init(argc, argv, "gazebo_client",
      7. ros::init_options::NoSigintHandler);
      8. }
      9. // Create our ROS node. This acts in a similar manner to
      10. // the Gazebo node
      11. this->rosNode.reset(new ros::NodeHandle("gazebo_client"));
      12. // Create a named topic, and subscribe to it.
      13. ros::SubscribeOptions so =
      14. ros::SubscribeOptions::create(
      15. "/" + this->model->GetName() + "/vel_cmd",
      16. 1,
      17. boost::bind(&VelodynePlugin::OnRosMsg, this, _1),
      18. ros::VoidPtr(), &this->rosQueue);
      19. this->rosSub = this->rosNode->subscribe(so);
      20. // Spin up the queue helper thread.
      21. this->rosQueueThread =
      22. std::thread(std::bind(&VelodynePlugin::QueueThread, this));
    4. 如果您通读代码,您会注意到我们需要两个新函数:OnRosMsg 和 QueueThread。让我们现在添加这些。

      1. /// \brief Handle an incoming message from ROS
      2. /// \param[in] _msg A float value that is used to set the velocity
      3. /// of the Velodyne.
      4. public: void OnRosMsg(const std_msgs::Float32ConstPtr &_msg)
      5. {
      6. this->SetVelocity(_msg->data);
      7. }
      8. /// \brief ROS helper function that processes messages
      9. private: void QueueThread()
      10. {
      11. static const double timeout = 0.01;
      12. while (this->rosNode->ok())
      13. {
      14. this->rosQueue.callAvailable(ros::WallDuration(timeout));
      15. }
      16. }
    5. 最后要处理的项目是 cmake 构建.

      1. 打开 CMakeLists.txt.
      2. 修改文件的顶部,如下所示。

        1. cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
        2. find_package(roscpp REQUIRED)
        3. find_package(std_msgs REQUIRED)
        4. include_directories(${roscpp_INCLUDE_DIRS})
        5. include_directories(${std_msgs_INCLUDE_DIRS})
      3. 修改插件的目标链接库。

        target_link_libraries(velodyne_plugin ${GAZEBO_LIBRARIES} ${roscpp_LIBRARIES})
      4. 您的 CMakeLists.txt 现在应该如下所示。

        1. cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
        2. find_package(roscpp REQUIRED)
        3. find_package(std_msgs REQUIRED)
        4. include_directories(${roscpp_INCLUDE_DIRS})
        5. include_directories(${std_msgs_INCLUDE_DIRS})
        6. # Find Gazebo
        7. find_package(gazebo REQUIRED)
        8. include_directories(${GAZEBO_INCLUDE_DIRS})
        9. link_directories(${GAZEBO_LIBRARY_DIRS})
        10. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GAZEBO_CXX_FLAGS}")
        11. # Build our plugin
        12. add_library(velodyne_plugin SHARED velodyne_plugin.cc)
        13. target_link_libraries(velodyne_plugin ${GAZEBO_LIBRARIES} ${roscpp_LIBRARIES})
        14. # Build the stand-alone test program
        15. add_executable(vel vel.cc)
        16. if (${gazebo_VERSION_MAJOR} LESS 6)
        17. include(FindBoost)
        18. find_package(Boost ${MIN_BOOST_VERSION} REQUIRED system filesystem regex)
        19. target_link_libraries(vel ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES})
        20. else()
        21. target_link_libraries(vel ${GAZEBO_LIBRARIES})
        22. endif()
    6. 确保你已经source了 ROS

      source /opt/ros//setup.bash
    7. 编译插件.

      1. cd ~/velodyne_plugin/build
      2. cmake ../
      3. make

    三、从 ROS 控制 Velodyne

            我们现在可以像往常一样加载 Gazebo 插件,它会在 ROS 主题上监听传入的浮动消息。然后这些消息将用于设置 Velodyne 的转速。

    1. 开启 roscore

      1. source /opt/ros//setup.bash
      2. roscore
    2. 在新终端中, 启动Gazebo

      1. cd ~/velodyne_plugin/build
      2. source /opt/ros//setup.bash
      3. gazebo ../velodyne.world
    3. 开启新终端l, use rostopic发送速度消息.

      1. source /opt/ros//setup.bash
      2. rostopic pub /my_velodyne/vel_cmd std_msgs/Float32 1.0
    4. 更改上述命令的最后一个数字以设置不同的速度。

    四、结论

            恭喜,您现在拥有构建自定义模型、共享模型和生成公共 API 的工具。玩得开心,快乐模拟!

  • 相关阅读:
    华为云IOT平台设备获取api调用笔记
    LeetCode(力扣)134. 加油站Python
    JavaScript的学习,就这一篇就OK了!(超详细)
    [书籍翻译]12周撰写期刊文章 学术出版成功指南——第 6 周:加强结构
    通信原理学习笔记6-3:数字解调——判决和误码率推导
    前端工程化精讲第十三课 缓存优化:那些基于缓存的优化方案
    Upload-labs(1-21关详细教程)【简单易懂】【万字教程】
    java 算术运算符
    1 FPGA ZYBO Xilinx 按键控制LED灯 key_led
    java基于微信小程序的在线学习平台 uniapp小程序
  • 原文地址:https://blog.csdn.net/gongdiwudu/article/details/126302113