使用機器人操作系統ROS 2和仿真軟件Gazebo 9服務進階實戰(八)- mobot行駛至目標位置

      網友投稿 899 2025-04-12

      ROS2在基本概念上與ROS1相似,但是實現上差別較大,比如編程規范等。

      上一節是主題實戰,有興趣可以編寫代碼實現機器人速度發布和坐標訂閱。

      https://zhangrelay.blog.csdn.net/article/details/106040763

      主題,節點,消息(主題消息)~

      那么服務呢,服務器<->客戶端,如何實現一個機器人

      獲取目標點坐標?

      行駛到目標點?

      顯示行駛進度?

      這樣,三步功能呢,課程復習同樣放置在文末。先看效果吧(無解說):

      https://www.bilibili.com/video/bv1iK411W7gg

      核心要點:

      srv:

      float32 x

      float32 y

      ---

      bool success

      x,y為目標坐標,success反饋是否成功接受到坐標。

      1. 只接受坐標,機器人mobot不行動!

      這里放個水,直接給出參考源碼,注意代碼并不規范優雅,僅為功能實現。

      服務器端

      #include "rclcpp/rclcpp.hpp"

      #include "mobot/srv/drivegoalsrv.hpp"

      #include

      void get(const std::shared_ptr request,

      std::shared_ptr response)

      {

      if(request->x>0.0)

      {

      response->success=1;

      RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Get Goal\nx: %lf" " y: %lf",

      request->x, request->y);

      RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Flag: [%d]", response->success);

      }

      else

      {

      response->success=0;

      RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Error, x>0!!!\nx: %lf" " y: %lf",

      request->x, request->y);

      RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Flag: [%d]", response->success);

      }

      }

      int main(int argc, char **argv)

      {

      rclcpp::init(argc, argv);

      std::shared_ptr node = rclcpp::Node::make_shared("get_goal_server");

      使用機器人操作系統ROS 2和仿真軟件Gazebo 9服務進階實戰(八)- mobot行駛至目標位置

      rclcpp::Service::SharedPtr service =

      node->create_service("get_goal", &get);

      RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Ready to get goal.");

      rclcpp::spin(node);

      rclcpp::shutdown();

      }

      客戶端:思考實現!三個功能客戶端都是一樣的,就是送個坐標給服務器而已。

      需要修改CMakeLists.txt和package.xml。

      2. 行駛到目標點

      此為實踐作業,需獨立完成。

      3. 顯示進度

      詳細內容參考前文視頻鏈接。

      補充思考題:

      如何用行動(action)實現第三個功能呢,顯示進度的功能。

      復習:服務

      官方示例: sum=a+b

      客戶端發送a b,

      服務器計算求和并返回給客戶端。

      案例非常簡單,稍微復雜一下,如上述機器人案例,發送目標坐標,機器人行駛到目標坐標。

      客戶端:add_two_ints_client.cpp

      #include "rclcpp/rclcpp.hpp"

      #include "example_interfaces/srv/add_two_ints.hpp"

      #include

      #include

      #include

      using namespace std::chrono_literals;

      int main(int argc, char **argv)

      {

      rclcpp::init(argc, argv);

      if (argc != 3) {

      RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "usage: add_two_ints_client X Y");

      return 1;

      }

      std::shared_ptr node = rclcpp::Node::make_shared("add_two_ints_client");

      rclcpp::Client::SharedPtr client =

      node->create_client("add_two_ints");

      auto request = std::make_shared();

      request->a = atoll(argv[1]);

      request->b = atoll(argv[2]);

      while (!client->wait_for_service(1s)) {

      if (!rclcpp::ok()) {

      RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Interrupted while waiting for the service. Exiting.");

      return 0;

      }

      RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "service not available, waiting again...");

      }

      auto result = client->async_send_request(request);

      // Wait for the result.

      if (rclcpp::spin_until_future_complete(node, result) ==

      rclcpp::executor::FutureReturnCode::SUCCESS)

      {

      RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Sum: %ld", result.get()->sum);

      } else {

      RCLCPP_ERROR(rclcpp::get_logger("rclcpp"), "Failed to call service add_two_ints");

      }

      rclcpp::shutdown();

      return 0;

      }

      服務器端:add_two_ints_server.cpp

      #include "rclcpp/rclcpp.hpp"

      #include "example_interfaces/srv/add_two_ints.hpp"

      #include

      void add(const std::shared_ptr request,

      std::shared_ptr response)

      {

      response->sum = request->a + request->b;

      RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Incoming request\na: %ld" " b: %ld",

      request->a, request->b);

      RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "sending back response: [%ld]", (long int)response->sum);

      }

      int main(int argc, char **argv)

      {

      rclcpp::init(argc, argv);

      std::shared_ptr node = rclcpp::Node::make_shared("add_two_ints_server");

      rclcpp::Service::SharedPtr service =

      node->create_service("add_two_ints", &add);

      RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Ready to add two ints.");

      rclcpp::spin(node);

      rclcpp::shutdown();

      }

      CMakeLists.txt:

      cmake_minimum_required(VERSION 3.5)

      project(cpp_srvcli)

      find_package(ament_cmake REQUIRED)

      find_package(rclcpp REQUIRED)

      find_package(example_interfaces REQUIRED)

      add_executable(server src/add_two_ints_server.cpp)

      ament_target_dependencies(server

      rclcpp example_interfaces)

      add_executable(client src/add_two_ints_client.cpp)

      ament_target_dependencies(client

      rclcpp example_interfaces)

      install(TARGETS

      server

      client

      DESTINATION lib/${PROJECT_NAME})

      ament_package()

      其中要點,解析參考官方文檔。

      機器人

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:表格字體如何變大(表格怎么讓字體變大)
      下一篇:怎樣繪制曲線圖(怎樣繪制曲線圖表)
      相關文章
      亚洲av无码一区二区乱子伦as| 亚洲影院天堂中文av色| 亚洲最大天堂无码精品区| 国产区图片区小说区亚洲区| 久久亚洲sm情趣捆绑调教| 亚洲国产精品久久久天堂| 国产午夜亚洲精品国产成人小说| 亚洲AV成人精品日韩一区18p| 亚洲偷自精品三十六区| 亚洲一区二区免费视频| 亚洲六月丁香六月婷婷蜜芽| 久久久久亚洲AV片无码| 亚洲国产精品一区| 中文字幕精品亚洲无线码一区 | 亚洲精品成人网久久久久久| 亚洲av无码一区二区三区人妖 | 国产亚洲精AA在线观看SEE| 色噜噜亚洲精品中文字幕 | 成人精品国产亚洲欧洲| 国产亚洲精品精品精品| 国产亚洲成在线播放va| 亚洲成av人片在线观看天堂无码| 在线观看亚洲电影| 亚洲一区二区三区深夜天堂| 亚洲精品中文字幕无乱码麻豆| 2020久久精品亚洲热综合一本 | 久久精品国产99精品国产亚洲性色| 国产亚洲精品自在久久| 亚洲另类激情综合偷自拍图| 亚洲国产成人片在线观看无码| 久久久亚洲精品视频| 亚洲精品视频在线观看免费| 亚洲一级毛片免费观看| 亚洲人配人种jizz| 亚洲w码欧洲s码免费| 亚洲国产日韩a在线播放| 亚洲欧美熟妇综合久久久久| 国产精品亚洲二区在线| 2022中文字字幕久亚洲| 久久精品国产精品亚洲精品| 亚洲丝袜美腿视频|