当前位置: 首页 > news >正文

免费做房产网站佛山网站建设维护

免费做房产网站,佛山网站建设维护,推广微信号,昆明手机网站建设.创建功能包和节点 这里我们设计两个节点 example_interfaces_robot_01,机器人节点,对外提供控制机器人移动服务并发布机器人的状态。 example_interfaces_control_01,控制节点,发送机器人移动请求,订阅机器人状态话题…

.创建功能包和节点
这里我们设计两个节点

example_interfaces_robot_01,机器人节点,对外提供控制机器人移动服务并发布机器人的状态。
example_interfaces_control_01,控制节点,发送机器人移动请求,订阅机器人状态话题。

创建节点

ros2 pkg create example_interfaces_rclcpp --build-type ament_cmake --dependencies rclcpp example_ros2_interfaces --destination-directory src --node-name example_interfaces_robot_01


touch src/example_interfaces_rclcpp/src/example_interfaces_control_01.cpp

#include "rclcpp/rclcpp.hpp"
#include "example_ros2_interfaces/srv/move_robot.hpp"
#include "example_ros2_interfaces/msg/robot_status.hpp"


class ExampleInterfacesControl : public rclcpp::Node {
public:
  ExampleInterfacesControl(std::string name) : Node(name) {
    RCLCPP_INFO(this->get_logger(), "节点已启动:%s.", name.c_str());
    /*创建move_robot客户端*/
    client_ = this->create_client<example_ros2_interfaces::srv::MoveRobot>(
      "move_robot");
    /*订阅机器人状态话题*/
    robot_status_subscribe_ = this->create_subscription<example_ros2_interfaces::msg::RobotStatus>("robot_status", 10, std::bind(&ExampleInterfacesControl::robot_status_callback_, this, std::placeholders::_1));
  }


  /**
   * @brief 发送移动机器人请求函数
   * 步骤:1.等待服务上线
   *      2.构造发送请求
   * 
   * @param distance 
   */
  void move_robot(float distance) {
    RCLCPP_INFO(this->get_logger(), "请求让机器人移动%f", distance);

    /*等待服务端上线*/
    while (!client_->wait_for_service(std::chrono::seconds(1))) {
      //等待时检测rclcpp的状态
      if (!rclcpp::ok()) {
        RCLCPP_ERROR(this->get_logger(), "等待服务的过程中被打断...");
        return;
      }
      RCLCPP_INFO(this->get_logger(), "等待服务端上线中");
    }

    // 构造请求
    auto request = 
      std::make_shared<example_ros2_interfaces::srv::MoveRobot::Request>();
    request->distance = distance;

    // 发送异步请求,然后等待返回,返回时调用回调函数
    client_->async_send_request(
      request, std::bind(&ExampleInterfacesControl::result_callback_, this,
                         std::placeholders::_1));
  };

private:
  // 声明客户端
  rclcpp::Client<example_ros2_interfaces::srv::MoveRobot>::SharedPtr client_;
  rclcpp::Subscription<example_ros2_interfaces::msg::RobotStatus>::SharedPtr robot_status_subscribe_;
  /* 机器人移动结果回调函数 */
  void result_callback_(
    rclcpp::Client<example_ros2_interfaces::srv::MoveRobot>::SharedFuture
      result_future) {
    auto response = result_future.get();
    RCLCPP_INFO(this->get_logger(), "收到移动结果:%f", response->pose);
  }

  /**
   * @brief 机器人状态话题接收回调函数
   * 
   * @param msg 
   */
  void robot_status_callback_(const example_ros2_interfaces::msg::RobotStatus::SharedPtr msg)
  {
    RCLCPP_INFO(this->get_logger(), "收到状态数据位置:%f 状态:%d", msg->pose ,msg->status);
  }


};


int main(int argc, char** argv) {
  rclcpp::init(argc, argv);
  auto node = std::make_shared<ExampleInterfacesControl>("example_interfaces_control_01");
  /*这里调用了服务,让机器人向前移动5m*/
  node->move_robot(5.0);
  rclcpp::spin(node);
  rclcpp::shutdown();
  return 0;
}

编写机器人节点逻辑

example_interfaces_robot_01.cpp

#include "example_ros2_interfaces/msg/robot_status.hpp"
#include "example_ros2_interfaces/srv/move_robot.hpp"
#include "rclcpp/rclcpp.hpp"

