ardupilot4.2.2-定制地面站信息

1、电池数据信息发送给地面站

        应设计要求,需要把电池的电压,电量百分比,电量,温度,循环次数等信息发送到地面站并在地面站上显示出来。

        在地面站上显示数据的文件为GCS_Common.cpp,在此文件中可以发现很多给地面站发送数据的函数,找到void GCS_MAVLINK::send_battery_status(const uint8_t instance) const,在此函数中可以给地面站发送一定的电池数据,

void GCS_MAVLINK::send_battery_status(const uint8_t instance) const
{
   /*............*/
  ///  在地面站显示电池信息  ///
    mavlink_msg_battery_status_send(chan,
                                    hal.util->battery_id,// instance, // id 电池信息
                                    MAV_BATTERY_FUNCTION_UNKNOWN, // function
                                    hal.util->battery_type,//MAV_BATTERY_TYPE_UNKNOWN, // type 类型
                                    hal.util->battery_temp_inf / 0.1f,//got_temperature ? ((int16_t) (temp * 100)) : INT16_MAX, // temperature. INT16_MAX if unknown 温度
                                    cell_volts, // cell voltages //电池电压
                                    hal.util->battery_current_inf,//current,      // current in centiampere   电流
                                    consumed_mah, // total consumed current in milliampere.hour 总消耗电流(毫安小时)
                                    consumed_wh,  // consumed energy in hJ (hecto-Joules) 消耗能量(hJ)(百焦耳)
                                    hal.util->battery_capabi_percent,//percentage, // 剩余电量百分比!bttery_cyc_life,//
                                    hal.util->battery_version,//time_remaining, // time remaining, seconds 剩余时间,秒
                                    battery.get_mavlink_charge_state(instance), // battery charge state 电池充电状态
                                    cell_volts_ext, // Cell 11..14 voltages 电池11..14电压
                                    0, // battery mode 电池模式
                                    //hal.util->battery_cyc_life,//battery.capacity_remaining_pct(instance), //电池剩余容量
                                    //hal.util->battery_version,//0, // time remaining, seconds (not provided) 剩余时间,秒(未提供)
                                    battery.get_mavlink_fault_bitmask(instance));   // fault_bitmask 错误_位掩码
 /*............*/
}

将对应的电压,百分比,电流等参数替换成我们已经设定好的数据即可。

其次还有电池的循环次数在另一个函数当中实现。

void GCS_MAVLINK::send_sys_status()
{
   /*................*/
   mavlink_msg_sys_status_send(
        chan,
        control_sensors_present,
        control_sensors_enabled,
        control_sensors_health,
        static_cast<uint16_t>(AP::scheduler().load_average() * 1000),
#if !defined(HAL_BUILD_AP_PERIPH) || defined(HAL_PERIPH_ENABLE_BATTERY)
        battery.gcs_voltage() * 1000,  // mV
        hal.util->battery_current_inf,//battery_current,        // in 10mA units
        hal.util->battery_cyc_life,//battery_remaining,      // in %
#else
        0,
        -1,
        -1,
#endif
        0,  // comm drops %,
        0,  // comm drops in pkts,
        errors1,
        errors2,
        0,  // errors3
        errors4); // errors4
}

2、发送雷达避障数据给地面站

        同样在GCS_Common.cpp文件中,

