基于ROS搭建简易软件框架实现ROV水下目标跟踪(十四完结)--目标

作者:神秘网友 发布时间:2020-10-31 11:00:56

基于ROS搭建简易软件框架实现ROV水下目标跟踪(十四完结)--目标

基于ROS搭建简易软件框架实现ROV水下目标跟踪(十四完结)--目标跟踪模块

      模块十分简单,可以介绍的内容很少。包括两个部分:计算目标物中心距图片中心的偏差,对应cabin_vision/object_deviation;PID跟踪控制,对应cabin_behaviors/pid_tracking。

一、偏差计算

      输入输出:

基于ROS搭建简易软件框架实现ROV水下目标跟踪(十四完结)--目标

      监听topic:/darknet_ros/bounding_boxes,格式darknet_ros_msgs::BoundingBoxes,目标框图顶点在图片中像素点的位置;

      发布topic:/cabin_vision/deviation,格式geometry_msgs::PointStamped,目标中心像素点与图片中心像素点偏差。

      直接看代码吧,object_deviation.cpp。这部分我写了个python版本的object_deviation.py,有兴趣的话可以看看。

      首先是读取设定的摄像头分辨率。

//Load the width and heigth of the camera image
string properties_file;
nh.param("properties_file", properties_file, std::string(""));
if(properties_file.size() != 0){
    if(access(properties_file.c_str(),F_OK) == -1){
        std::cout<<""<<std::endl;
        std::cout<<RED<<"\""<<properties_file<<"\""<<" does not exist!!!!"<<std::endl;
        std::cout<<""<<std::endl;
        ros::shutdown();
    }
    else{
        YAML::Node properties;
        properties = YAML::LoadFile(properties_file);
        image_width = properties["image_width"].as<int>();
        image_height = properties["image_height"].as<int>();
    }
}

      再者为收到一个目标数据后,计算偏差。

void ObjectDeviation::BoundingBoxSub(const darknet_ros_msgs::BoundingBoxes msg){
    deviation_msg.header.stamp = ros::Time::now();
    deviation_msg.point.x = (msg.bounding_boxes[0].xmin + msg.bounding_boxes[0].xmax) / 2.0 - image_width / 2.0;
    deviation_msg.point.y = (msg.bounding_boxes[0].ymin + msg.bounding_boxes[0].ymax) / 2.0 - image_height / 2.0;
    deviation_pub.publish(deviation_msg);
}

二、PID跟踪控制

      输入输出:

基于ROS搭建简易软件框架实现ROV水下目标跟踪(十四完结)--目标

      监听topic:/cabin_vision/deviation,格式geometry_msgs::PointStamped,目标中心像素点与图片中心像素点偏差。

      发布topic:/command/netLoad,格式cabin_msgs::netLoad,作用于机器人上的力及转矩,直接作为基础运动模块的输入;

      直接看代码cabin_behaviors/pid_tracking.cpp。对于偏差的处理,如下图:

基于ROS搭建简易软件框架实现ROV水下目标跟踪(十四完结)--目标

      设定了一个区域,当机器人中心位于该区域时,即偏差量小于safe_area_x或safe_area_y时,PID控制器在相应方向输出的控制量为0。PID控制器随手写了一个简易的,对应代码:

double PIDTracking::PIDController(double err, double pid_p, double pid_i, double pid_d, double last_err, double *integral, double safe_area){
    double u = 0.0;
    //double t = *integral;
    if(abs(err) > safe_area){
        *integral += err;
        //t += err;
        //u = pid_p * err + pid_i * t + pid_d * (err - last_err);
        u = pid_p * err + pid_i * (*integral) + pid_d * (err - last_err);
        last_err = err;
        //*integral = t;
    }
    return u;
}

      剩下的是ros下借助rqt动态调参工具的配置,包括pid参数,安全区域大小,跟踪模式开关:

//Callback for dynamic reconfigure
void PIDTracking::DynamicReconfigCallback(cabin_behaviors::PIDTrackingConfig &config, uint32_t levels){
    pid_p_mz = config.pid_p_mz;
    pid_i_mz = config.pid_i_mz;
    pid_d_mz = config.pid_d_mz;
    pid_p_z = config.pid_p_z;
    pid_i_z = config.pid_i_z;
    pid_d_z = config.pid_d_z;
    safe_area_x = config.safe_area_x;
    safe_area_y = config.safe_area_y;

    tracking_switch = config.tracking_switch;
}

      实际在调试时没有太追求效果,只用了比例控制,即将积分i和微分d的参数都设为0。

 

      自此,整个demo软件框架所有模块基本都介绍完毕。

 

基于ROS搭建简易软件框架实现ROV水下目标跟踪(十四完结)--目标相关教程

  1. 【Spring】基于XML的IOC案例

    【Spring】基于XML的IOC案例 代码结构: bean.xml ?xml version=1.0 encoding=UTF-8?beans xmlns=http://www.springframework.org/schema/beans xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://www.springframework.org/sch

  2. 基于cloudera manager的大数据集群平台搭建之集群服务安装

    基于cloudera manager的大数据集群平台搭建之集群服务安装 继续上篇,这篇介绍集群服务安装 监控服务安装 出现如下界面的原因是我们没有安装监控服务,因此应该首先安装监控服务,便于后面安装其他服务的过程出现问题的排查。 点击如下直接进行添加监控服务的

  3. STM32L475基于RT-Thread PWM模块的使用注意事项

    STM32L475基于RT-Thread PWM模块的使用注意事项 STM32L475基于RT-Thread PWM模块的使用注意事项 关于RT-Thread PWM模块配置的步骤可参考官方提供的步骤来进行配置,但是官方讲解的不全面,按照官方的配置来进行配置最后下载到板子里面验证时候没有波形输出,

  4. kafka集群搭建

    kafka集群搭建 1.1 ZooKeeper 集群介绍: ZooKeeper 集群中的所有机器通过一个 Leader 选举过程来选定一台称为 “Leader” 的机器,Leader 既可以为客户端提供写服务又能提供读服务。除了 Leader 外, Follower 和 Observer 都只能提供读服务。Follower 和 Ob

  5. minio文件服务器 docker 搭建

    minio文件服务器 docker 搭建 docker hub 查询minio 官方镜像 镜像说明 快速入门指南 # 拉取镜像docker pull minio/minio# 启动镜像docker run --name minio -v /home/minio/data:/data -v /minio/config:/root/.minio -p 9000:9000 -e MINIO_ACCESS_KEY=admi

  6. 基于应用日志的扫描器检测实践

    基于应用日志的扫描器检测实践 基于应用日志的扫描器检测实践 在网络上搜索web扫描器时,各类扫描器工具、扫描攻略玲琅满目,但对扫描器检测方法的内容却少之又少。因此,本文对各类web扫描特特征进行了梳理和总结,并结合苏宁应用防火墙(SNWAF)日志数据,

  7. 利用docker容器一分钟搭建完开发环境

    利用docker容器一分钟搭建完开发环境 本文只做简单演示,方便我们在新的电脑环境上快速搭建一系列数据库环境方便开发 更多请移步Docker官方文档 MacOS和Win10(1909/2004 支持WSL2)用户推荐直接安装Docker Desktop Ubuntu 可以使用国内 daocloud 一键安装命令

  8. ubuntu git服务器的搭建

    ubuntu git服务器的搭建 学习目标: 学习内容 一、ubuntu git服务器的安装 1、在家目录下创建一个用于用来运行git服务的新用户 git 2、收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,