导航

    蓝鲸ROS机器人论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 热门
    1. 主页
    2. Yanyan1011 0
    3. 帖子
    ROS交流群
    ROS Group
    产品服务
    Product Service
    开源代码库
    Github
    官网
    Official website
    技术交流
    Technological exchanges
    激光雷达
    LIDAR
    ROS教程
    ROS Tourials
    深度学习
    Deep Learning
    机器视觉
    Computer Vision
    • 资料
    • 关注 0
    • 粉丝 0
    • 主题 2
    • 帖子 24
    • 最佳 0
    • 群组 0

    Yanyan1011 0 发布的帖子

    • RE: 二维码自动充电无法保存dockposition问题

      @xiaoqiang @weijiz
      我已经检查了摄像头,二维码识别,odom,速度,全都工作良好。运行xiangqiang_local.launch文件,试图打印dock_position,没有任何输出,运行保存dock_position也没有任何数据。我想问一下,应该检查如下哪个文件?
      bw_auto_dock.png 谢谢
      我现在觉得getDockPosition.cpp文件根本就没有subscribe任何topic。
      您能提供一下测试好的正确代码吗?或者告诉我应该如何能修改现有代码,能保存充电桩位置。或者是您告诉我应该如何测验?来回来去还久了,能麻烦您提供一个有效的解决方法吗?谢谢

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @xiaoqiang @weijiz
      能识别ar_maker,id 为1.
      有odomtopic,目前都为0.
      cmd_vel,都为0.
      rqt_tree如图
      test.png

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @xiaoqiang
      能识别ar_maker,id 为1.
      有odomtopic,目前都为0.
      cmd_vel,都为0.
      rqt_tree如图,
      test.png

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @xiaoqiang @小助理 @weijiz
      但为什么存不到dock_position呢?解决方法是什么呢?我的tf是这样的
      rqt_final.png

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @weijiz 能麻烦您告诉我改那个文件里的footprint吗?

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @weijiz 我的odom到base_link,是机器人发布的。
      我的机器人的tf结构没办法改,我现在想在充电部分把base_link和base_footprint之间的tf反过来。如果按照我给您发的tf树,我应该如何修改代码?

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @weijiz @小助理
      单纯运行我的机器人,rqt树是这样的robot_rqt.png
      加了充电系统之后,rqt树如下:
      add_charge_rqt.png
      我的问题是:如果按照上面加了充电系统的rqt树,我应该如何修改程序,才能保存充电桩位置?

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @weijiz 您好,我的rqt_tree如下,tf转换代码如下,应该怎么修改阿?仍然不能保存位置信息。xiaoqiang_launch.png rqt_Tree.png

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @weijiz 我做的tf转换如上

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @weijiz tf_nodes.png Screenshot from 2023-07-04 16-54-35.png

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @weijiz
      在哪加?能举个例子吗?

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @weijiz Screenshot from 2023-07-04 16-36-45.png

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @weijiz Screenshot from 2023-07-04 15-37-52.png

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @小助理 麻烦您帮忙确认一下

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @小助理 我上面提供的代码是对二维码的吗?还是针对ir自动充电的啊?我在怀疑这个不是针对二维码保存位置信息的文件。你能提供给我一个对二维码自动充电的bw_quto_dock包的下载链接吗?我的ROS是melodic版本

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @小助理 我检查了getDockPosition.cpp文件,如下

      #include “bw_auto_dock/getDockPosition.h”

      namespace bw_auto_dock
      {
      CaculateDockPosition::CaculateDockPosition(double grid_length, std::string frame_id, std::string dock_station_filename,
      DockController* dock_controler, StatusPublisher* bw_status)
      {
      mdock_controler_ = dock_controler;
      mbw_status_ = bw_status;
      mdock_station_filename_ = dock_station_filename;
      mlocal_grid_ = new LocalGrid(0.1, grid_length / 2.0 / 0.1, frame_id);
      station_distance_ = 0.8;
      }
      bool CaculateDockPosition::getDockPosition(float (&station_pose1)[2], float (&station_pose2)[2])
      {
      //获取充电桩参考点
      boost::mutex::scoped_lock lock(mMutex_);
      std::string dbfile_path = mdock_station_filename_;//std::string(std::getenv(“HOME”)) + std::string(“/slamdb”) + std::string(“/”) + mdock_station_filename_;
      if (!boost::filesystem::exists(dbfile_path.c_str()))
      {
      return false;
      }
      else
      {
      std::ifstream dock_station_file(dbfile_path);
      if (dock_station_file.is_open())
      {
      dock_station_file >> station_pose1[0];
      dock_station_file >> station_pose1[1];
      dock_station_file >> station_pose2[0];
      dock_station_file >> station_pose2[1];
      }
      else
      {
      return false;
      }
      }
      return true;
      }

      void CaculateDockPosition::run()
      {
      ros::NodeHandle nodeHandler;
      ros::Subscriber sub1 =
      nodeHandler.subscribe(“/bw_auto_dock/dockposition_save”, 1, &CaculateDockPosition::updateMapsaveFlag, this);
      ros::Rate r(10);
      int num = 0;
      bool dock_postion_update_ = false;
      while (ros::ok())
      {
      num++;
      if (num % 100 == 0)
      {
      mlocal_grid_->runPub();
      }
      if (num % 100 == 0 && dock_postion_update_)
      {
      // 10秒自动保存一次
      dock_postion_update_ = false;
      this->saveDockPositon();
      float station_pose1[2], station_pose2[2];
      }
      DOCK_POSITION sensor_value = mbw_status_->get_dock_position();
      float ir_pose[3];

          if (mdock_controler_->getIRPose(ir_pose) && sensor_value != DOCK_POSITION::not_found)
          {
              if (!mlocal_grid_->get_ready_flag())
              {
                  float center[3];
                  center[0] = ir_pose[0];
                  center[1] = ir_pose[1];
                  center[2] = ir_pose[2];
                  mlocal_grid_->setOrigin(center);
              }
              mlocal_grid_->update_clear(ir_pose);
              mlocal_grid_->update_sensor(sensor_value, ir_pose);
              if (mbw_status_->sensor_status.power > 9.0)
              {
                  if(mbw_status_->get_charge_status() == CHARGE_STATUS::freed)
                  {
                    //触发充电桩
                    if (mlocal_grid_->set_dock_position(ir_pose))
                        dock_postion_update_ = true;
                    // ROS_INFO("dock_realposition_set %d %f %f %f",num,ir_pose[0],ir_pose[1],ir_pose[2]);
                  }                
              }
          }
      
          ros::spinOnce();
          r.sleep();
      }
      

      }

      void CaculateDockPosition::saveDockPositon()
      {
      boost::mutex::scoped_lock lock(mMutex_);
      boost::filesystem::path p(mdock_station_filename_);
      boost::filesystem::path dir = p.parent_path();
      std::string dbfile_rootpath = p.parent_path().string();
      float dock_pose[3], station_pose1[2], station_pose2[2];
      if (mlocal_grid_->get_dock_position(dock_pose))
      {
      ROS_INFO(“dock_position_saved %f %f %f”, dock_pose[0], dock_pose[1], dock_pose[2]);
      //(station_distance_,station_distance_) (station_distance_,-station_distance_)
      station_pose1[0] =
      dock_pose[0] + station_distance_ * cos(dock_pose[2]) - 0.5 * station_distance_ * sin(dock_pose[2]);
      station_pose1[1] =
      dock_pose[1] + station_distance_ * sin(dock_pose[2]) + 0.5 * station_distance_ * cos(dock_pose[2]);

          station_pose2[0] =
              dock_pose[0] + station_distance_ * cos(dock_pose[2]) + 0.5 * station_distance_ * sin(dock_pose[2]);
          station_pose2[1] =
              dock_pose[1] + station_distance_ * sin(dock_pose[2]) - 0.5 * station_distance_ * cos(dock_pose[2]);
      
          if (!boost::filesystem::exists(dbfile_rootpath.c_str()))
          {
              boost::filesystem::create_directories(dbfile_rootpath.c_str());
          }
          std::ofstream dock_station_file;
          dock_station_file.open(mdock_station_filename_);
          dock_station_file << station_pose1[0] << " " << station_pose1[1] << std::endl
                            << station_pose2[0] << " " << station_pose2[1] << std::endl;
          dock_station_file << dock_pose[0] << " " << dock_pose[1] << " " << dock_pose[2] << std::endl;
          dock_station_file.close();
      }
      

      }

      void CaculateDockPosition::updateMapsaveFlag(const std_msgs::Bool& currentFlag)
      {
      if (currentFlag.data)
      {
      float ir_pose[3];
      if (mdock_controler_->getIRPose(ir_pose))
      {
      mlocal_grid_->set_dock_position(ir_pose);
      }
      this->saveDockPositon();
      }
      }
      } // namespace bw_auto_dock

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @小助理
      我没有找到dock_node.py文件。bw_auto_dock包里只有c++文件

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电,无法保存dockposition

      @xiaoqiang Screenshot from 2023-07-04 15-37-52.png

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @小助理
      我是在git上下载的bw_auto_dock包,关于node没有作任何处理,只是修改了launch文件的dock保存地址和usb的port名称。我已经确认了保存文件具有可读写权限,tf从odom–>usb_cam–>ar_marker_1是连接的。但是仍然不能保存位置信息。

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • RE: 二维码自动充电无法保存dockposition问题

      @小助理
      3. 检查保存代码的逻辑:确保你的保存代码逻辑正确,包括文件的打开、写入和关闭操作。可以使用Python的文件操作函数(如open、write和close)来实现保存功能。
      代码是哪个文件?

      发布在 产品服务
      Yanyan1011 0
      Yanyan1011 0
    • 1
    • 2
    • 1 / 2