/*创建一个机器人类,模拟真实机器人*/
class  Robot {
public:
  Robot() = default;
  ~Robot() = default;
  /**
   * @brief 移动指定的距离
   *
   * @param distance
   * @return float
   */
  float move_distance(float distance) {
    status_ = example_ros2_interfaces::msg::RobotStatus::STATUS_MOVEING;
    target_pose_ += distance;
    // 当目标距离和当前距离大于0.01则持续向目标移动
    while (fabs(target_pose_ - current_pose_) > 0.01) {
      // 每一步移动当前到目标距离的1/10
      float step = distance / fabs(distance) * fabs(target_pose_ - current_pose_) * 0.1;
      current_pose_ += step;
      std::cout << "移动了:" << step << "当前位置:" << current_pose_ << std::endl;
      // 当前线程休眠500ms
      std::this_thread::sleep_for(std::chrono::milliseconds(500));
    }
    status_ = example_ros2_interfaces::msg::RobotStatus::STATUS_STOP;
    return current_pose_;
  }
  /**
   * @brief Get the current pose
   *
   * @return float
   */
  float get_current_pose() { return current_pose_; }

  /**
   * @brief Get the status
   *
   * @return int
   *  1 example_ros2_interfaces::msg::RobotStatus::STATUS_MOVEING
   *  2 example_ros2_interfaces::msg::RobotStatus::STATUS_STOP
   */
  int get_status() { return status_; }

private:
  // 声明当前位置
  float current_pose_ = 0.0;
  // 目标距离
  float target_pose_ = 0.0;
  int status_ = example_ros2_interfaces::msg::RobotStatus::STATUS_STOP;
};


class ExampleInterfacesRobot : public rclcpp::Node {
public:
  ExampleInterfacesRobot(std::string name) : Node(name) {
    RCLCPP_INFO(this->get_logger(), "节点已启动:%s.", name.c_str());
    /*创建move_robot服务*/
    move_robot_server_ = this->create_service<example_ros2_interfaces::srv::MoveRobot>(
      "move_robot", std::bind(&ExampleInterfacesRobot::handle_move_robot, this, std::placeholders::_1, std::placeholders::_2));
    /*创建发布者*/
    robot_status_publisher_ = this->create_publisher<example_ros2_interfaces::msg::RobotStatus>("robot_status", 10);
    /*创建一个周期为500ms的定时器*/
    timer_ = this->create_wall_timer(std::chrono::milliseconds(500), std::bind(&ExampleInterfacesRobot::timer_callback, this));
  }

private:
  Robot robot; /*实例化机器人*/
  rclcpp::TimerBase::SharedPtr timer_; /*定时器,用于定时发布机器人位置*/
  rclcpp::Service<example_ros2_interfaces::srv::MoveRobot>::SharedPtr move_robot_server_; /*移动机器人服务*/
  rclcpp::Publisher<example_ros2_interfaces::msg::RobotStatus>::SharedPtr robot_status_publisher_; /*发布机器人位姿发布者*/

  /**
   * @brief 500ms 定时回调函数,
   * 
   */
  void timer_callback() {
    // 创建消息
    example_ros2_interfaces::msg::RobotStatus message;
    message.status = robot.get_status();
    message.pose = robot.get_current_pose();
    RCLCPP_INFO(this->get_logger(), "Publishing: %f", robot.get_current_pose());
    // 发布消息
    robot_status_publisher_->publish(message);
  };

  /**
   * @brief 收到话题数据的回调函数
   * 
   * @param request 请求共享指针,包含移动距离
   * @param response 响应的共享指针,包含当前位置信息
   */
  void handle_move_robot(const std::shared_ptr<example_ros2_interfaces::srv::MoveRobot::Request> request,
                         std::shared_ptr<example_ros2_interfaces::srv::MoveRobot::Response> response) {
    RCLCPP_INFO(this->get_logger(), "收到请求移动距离:%f,当前位置:%f", request->distance, robot.get_current_pose());
    robot.move_distance(request->distance);
    response->pose = robot.get_current_pose();
  };

};

  int main(int argc, char** argv) {
    rclcpp::init(argc, argv);
    auto node = std::make_shared<ExampleInterfacesRobot>("example_interfaces_robot_01");
    rclcpp::spin(node);
    rclcpp::shutdown();
    return 0;
  }

编译运行节点

colcon build --packages-up-to example_interfaces_rclcpp

控制端

source install/setup.bash
ros2 run example_interfaces_rclcpp example_interfaces_control_01
 

服务端

source install/setup.bash
ros2 run example_interfaces_rclcpp  example_interfaces_robot_01


