-
Notifications
You must be signed in to change notification settings - Fork 20.7k
AP_Mount_MAVLink: forward MAV_CMD_DO_SET_ROI_LOCATION to gimbal #32162
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
492f14e
67f414c
5d9d2a7
1aabc91
c756770
aeeb3cc
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -235,6 +235,10 @@ void AP_Mount_Backend::set_roi_target(const Location &target_loc) | |
| // set the mode to GPS tracking mode | ||
| set_mode(MAV_MOUNT_MODE_GPS_POINT); | ||
|
|
||
| if (natively_supports(MountTargetType::LOCATION)) { | ||
| send_target_location(_roi_target); | ||
| } | ||
|
|
||
| // optionally set RC_TARGETING yaw lock state | ||
| if (option_set(Options::RCTARGETING_LOCK_FROM_PREVMODE)) { | ||
| set_yaw_lock(true); | ||
|
|
@@ -327,6 +331,10 @@ void AP_Mount_Backend::clear_roi_target() | |
| MAV_MOUNT_MODE default_mode = (MAV_MOUNT_MODE)_params.default_mode.get(); | ||
| set_mode(default_mode); | ||
| } | ||
|
|
||
| if (natively_supports(MountTargetType::LOCATION)) { | ||
| send_target_location(_roi_target); | ||
| } | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This shouldn't be here - it should be handled by the output stage
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. In clear_roi_target(), mode is set back to default mode, mount target type will no longer be LOCATION therefore send_target_location with zero target (ROI_NONE) will not be sent to gimbal.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Right - but we should be in some other targetting mode (e.g. ANGLE) and be sending angles (or retract, or...)
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Moved the clearing of roi in send_target_to_gimbal. but it is slightly different from what you have suggested. I am not checking the previous target type, only checking if there is a pending clear_roi request. |
||
| } | ||
|
|
||
| // set_sys_target - sets system that mount should attempt to point towards | ||
|
|
@@ -942,6 +950,9 @@ uint16_t AP_Mount_Backend::get_gimbal_device_flags() const | |
| case MountTargetType::NEUTRAL: | ||
| yaw_lock_state = false; // not locked onto the scenery | ||
| break; | ||
| case MountTargetType::LOCATION: | ||
| yaw_lock_state = true; | ||
| break; | ||
| } | ||
| break; | ||
| case MAV_MOUNT_MODE_RC_TARGETING: | ||
|
|
@@ -1045,8 +1056,8 @@ void AP_Mount_Backend::_update_mnt_target() | |
|
|
||
| case MAV_MOUNT_MODE_GPS_POINT: | ||
| // point mount to a GPS point given by the mission planner | ||
| if (get_angle_target_to_roi(mnt_target.angle_rad)) { | ||
| mnt_target.target_type = MountTargetType::ANGLE; | ||
| if (AP::ahrs().get_location(_roi_target)) { | ||
| mnt_target.target_type = MountTargetType::LOCATION; | ||
| } | ||
| return; | ||
|
|
||
|
|
@@ -1087,6 +1098,8 @@ void AP_Mount_Backend::send_target_to_gimbal() | |
| case MountTargetType::NEUTRAL: | ||
| send_target_neutral(); | ||
| return; | ||
| case MountTargetType::LOCATION: | ||
| return; | ||
| } | ||
| return; // should not reach this as all cases return | ||
| } | ||
|
|
@@ -1127,6 +1140,14 @@ void AP_Mount_Backend::send_target_to_gimbal() | |
| return; | ||
| } | ||
| break; | ||
| case MountTargetType::LOCATION: | ||
| if (natively_supports(MountTargetType::ANGLE)) { | ||
| if (get_angle_target_to_roi(mnt_target.angle_rad)) { | ||
| send_target_angles(mnt_target.angle_rad); | ||
| } | ||
| return; | ||
| } | ||
| break; | ||
| } | ||
|
|
||
| send_warning_to_GCS("Failed to convert mount target to command gimbal"); | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -136,6 +136,8 @@ void AP_Mount_MAVLink::handle_gimbal_device_information(const mavlink_message_t | |
| const uint8_t fw_ver_revision = (info.firmware_version & 0x00FF0000) >> 16; | ||
| const uint8_t fw_ver_build = (info.firmware_version & 0xFF000000) >> 24; | ||
|
|
||
| strcpy(_vendor_name, info.vendor_name); | ||
|
KSimeonAVTA marked this conversation as resolved.
Outdated
|
||
|
|
||
| // display gimbal info to user | ||
| GCS_SEND_TEXT(MAV_SEVERITY_INFO, "Mount: %s %s fw:%u.%u.%u.%u", | ||
| info.vendor_name, | ||
|
|
@@ -277,4 +279,31 @@ void AP_Mount_MAVLink::send_target_angles(const MountAngleTarget &angle_rad) | |
| _link->send_message(MAVLINK_MSG_ID_GIMBAL_DEVICE_SET_ATTITUDE, (const char*)&pkt); | ||
| } | ||
|
|
||
| // Send MAV_CMD_DO_SET_ROI_LOCATION to gimbal | ||
| void AP_Mount_MAVLink::send_target_location(const Location &roi_loc) | ||
| { | ||
| if (_link == nullptr) { | ||
| return; | ||
| } | ||
|
|
||
| mavlink_command_int_t pkt; | ||
|
KSimeonAVTA marked this conversation as resolved.
Outdated
|
||
| pkt.target_system = _sysid; | ||
| pkt.target_component = _compid; | ||
|
|
||
| if (roi_loc.initialised()) | ||
| { | ||
|
KSimeonAVTA marked this conversation as resolved.
Outdated
|
||
| pkt.command = MAV_CMD_DO_SET_ROI_LOCATION; | ||
| pkt.x = roi_loc.lat, // param5 / local: x position in meters * 1e4, global: latitude in degrees * 10^7 | ||
| pkt.y = roi_loc.lng, // param6 / local: y position in meters * 1e4, global: longitude in degrees * 10^7 | ||
| pkt.z = roi_loc.alt * 0.01f; // param7 / z position: global: altitude in meters (relative or absolute, depending on frame). | ||
| pkt.frame = (uint8_t)roi_loc.get_alt_frame(); | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This does raise the question as to how to handle frames. That doesn't give any sort of frame - so when we go to add the same thing for GIMBAL_DEVICE we need to pay a bit of attention. One would usually assume AMSL here, but it's possible you could say "terrain" and let the gimbal sort itself out with a laser rangefinder. Any suggestions, @hamishwillee ? I think for the time being throwing the problem over to the camera like this will be fine. |
||
| } | ||
| else | ||
| { | ||
| pkt.command = MAV_CMD_DO_SET_ROI_NONE; | ||
| } | ||
|
KSimeonAVTA marked this conversation as resolved.
Outdated
|
||
|
|
||
| _link->send_message(MAVLINK_MSG_ID_COMMAND_INT, (const char*)&pkt); | ||
| } | ||
|
|
||
| #endif // HAL_MOUNT_MAVLINK_ENABLED | ||
Uh oh!
There was an error while loading. Please reload this page.