void GCS_MAVLINK::send_proximity()
{
#if HAL_PROXIMITY_ENABLED
    AP_Proximity *proximity = AP_Proximity::get_singleton();
    if(copter.get_avoid_port() == 0){//串口雷达
    if (proximity == nullptr) {
        return; // this is wrong, but pretend we sent data and don't requeue
    }

    // get min/max distances
    const uint16_t dist_min = (uint16_t)(proximity->distance_min() * 100.0f); // minimum distance the sensor can measure in centimeters
    const uint16_t dist_max = (uint16_t)(proximity->distance_max() * 100.0f); // maximum distance the sensor can measure in centimeters

    // send horizontal distances
    if (proximity->get_status() == AP_Proximity::Status::Good) {
        AP_Proximity::Proximity_Distance_Array dist_array;
        if (proximity->get_horizontal_distances(dist_array)) {
            for (uint8_t i = 0; i < PROXIMITY_MAX_DIRECTION; i++) {
                if (!HAVE_PAYLOAD_SPACE(chan, DISTANCE_SENSOR)) {
                    return;
                }
                if (dist_array.valid(i)) {
                    proximity_ever_valid_bitmask |= (1U << i);
                } else if (!(proximity_ever_valid_bitmask & (1U << i))) {
                    // we've never sent this distance out, so we don't
                    // need to send an invalid one.
                    continue;
                }
                mavlink_msg_distance_sensor_send(
                        chan,
                        AP_HAL::millis(),                               // time since system boot
                        dist_min,                                       // minimum distance the sensor can measure in centimeters
                        dist_max,                                       // maximum distance the sensor can measure in centimeters
                        (uint16_t)(dist_array.distance[i] * 100.0f),    // current distance reading
                        MAV_DISTANCE_SENSOR_LASER,                      // type from MAV_DISTANCE_SENSOR enum
                        PROXIMITY_SENSOR_ID_START + i,                  // onboard ID of the sensor
                        dist_array.orientation[i],                      // direction the sensor faces from MAV_SENSOR_ORIENTATION enum
                        0,                                              // Measurement covariance in centimeters, 0 for unknown / invalid readings
                        0, 0, nullptr, 0);
            }
        }
    }

    // send upward distance
    float dist_up;
    if (proximity->get_upward_distance(dist_up)) {
        if (!HAVE_PAYLOAD_SPACE(chan, DISTANCE_SENSOR)) {
            return;
        }
        mavlink_msg_distance_sensor_send(
                chan,
                AP_HAL::millis(),                                         // time since system boot
                dist_min,                                                 // minimum distance the sensor can measure in centimeters
                dist_max,                                                 // maximum distance the sensor can measure in centimeters
                (uint16_t)(dist_up * 100.0f),                             // current distance reading
                MAV_DISTANCE_SENSOR_LASER,                                // type from MAV_DISTANCE_SENSOR enum
                PROXIMITY_SENSOR_ID_START + PROXIMITY_MAX_DIRECTION + 1,  // onboard ID of the sensor
                MAV_SENSOR_ROTATION_PITCH_90,                             // direction upwards
                0,                                                        // Measurement covariance in centimeters, 0 for unknown / invalid readings
                0, 0, nullptr, 0);
    }
    }
    else if(copter.get_avoid_port() == 1){//CAN口雷达

            const uint16_t dist_min = (uint16_t)(proximity->distance_min() * 100.0f); // minimum distance the sensor can measure in centimeters
            const uint16_t dist_max = (uint16_t)(proximity->distance_max() * 100.0f); // maximum distance the sensor can measure in centimeters

            for (uint8_t i = 0; i < 8; i++)
            {
                uint32_t now = AP_HAL::millis();
                if (now - hal.util->mr72_time > 300)
                {
                    hal.util->mr72_dist[i] = 0;
                }

                mavlink_msg_distance_sensor_send(
                    chan,
                    AP_HAL::millis(),                        // time since system boot TODO: take time of measurement
                    0,               // minimum distance the sensor can measure in centimeters
                    8000,               // maximum distance the sensor can measure in centimeters
                    hal.util->mr72_dist[i],                   // current distance reading
                    MAV_DISTANCE_SENSOR_LASER,  // type from MAV_DISTANCE_SENSOR enum
                    PROXIMITY_SENSOR_ID_START + i,                                // onboard ID of the sensor == instance
                    i,                   // direction the sensor faces from MAV_SENSOR_ORIENTATION enum
                    0,                                       // Measurement covariance in centimeters, 0 for unknown / invalid readings
                    0,                                       // horizontal FOV
                    0,                                       // vertical FOV
                    (const float *)nullptr,0);                 // quaternion of sensor orientation for MAV_SENSOR_ROTATION_CUSTOM
            }

            // send upward distance
            float dist_up;
            if (proximity->get_upward_distance(dist_up)) {
                if (!HAVE_PAYLOAD_SPACE(chan, DISTANCE_SENSOR)) {
                    return;
                }
                mavlink_msg_distance_sensor_send(
                        chan,
                        AP_HAL::millis(),                                         // time since system boot
                        dist_min,                                                 // minimum distance the sensor can measure in centimeters
                        dist_max,                                                 // maximum distance the sensor can measure in centimeters
                        (uint16_t)(dist_up * 100.0f),                             // current distance reading
                        MAV_DISTANCE_SENSOR_LASER,                                // type from MAV_DISTANCE_SENSOR enum
                        PROXIMITY_SENSOR_ID_START + PROXIMITY_MAX_DIRECTION + 1,  // onboard ID of the sensor
                        MAV_SENSOR_ROTATION_PITCH_90,                             // direction upwards
                        0,                                                        // Measurement covariance in centimeters, 0 for unknown / invalid readings
                        0, 0, nullptr,0);
            }
        }
#endif // HAL_PROXIMITY_ENABLED
}
            

正确通电后,在地面站上按Ctrl+F 打开proximity即可看到雷达数据

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值