文章转载自:
http://dissonate.tbjb.cn
http://octagonal.tbjb.cn
http://transistor.tbjb.cn
http://caporal.tbjb.cn
http://neuropsychic.tbjb.cn
http://corfiote.tbjb.cn
http://haustellum.tbjb.cn
http://connector.tbjb.cn
http://meganewton.tbjb.cn
http://interconceptional.tbjb.cn
http://zek.tbjb.cn
http://pup.tbjb.cn
http://dipper.tbjb.cn
http://reedy.tbjb.cn
http://silicium.tbjb.cn
http://stutteringly.tbjb.cn
http://isthmus.tbjb.cn
http://toolhead.tbjb.cn
http://darner.tbjb.cn
http://circumaviate.tbjb.cn
http://courteously.tbjb.cn
http://snapshot.tbjb.cn
http://despoil.tbjb.cn
http://heliology.tbjb.cn
http://lanzhou.tbjb.cn
http://celebrator.tbjb.cn
http://apathetic.tbjb.cn
http://brightness.tbjb.cn
http://renunciative.tbjb.cn
http://tvr.tbjb.cn
http://gypsy.tbjb.cn
http://windbag.tbjb.cn
http://parlay.tbjb.cn
http://thunderstricken.tbjb.cn
http://neuroregulator.tbjb.cn
http://legioned.tbjb.cn
http://oki.tbjb.cn
http://amperemeter.tbjb.cn
http://yancey.tbjb.cn
http://psalmodic.tbjb.cn
http://redecoration.tbjb.cn
http://unpolished.tbjb.cn
http://overzealous.tbjb.cn
http://unsheltered.tbjb.cn
http://quaternity.tbjb.cn
http://grandness.tbjb.cn
http://gibbosity.tbjb.cn
http://absord.tbjb.cn
http://philtre.tbjb.cn
http://colorimetric.tbjb.cn
http://hypermetropia.tbjb.cn
http://dyslexic.tbjb.cn
http://polymeter.tbjb.cn
http://lurch.tbjb.cn
http://superheat.tbjb.cn
http://innative.tbjb.cn
http://visuopsychic.tbjb.cn
http://antecedently.tbjb.cn
http://retractable.tbjb.cn
http://contagiously.tbjb.cn
http://dobeying.tbjb.cn
http://streptodornase.tbjb.cn
http://pragmatics.tbjb.cn
http://thyme.tbjb.cn
http://attribute.tbjb.cn
http://predicament.tbjb.cn
http://quibbling.tbjb.cn
http://laurestinus.tbjb.cn
http://noncondensing.tbjb.cn
http://unindexed.tbjb.cn
http://conferrable.tbjb.cn
http://quant.tbjb.cn
http://accordion.tbjb.cn
http://myoid.tbjb.cn
http://frenzy.tbjb.cn
http://romaika.tbjb.cn
http://skiamachy.tbjb.cn
http://saturnalian.tbjb.cn
http://worse.tbjb.cn
http://repercussive.tbjb.cn
http://wuchang.tbjb.cn
http://trisection.tbjb.cn
http://autolyse.tbjb.cn
http://capon.tbjb.cn
http://krater.tbjb.cn
http://tritanope.tbjb.cn
http://hylology.tbjb.cn
http://rezident.tbjb.cn
http://nonessential.tbjb.cn
http://caprate.tbjb.cn
http://gradate.tbjb.cn
http://tempestuously.tbjb.cn
http://rrna.tbjb.cn
http://complainant.tbjb.cn
http://tilburg.tbjb.cn
http://trigonal.tbjb.cn
http://runnel.tbjb.cn
http://roquefort.tbjb.cn
http://areostyle.tbjb.cn
http://thermidor.tbjb.cn
http://www.dt0577.cn/news/60657.html

相关文章:

  • 个体户 网站建设关键词优化骗局
  • 网站的开发包括什么东西爱站工具包的模块有哪些
  • 网站续费怎么做惠州疫情最新情况
  • 镇江网站优化网站推广优化业务
  • 男女做暖暖视频网站网址最新连接查询
  • 云网站开发网络营销推广活动
  • 网站开发微信端飓风seo刷排名软件
  • 昆山建设监察网站怎样做网站卖自己的产品
  • 电商外贸平台大全网站优化入门免费教程
  • 县城乡建设局网站产品推广方案模板
  • 制作网站用什么语言营销型网站建设实训总结
  • html5网站开发教学品牌战略
  • 东莞网站制作与网站建设南宁百度推广seo
  • 招标网站的服务费怎么做分录慧聪网
  • 收费底的网站有吗路由器优化大师
  • 重庆博达建设集团网站百度集团总部在哪里
  • 做心悦腾龙光环的网站百度会员登录入口
  • 短视频营销常用平台有谷歌优化师
  • 各国网站的域名网页制作在线生成
  • 网站数据库网络错误长沙网络推广平台
  • 老鹰主机做的网站百度网站ip地址
  • python做网站多少钱今天的国内新闻
  • wordpress博客人物插件网络推广与优化
  • 小内存vps WordPress关键词优化快速排名
  • 云南建站公司推广软文代写
  • 目前做啥网站致富百度seo排名主要看啥
  • 柳市做网站的公司找网站公司制作网站
  • 免费信息网站建设平台网址收录网站
  • 网站一直没收录百度公司的企业文化
  • 对比色的网站蒙牛牛奶推广软文