|
|
|
@ -41,7 +41,15 @@
@@ -41,7 +41,15 @@
|
|
|
|
|
#include <ardupilot/equipment/trafficmonitor/TrafficReport.hpp> |
|
|
|
|
#include <uavcan/equipment/gnss/RTCMStream.hpp> |
|
|
|
|
|
|
|
|
|
#include<zrzk/equipment/indication/ZrRGB.hpp> |
|
|
|
|
#include <zrzk/equipment/indication/ZrRGB.hpp> |
|
|
|
|
|
|
|
|
|
#include <zrzk/equipment/camera/Version.hpp> |
|
|
|
|
#include <zrzk/equipment/camera/Status.hpp> |
|
|
|
|
#include <zrzk/equipment/camera/CamFeedBack.hpp> |
|
|
|
|
#include <zrzk/equipment/camera/Command.hpp> |
|
|
|
|
|
|
|
|
|
#include <uavcan/equipment/camera_gimbal/GEOPOICommand.hpp> |
|
|
|
|
#include <uavcan/equipment/camera_gimbal/AngularCommand.hpp> |
|
|
|
|
|
|
|
|
|
#include <AP_Baro/AP_Baro_UAVCAN.h> |
|
|
|
|
#include <AP_RangeFinder/AP_RangeFinder_UAVCAN.h> |
|
|
|
@ -53,6 +61,8 @@
@@ -53,6 +61,8 @@
|
|
|
|
|
#include <AP_OpticalFlow/AP_OpticalFlow_HereFlow.h> |
|
|
|
|
#include <AP_ADSB/AP_ADSB.h> |
|
|
|
|
#include "AP_UAVCAN_Server.h" |
|
|
|
|
#include <AP_Logger/AP_Logger.h> |
|
|
|
|
#include <AP_Camera/AP_Camera.h> |
|
|
|
|
|
|
|
|
|
#define LED_DELAY_US 50000 |
|
|
|
|
|
|
|
|
@ -113,6 +123,10 @@ static uavcan::Publisher<uavcan::equipment::gnss::RTCMStream>* rtcm_stream[MAX_N
@@ -113,6 +123,10 @@ static uavcan::Publisher<uavcan::equipment::gnss::RTCMStream>* rtcm_stream[MAX_N
|
|
|
|
|
|
|
|
|
|
static uavcan::Publisher<zrzk::equipment::indication::ZrRGB>* zr_rgb_led[MAX_NUMBER_OF_CAN_DRIVERS]; |
|
|
|
|
|
|
|
|
|
static uavcan::Publisher<zrzk::equipment::camera::Command>* zr_camera_command[MAX_NUMBER_OF_CAN_DRIVERS]; |
|
|
|
|
static uavcan::Publisher<uavcan::equipment::camera_gimbal::AngularCommand>* cam_angular[MAX_NUMBER_OF_CAN_DRIVERS]; |
|
|
|
|
static uavcan::Publisher<uavcan::equipment::camera_gimbal::GEOPOICommand>* cam_geopoi[MAX_NUMBER_OF_CAN_DRIVERS]; |
|
|
|
|
|
|
|
|
|
// subscribers
|
|
|
|
|
|
|
|
|
|
// handler SafteyButton
|
|
|
|
@ -123,6 +137,15 @@ static uavcan::Subscriber<ardupilot::indication::Button, ButtonCb> *safety_butto
@@ -123,6 +137,15 @@ static uavcan::Subscriber<ardupilot::indication::Button, ButtonCb> *safety_butto
|
|
|
|
|
UC_REGISTRY_BINDER(TrafficReportCb, ardupilot::equipment::trafficmonitor::TrafficReport); |
|
|
|
|
static uavcan::Subscriber<ardupilot::equipment::trafficmonitor::TrafficReport, TrafficReportCb> *traffic_report_listener[MAX_NUMBER_OF_CAN_DRIVERS]; |
|
|
|
|
|
|
|
|
|
//handler cameras status @binsir
|
|
|
|
|
UC_REGISTRY_BINDER(ZrCamStatusCb,zrzk::equipment::camera::Status); |
|
|
|
|
static uavcan::Subscriber<zrzk::equipment::camera::Status,ZrCamStatusCb> *zr_camera_status_listener[MAX_NUMBER_OF_CAN_DRIVERS]; |
|
|
|
|
|
|
|
|
|
UC_REGISTRY_BINDER(ZrCamVersionCb,zrzk::equipment::camera::Version); |
|
|
|
|
static uavcan::Subscriber<zrzk::equipment::camera::Version,ZrCamVersionCb> *zr_camera_version_listener[MAX_NUMBER_OF_CAN_DRIVERS]; |
|
|
|
|
|
|
|
|
|
UC_REGISTRY_BINDER(ZrCamFeedBackCb,zrzk::equipment::camera::CamFeedBack); |
|
|
|
|
static uavcan::Subscriber<zrzk::equipment::camera::CamFeedBack,ZrCamFeedBackCb> *zr_camera_feedback_listener[MAX_NUMBER_OF_CAN_DRIVERS]; |
|
|
|
|
|
|
|
|
|
AP_UAVCAN::AP_UAVCAN() : |
|
|
|
|
_node_allocator() |
|
|
|
@ -211,7 +234,6 @@ void AP_UAVCAN::init(uint8_t driver_index, bool enable_filters)
@@ -211,7 +234,6 @@ void AP_UAVCAN::init(uint8_t driver_index, bool enable_filters)
|
|
|
|
|
uint8_t uid_len = uid_buf_len; |
|
|
|
|
uint8_t unique_id[uid_buf_len]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (hal.util->get_system_id_unformatted(unique_id, uid_len)) { |
|
|
|
|
//This is because we are maintaining a common Server Record for all UAVCAN Instances.
|
|
|
|
|
//In case the node IDs are different, and unique id same, it will create
|
|
|
|
@ -273,6 +295,18 @@ void AP_UAVCAN::init(uint8_t driver_index, bool enable_filters)
@@ -273,6 +295,18 @@ void AP_UAVCAN::init(uint8_t driver_index, bool enable_filters)
|
|
|
|
|
zr_rgb_led[driver_index]->setPriority(uavcan::TransferPriority::OneHigherThanLowest); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
zr_camera_command[driver_index] = new uavcan::Publisher<zrzk::equipment::camera::Command>(*_node); |
|
|
|
|
zr_camera_command[driver_index]->setTxTimeout(uavcan::MonotonicDuration::fromMSec(2)); |
|
|
|
|
zr_camera_command[driver_index]->setPriority(uavcan::TransferPriority::OneHigherThanLowest); |
|
|
|
|
|
|
|
|
|
cam_angular[driver_index] = new uavcan::Publisher<uavcan::equipment::camera_gimbal::AngularCommand>(*_node); |
|
|
|
|
cam_angular[driver_index]->setTxTimeout(uavcan::MonotonicDuration::fromMSec(2)); |
|
|
|
|
cam_angular[driver_index]->setPriority(uavcan::TransferPriority::OneHigherThanLowest); |
|
|
|
|
|
|
|
|
|
cam_geopoi[driver_index] = new uavcan::Publisher<uavcan::equipment::camera_gimbal::GEOPOICommand>(*_node); |
|
|
|
|
cam_geopoi[driver_index]->setTxTimeout(uavcan::MonotonicDuration::fromMSec(2)); |
|
|
|
|
cam_geopoi[driver_index]->setPriority(uavcan::TransferPriority::OneHigherThanLowest); |
|
|
|
|
|
|
|
|
|
safety_button_listener[driver_index] = new uavcan::Subscriber<ardupilot::indication::Button, ButtonCb>(*_node); |
|
|
|
|
if (safety_button_listener[driver_index]) { |
|
|
|
|
safety_button_listener[driver_index]->start(ButtonCb(this, &handle_button)); |
|
|
|
@ -283,6 +317,21 @@ void AP_UAVCAN::init(uint8_t driver_index, bool enable_filters)
@@ -283,6 +317,21 @@ void AP_UAVCAN::init(uint8_t driver_index, bool enable_filters)
|
|
|
|
|
traffic_report_listener[driver_index]->start(TrafficReportCb(this, &handle_traffic_report)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
zr_camera_status_listener[driver_index] = new uavcan::Subscriber<zrzk::equipment::camera::Status,ZrCamStatusCb>(*_node); |
|
|
|
|
if(zr_camera_status_listener[driver_index]){ |
|
|
|
|
zr_camera_status_listener[driver_index]->start(ZrCamStatusCb(this, &handle_zr_camera_status)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
zr_camera_version_listener[driver_index] = new uavcan::Subscriber<zrzk::equipment::camera::Version,ZrCamVersionCb>(*_node); |
|
|
|
|
if(zr_camera_version_listener[driver_index]){ |
|
|
|
|
zr_camera_version_listener[driver_index]->start(ZrCamVersionCb(this, &handle_zr_camera_version)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
zr_camera_feedback_listener[driver_index] = new uavcan::Subscriber<zrzk::equipment::camera::CamFeedBack,ZrCamFeedBackCb>(*_node); |
|
|
|
|
if(zr_camera_feedback_listener[driver_index]){ |
|
|
|
|
zr_camera_feedback_listener[driver_index]->start(ZrCamFeedBackCb(this, &handle_zr_camera_feedback)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
_led_conf.devices_count = 0; |
|
|
|
|
if (enable_filters) { |
|
|
|
|
configureCanAcceptanceFilters(*_node); |
|
|
|
@ -359,9 +408,7 @@ void AP_UAVCAN::loop(void)
@@ -359,9 +408,7 @@ void AP_UAVCAN::loop(void)
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
///// SRV output /////
|
|
|
|
|
|
|
|
|
|
void AP_UAVCAN::SRV_send_actuator(void) |
|
|
|
|
{ |
|
|
|
|
uint8_t starting_servo = 0; |
|
|
|
@ -732,5 +779,114 @@ bool AP_UAVCAN::send_zr_rgb_led(uint8_t mode, uint8_t red, uint8_t green, uint8_
@@ -732,5 +779,114 @@ bool AP_UAVCAN::send_zr_rgb_led(uint8_t mode, uint8_t red, uint8_t green, uint8_
|
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AP_UAVCAN::send_zr_cam_cmd(uint8_t gimbal_id, uint8_t mode,uint8_t v1, uint8_t v2,uint8_t v3,uint8_t v4) |
|
|
|
|
{ |
|
|
|
|
zrzk::equipment::camera::Command msg; |
|
|
|
|
|
|
|
|
|
msg.id = gimbal_id; |
|
|
|
|
msg.command_mode = mode; |
|
|
|
|
msg.command_1 =v1; |
|
|
|
|
msg.command_2 =v2; |
|
|
|
|
msg.command_3 =v3; |
|
|
|
|
msg.command_4 =v4; |
|
|
|
|
zr_camera_command[_driver_index]->broadcast(msg); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AP_UAVCAN::send_cam_geopoi(uint8_t id,uint8_t mode,int32_t longitude_deg_1e7,int32_t latitude_deg_1e7,int32_t height_cm,int8_t height_type) |
|
|
|
|
{
|
|
|
|
|
uavcan::equipment::camera_gimbal::GEOPOICommand msg; |
|
|
|
|
|
|
|
|
|
uint8_t gimbal_id = id; |
|
|
|
|
msg.gimbal_id = gimbal_id; |
|
|
|
|
msg.mode.command_mode = mode; |
|
|
|
|
msg.latitude_deg_1e7 =latitude_deg_1e7; |
|
|
|
|
msg.longitude_deg_1e7 = longitude_deg_1e7; |
|
|
|
|
msg.height_cm = height_cm; |
|
|
|
|
|
|
|
|
|
cam_geopoi[_driver_index]->broadcast(msg); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AP_UAVCAN:: send_cam_angular(uint8_t id,uint8_t mode,float pitch,float roll,float yaw) |
|
|
|
|
{ |
|
|
|
|
uavcan::equipment::camera_gimbal::AngularCommand msg; |
|
|
|
|
|
|
|
|
|
uint8_t gimbal_id = id; |
|
|
|
|
msg.gimbal_id = gimbal_id; |
|
|
|
|
msg.mode.command_mode = mode; |
|
|
|
|
msg.quaternion_xyzw[0] = pitch;//ahrs.pitch_sensor*1e-2f;
|
|
|
|
|
msg.quaternion_xyzw[1] =roll; |
|
|
|
|
msg.quaternion_xyzw[2] = yaw; |
|
|
|
|
|
|
|
|
|
cam_angular[_driver_index]->broadcast(msg); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AP_UAVCAN::handle_zr_camera_feedback(AP_UAVCAN *ap_uavcan, uint8_t node_id, const ZrCamFeedBackCb &cb) |
|
|
|
|
{ |
|
|
|
|
AP_Logger *logger = AP_Logger::get_singleton(); |
|
|
|
|
if ( logger!=nullptr ) |
|
|
|
|
{ |
|
|
|
|
AP::logger().Write_Camera_Feedback( |
|
|
|
|
|
|
|
|
|
cb.msg->index, |
|
|
|
|
cb.msg->camera_photo_number[0], |
|
|
|
|
cb.msg->camera_photo_number[1], |
|
|
|
|
cb.msg->camera_photo_number[2], |
|
|
|
|
cb.msg->camera_photo_number[3], |
|
|
|
|
cb.msg->camera_photo_number[4], |
|
|
|
|
cb.msg->camera_photoed); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AP_UAVCAN::handle_zr_camera_status(AP_UAVCAN *ap_uavcan, uint8_t node_id, const ZrCamStatusCb &cb) |
|
|
|
|
{ |
|
|
|
|
// if(cb.msg->gimbal_id ==0xC5){ //根据id 判断是五镜头数据 197 ==C5
|
|
|
|
|
AP_Camera *camera = AP::camera(); |
|
|
|
|
if (camera == nullptr) |
|
|
|
|
{ |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
AP_Camera::Camera_State &interim_state = AP::camera()->get_camera_state(); |
|
|
|
|
interim_state.mode = cb.msg->mode; |
|
|
|
|
interim_state.id = cb.msg->id; |
|
|
|
|
interim_state.num1 = (uint16_t)cb.msg->camera_photo_number[0]; |
|
|
|
|
interim_state.num2 = (uint16_t)cb.msg->camera_photo_number[1]; |
|
|
|
|
interim_state.num3 = (uint16_t)cb.msg->camera_photo_number[2]; |
|
|
|
|
interim_state.num4 = (uint16_t)cb.msg->camera_photo_number[3]; |
|
|
|
|
interim_state.num5 = (uint16_t)cb.msg->camera_photo_number[4]; |
|
|
|
|
interim_state.temperature = cb.msg->temperature; |
|
|
|
|
interim_state.shutter_speed = cb.msg->shutter_speed; |
|
|
|
|
interim_state.err_code = cb.msg->error_code; |
|
|
|
|
interim_state.feedback_code = cb.msg->feedback_code; |
|
|
|
|
interim_state.usb_enable = cb.msg->usb_enable; |
|
|
|
|
|
|
|
|
|
camera->update_zr_camera_status(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AP_UAVCAN::handle_zr_camera_version(AP_UAVCAN *ap_uavcan, uint8_t node_id, const ZrCamVersionCb &cb) |
|
|
|
|
{ |
|
|
|
|
AP_Camera *camera = AP::camera(); |
|
|
|
|
|
|
|
|
|
if (camera == nullptr) |
|
|
|
|
{ |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
char sn[15]; |
|
|
|
|
char ver[12]; |
|
|
|
|
memcpy(&sn[0],&cb.msg->camera_sn[0],15); |
|
|
|
|
memcpy(&ver[0],&cb.msg->software_version[0],12); |
|
|
|
|
camera->set_camera_sn(&sn[0]); |
|
|
|
|
camera->set_camera_ver(&ver[0]); |
|
|
|
|
camera->update_zr_camera_version( ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void AP_Camera::notice_send_camera_status_to_gcs(void) |
|
|
|
|
{ |
|
|
|
|
//add control send time
|
|
|
|
|
gcs().send_message(MSG_CAMERA_ZR_STATUS);
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif // HAL_WITH_UAVCAN
|
|
|
|
|