37#include <visp3/core/vpConfig.h>
41#include <visp3/robot/vpRobotBebop2.h>
43#include <visp3/core/vpExponentialMap.h>
45#ifdef VISP_HAVE_FFMPEG
47#include <libavcodec/avcodec.h>
48#include <libavformat/avformat.h>
49#include <libavutil/imgutils.h>
51#include <visp3/core/vpImageConvert.h>
57#define TAG "vpRobotBebop2"
74bool vpRobotBebop2::m_running =
false;
75ARCONTROLLER_Device_t *vpRobotBebop2::m_deviceController =
nullptr;
113 : m_ipAddress(ipAddress), m_discoveryPort(discoveryPort)
116 memset(&m_sigAct, 0,
sizeof(m_sigAct));
117 m_sigAct.sa_handler = vpRobotBebop2::sighandler;
118 sigaction(SIGINT, &m_sigAct, 0);
119 sigaction(SIGBUS, &m_sigAct, 0);
120 sigaction(SIGSEGV, &m_sigAct, 0);
121 sigaction(SIGKILL, &m_sigAct, 0);
122 sigaction(SIGQUIT, &m_sigAct, 0);
124#ifdef VISP_HAVE_FFMPEG
125 m_codecContext =
nullptr;
128 m_bgr_picture =
nullptr;
129 m_img_convert_ctx =
nullptr;
131 m_videoDecodingStarted =
false;
134 m_batteryLevel = 100;
136 m_exposureSet =
true;
137 m_flatTrimFinished =
true;
138 m_relativeMoveEnded =
true;
139 m_videoResolutionSet =
true;
140 m_streamingStarted =
false;
141 m_streamingModeSet =
false;
142 m_settingsReset =
false;
144 m_update_codec_params =
false;
145 m_codec_params_data = std::vector<uint8_t>();
149 m_cameraHorizontalFOV = -1;
150 m_currentCameraTilt = -1;
151 m_minCameraTilt = -1;
152 m_maxCameraTilt = -1;
153 m_currentCameraPan = -1;
159 m_errorController = ARCONTROLLER_OK;
160 m_deviceState = ARCONTROLLER_DEVICE_STATE_MAX;
163 ARSAL_Sem_Init(&(m_stateSem), 0, 0);
166 ARDISCOVERY_Device_t *discoverDevice = discoverDrone();
169 createDroneController(discoverDevice);
178 if ((m_errorController != ARCONTROLLER_OK) || (m_deviceState != ARCONTROLLER_DEVICE_STATE_RUNNING)) {
183 "Failed to connect to bebop2 with ip %s and port %d. Make sure that the ip address is correct "
184 "and that your computer is connected to the drone Wifi spot before starting",
185 ipAddress.c_str(), discoveryPort));
190#ifdef VISP_HAVE_FFMPEG
193 if (setDefaultSettings) {
198#ifdef VISP_HAVE_FFMPEG
225 m_flatTrimFinished =
false;
227 m_deviceController->aRDrone3->sendPilotingFlatTrim(m_deviceController->aRDrone3);
230 while (!m_flatTrimFinished) {
235 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't do a flat trim : drone isn't landed.");
321 if (
isRunning() && m_deviceController !=
nullptr) {
323 m_deviceController->aRDrone3->sendCameraOrientationV2(m_deviceController->aRDrone3,
static_cast<float>(tilt),
324 static_cast<float>(pan));
327 while (std::abs(tilt - m_currentCameraTilt) > 0.01 || std::abs(pan - m_currentCameraPan) > 0.01) {
334 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't set camera orientation : drone isn't running.");
351 if (
isRunning() && m_deviceController !=
nullptr) {
353 m_deviceController->aRDrone3->sendCameraOrientationV2(m_deviceController->aRDrone3,
static_cast<float>(tilt),
357 while (std::abs(tilt - m_currentCameraTilt) > 0.01) {
364 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't set camera tilt value : drone isn't running.");
381 if (
isRunning() && m_deviceController !=
nullptr) {
383 m_deviceController->aRDrone3->sendCameraOrientationV2(
384 m_deviceController->aRDrone3,
static_cast<float>(
getCurrentCameraTilt()),
static_cast<float>(pan));
387 while (std::abs(pan - m_currentCameraPan) > 0.01) {
394 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't set camera pan value : drone isn't running.");
404 if (m_deviceController ==
nullptr) {
418#ifdef VISP_HAVE_FFMPEG
419 return m_videoDecodingStarted;
431 return getFlyingState() == ARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_HOVERING;
440 return getFlyingState() == ARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_FLYING;
449 return getFlyingState() == ARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_LANDED;
463 m_deviceController->aRDrone3->sendPilotingTakeOff(m_deviceController->aRDrone3);
473 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't take off : drone isn't landed.");
485 if (m_deviceController !=
nullptr) {
486 m_deviceController->aRDrone3->sendPilotingLanding(m_deviceController->aRDrone3);
504 m_deviceController->aRDrone3->setPilotingPCMDGaz(m_deviceController->aRDrone3,
static_cast<char>(value));
506 if (m_errorController != ARCONTROLLER_OK) {
507 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"- error when sending move command : %s",
508 ARCONTROLLER_Error_ToString(m_errorController));
513 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't set vertical speed : drone isn't flying or hovering.");
532 m_deviceController->aRDrone3->setPilotingPCMDYaw(m_deviceController->aRDrone3,
static_cast<char>(value));
534 if (m_errorController != ARCONTROLLER_OK) {
535 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"- error when sending move command : %s",
536 ARCONTROLLER_Error_ToString(m_errorController));
541 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't set yaw speed : drone isn't flying or hovering.");
560 m_deviceController->aRDrone3->setPilotingPCMDPitch(m_deviceController->aRDrone3,
static_cast<char>(value));
561 m_errorController = m_deviceController->aRDrone3->setPilotingPCMDFlag(m_deviceController->aRDrone3, 1);
563 if (m_errorController != ARCONTROLLER_OK) {
564 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"- error when sending move command : %s",
565 ARCONTROLLER_Error_ToString(m_errorController));
570 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't set pitch value : drone isn't flying or hovering.");
589 m_deviceController->aRDrone3->setPilotingPCMDRoll(m_deviceController->aRDrone3,
static_cast<char>(value));
590 m_errorController = m_deviceController->aRDrone3->setPilotingPCMDFlag(m_deviceController->aRDrone3, 1);
592 if (m_errorController != ARCONTROLLER_OK) {
593 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"- error when sending move command : %s",
594 ARCONTROLLER_Error_ToString(m_errorController));
599 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't set roll value : drone isn't flying or hovering.");
611 if (m_deviceController !=
nullptr) {
612 m_errorController = m_deviceController->aRDrone3->sendPilotingEmergency(m_deviceController->aRDrone3);
635 m_relativeMoveEnded =
false;
636 m_deviceController->aRDrone3->sendPilotingMoveBy(m_deviceController->aRDrone3, dX, dY, dZ, dPsi);
641 while (!m_relativeMoveEnded) {
647 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't move : drone isn't flying or hovering.");
666 double epsilon = (std::numeric_limits<double>::epsilon());
668 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't move : rotation around X axis should be 0.");
672 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't move : rotation around Y axis should be 0.");
677 setPosition(
static_cast<float>(t[0]),
static_cast<float>(t[1]),
static_cast<float>(t[2]), dThetaZ, blocking);
694 if (vel_cmd.
size() != 4) {
695 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
696 "Can't set velocity : dimension of the velocity vector should be equal to 4.");
723 ARSAL_Print_SetMinimumLevel(ARSAL_PRINT_INFO);
726 ARSAL_Print_SetMinimumLevel(ARSAL_PRINT_WARNING);
736 if (
isRunning() && m_deviceController !=
nullptr) {
738 m_settingsReset =
false;
739 m_deviceController->common->sendSettingsReset(m_deviceController->common);
741 while (!m_settingsReset) {
747 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't reset drone settings : drone isn't running.");
764 if (
isRunning() && m_deviceController !=
nullptr) {
765 m_deviceController->aRDrone3->sendPilotingSettingsMaxTilt(m_deviceController->aRDrone3,
766 static_cast<float>(maxTilt));
769 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't set tilt value : drone isn't running.");
783 m_errorController = m_deviceController->aRDrone3->setPilotingPCMD(m_deviceController->aRDrone3, 0, 0, 0, 0, 0, 0);
791#ifdef VISP_HAVE_FFMPEG
803 if (m_videoDecodingStarted) {
805 if (m_bgr_picture->data[0] !=
nullptr) {
806 I.resize(
static_cast<unsigned int>(m_videoHeight),
static_cast<unsigned int>(m_videoWidth));
808 m_bgr_picture_mutex.lock();
811 m_bgr_picture_mutex.unlock();
814 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Error while getting current grayscale image : image data is nullptr");
819 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't get current image : video streaming isn't started.");
833 if (m_videoDecodingStarted) {
835 if (m_bgr_picture->data[0] !=
nullptr) {
836 I.resize(
static_cast<unsigned int>(m_videoHeight),
static_cast<unsigned int>(m_videoWidth));
838 m_bgr_picture_mutex.lock();
841 m_bgr_picture_mutex.unlock();
844 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Error while getting current RGBa image : image data is nullptr");
849 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't get current image : video streaming isn't started.");
876 if (
isRunning() && m_deviceController !=
nullptr) {
877 expo = std::min<float>(1.5f, std::max<float>(-1.5f, expo));
879 m_exposureSet =
false;
880 m_deviceController->aRDrone3->sendPictureSettingsExpositionSelection(m_deviceController->aRDrone3, expo);
883 while (!m_exposureSet) {
888 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't set exposure : drone isn't running.");
908 if (
isRunning() && m_deviceController !=
nullptr) {
911 eARCOMMANDS_ARDRONE3_MEDIASTREAMING_VIDEOSTREAMMODE_MODE cmd_mode =
912 ARCOMMANDS_ARDRONE3_MEDIASTREAMING_VIDEOSTREAMMODE_MODE_LOW_LATENCY;
915 cmd_mode = ARCOMMANDS_ARDRONE3_MEDIASTREAMING_VIDEOSTREAMMODE_MODE_LOW_LATENCY;
918 cmd_mode = ARCOMMANDS_ARDRONE3_MEDIASTREAMING_VIDEOSTREAMMODE_MODE_HIGH_RELIABILITY;
921 cmd_mode = ARCOMMANDS_ARDRONE3_MEDIASTREAMING_VIDEOSTREAMMODE_MODE_HIGH_RELIABILITY_LOW_FRAMERATE;
926 m_streamingModeSet =
false;
927 m_deviceController->aRDrone3->sendMediaStreamingVideoStreamMode(m_deviceController->aRDrone3, cmd_mode);
930 while (!m_streamingModeSet) {
937 ARSAL_PRINT_ERROR,
"ERROR",
938 "Can't set streaming mode : drone has to be landed and not streaming in order to set streaming mode.");
942 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't set streaming mode : drone isn't running.");
959 if (
isRunning() && m_deviceController !=
nullptr) {
963 eARCOMMANDS_ARDRONE3_PICTURESETTINGS_VIDEORESOLUTIONS_TYPE cmd_mode;
969 cmd_mode = ARCOMMANDS_ARDRONE3_PICTURESETTINGS_VIDEORESOLUTIONS_TYPE_REC1080_STREAM480;
975 cmd_mode = ARCOMMANDS_ARDRONE3_PICTURESETTINGS_VIDEORESOLUTIONS_TYPE_REC720_STREAM720;
981 m_videoResolutionSet =
false;
982 m_deviceController->aRDrone3->sendPictureSettingsVideoResolutions(m_deviceController->aRDrone3, cmd_mode);
985 while (!m_videoResolutionSet) {
991 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
992 "Can't set video resolution : drone has to be landed and not streaming in order to set streaming "
997 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't set video resolution : drone isn't running.");
1014 if (
isRunning() && m_deviceController !=
nullptr) {
1016 eARCOMMANDS_ARDRONE3_PICTURESETTINGS_VIDEOSTABILIZATIONMODE_MODE cmd_mode =
1017 ARCOMMANDS_ARDRONE3_PICTURESETTINGS_VIDEOSTABILIZATIONMODE_MODE_NONE;
1021 cmd_mode = ARCOMMANDS_ARDRONE3_PICTURESETTINGS_VIDEOSTABILIZATIONMODE_MODE_NONE;
1024 cmd_mode = ARCOMMANDS_ARDRONE3_PICTURESETTINGS_VIDEOSTABILIZATIONMODE_MODE_ROLL;
1027 cmd_mode = ARCOMMANDS_ARDRONE3_PICTURESETTINGS_VIDEOSTABILIZATIONMODE_MODE_PITCH;
1030 cmd_mode = ARCOMMANDS_ARDRONE3_PICTURESETTINGS_VIDEOSTABILIZATIONMODE_MODE_ROLL_PITCH;
1036 m_deviceController->aRDrone3->sendPictureSettingsVideoStabilizationMode(m_deviceController->aRDrone3, cmd_mode);
1040 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't set video stabilisation mode : drone isn't running.");
1054 if (
isRunning() && m_deviceController !=
nullptr) {
1055 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"- Starting video streaming ... ");
1058 m_errorController = m_deviceController->aRDrone3->sendMediaStreamingVideoEnable(m_deviceController->aRDrone3, 1);
1060 if (m_errorController == ARCONTROLLER_OK) {
1061 m_streamingStarted =
false;
1063 while (!m_streamingStarted) {
1066 startVideoDecoding();
1075 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"- error :%s", ARCONTROLLER_Error_ToString(m_errorController));
1080 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't start streaming : drone isn't running.");
1091 if (m_videoDecodingStarted && m_deviceController !=
nullptr) {
1092 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"- Stopping video streaming ... ");
1095 m_errorController = m_deviceController->aRDrone3->sendMediaStreamingVideoEnable(m_deviceController->aRDrone3, 0);
1097 if (m_errorController == ARCONTROLLER_OK) {
1100 while (getStreamingState() != ARCOMMANDS_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED_ENABLED_DISABLED) {
1104 stopVideoDecoding();
1108 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"- error :%s", ARCONTROLLER_Error_ToString(m_errorController));
1113 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Can't stop streaming : streaming already stopped.");
1127void vpRobotBebop2::sighandler(
int signo)
1129 std::cout <<
"Stopping Bebop2 because of detected signal (" << signo <<
"): " <<
static_cast<char>(7);
1132 std::cout <<
"SIGINT (stopped by ^C) " << std::endl;
1135 std::cout <<
"SIGBUS (stopped due to a bus error) " << std::endl;
1138 std::cout <<
"SIGSEGV (stopped due to a segmentation fault) " << std::endl;
1141 std::cout <<
"SIGKILL (stopped by CTRL \\) " << std::endl;
1144 std::cout <<
"SIGQUIT " << std::endl;
1147 std::cout << signo << std::endl;
1150 vpRobotBebop2::m_running =
false;
1153 if (m_deviceController !=
nullptr) {
1154 m_deviceController->aRDrone3->sendPilotingLanding(m_deviceController->aRDrone3);
1157 fprintf(stdout,
"Application terminated\n");
1159 signal(signo, SIG_DFL);
1167eARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE vpRobotBebop2::getFlyingState()
1169 if (m_deviceController !=
nullptr) {
1170 eARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE flyingState =
1171 ARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_MAX;
1172 eARCONTROLLER_ERROR
error;
1174 ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary = ARCONTROLLER_ARDrone3_GetCommandElements(
1175 m_deviceController->aRDrone3, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED, &error);
1177 if (error == ARCONTROLLER_OK && elementDictionary !=
nullptr) {
1178 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1179 ARCONTROLLER_DICTIONARY_ELEMENT_t *element =
nullptr;
1181 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, element);
1183 if (element !=
nullptr) {
1186 HASH_FIND_STR(element->arguments, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE,
1189 if (arg !=
nullptr) {
1191 flyingState =
static_cast<eARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE
>(arg->value.I32);
1198 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Error when checking flying state : drone isn't connected.");
1199 return ARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_MAX;
1207eARCOMMANDS_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED_ENABLED vpRobotBebop2::getStreamingState()
1209 if (m_deviceController !=
nullptr) {
1210 eARCOMMANDS_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED_ENABLED streamingState =
1211 ARCOMMANDS_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED_ENABLED_MAX;
1212 eARCONTROLLER_ERROR
error;
1214 ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary = ARCONTROLLER_ARDrone3_GetCommandElements(
1215 m_deviceController->aRDrone3, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED,
1218 if (error == ARCONTROLLER_OK && elementDictionary !=
nullptr) {
1219 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1220 ARCONTROLLER_DICTIONARY_ELEMENT_t *element =
nullptr;
1222 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, element);
1224 if (element !=
nullptr) {
1226 HASH_FIND_STR(element->arguments,
1227 ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED_ENABLED, arg);
1229 if (arg !=
nullptr) {
1232 static_cast<eARCOMMANDS_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED_ENABLED
>(arg->value.I32);
1236 return streamingState;
1239 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Error when checking streaming state : drone isn't connected.");
1240 return ARCOMMANDS_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED_ENABLED_MAX;
1248ARDISCOVERY_Device_t *vpRobotBebop2::discoverDrone()
1250 eARDISCOVERY_ERROR errorDiscovery = ARDISCOVERY_OK;
1252 ARDISCOVERY_Device_t *device = ARDISCOVERY_Device_New(&errorDiscovery);
1254 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Starting drone Wifi discovery ...");
1255 const char *charIpAddress = m_ipAddress.c_str();
1257 ARDISCOVERY_Device_InitWifi(device, ARDISCOVERY_PRODUCT_BEBOP_2,
"bebop2", charIpAddress, m_discoveryPort);
1259 if (errorDiscovery != ARDISCOVERY_OK) {
1260 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Discovery error :%s", ARDISCOVERY_Error_ToString(errorDiscovery));
1262 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"- Drone controller created.");
1272void vpRobotBebop2::createDroneController(ARDISCOVERY_Device_t *discoveredDrone)
1274 m_deviceController = ARCONTROLLER_Device_New(discoveredDrone, &m_errorController);
1275 if (m_errorController != ARCONTROLLER_OK) {
1276 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Creation of deviceController failed.");
1278 ARDISCOVERY_Device_Delete(&discoveredDrone);
1279 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"- Device created.");
1286void vpRobotBebop2::setupCallbacks()
1289 m_errorController = ARCONTROLLER_Device_AddStateChangedCallback(m_deviceController, stateChangedCallback,
this);
1290 if (m_errorController != ARCONTROLLER_OK) {
1291 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"add State callback failed.");
1295 m_errorController = ARCONTROLLER_Device_AddCommandReceivedCallback(m_deviceController, commandReceivedCallback,
this);
1297 if (m_errorController != ARCONTROLLER_OK) {
1298 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"add Command callback failed.");
1301#ifdef VISP_HAVE_FFMPEG
1303 m_errorController = ARCONTROLLER_Device_SetVideoStreamCallbacks(m_deviceController, decoderConfigCallback,
1304 didReceiveFrameCallback,
nullptr,
this);
1306 if (m_errorController != ARCONTROLLER_OK) {
1307 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"- error: %s", ARCONTROLLER_Error_ToString(m_errorController));
1310 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"- Callbacks set up.");
1317void vpRobotBebop2::startController()
1320 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"Connecting ...");
1321 m_errorController = ARCONTROLLER_Device_Start(m_deviceController);
1323 if (m_errorController != ARCONTROLLER_OK) {
1324 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"- error :%s", ARCONTROLLER_Error_ToString(m_errorController));
1328 ARSAL_Sem_Wait(&(m_stateSem));
1331 m_deviceState = ARCONTROLLER_Device_GetState(m_deviceController, &m_errorController);
1333 if ((m_errorController != ARCONTROLLER_OK) || (m_deviceState != ARCONTROLLER_DEVICE_STATE_RUNNING)) {
1334 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"- deviceState :%d", m_deviceState);
1335 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"- error :%s", ARCONTROLLER_Error_ToString(m_errorController));
1337 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"- Controller started.");
1340#ifdef VISP_HAVE_FFMPEG
1346void vpRobotBebop2::initCodec()
1350 avformat_network_init();
1353 const AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_H264);
1355 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Codec not found.");
1360 m_codecContext = avcodec_alloc_context3(codec);
1362 if (!m_codecContext) {
1363 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Failed to allocate codec context.");
1368 m_codecContext->pix_fmt = AV_PIX_FMT_YUV420P;
1369 m_codecContext->skip_frame = AVDISCARD_DEFAULT;
1370 m_codecContext->error_concealment = FF_EC_GUESS_MVS | FF_EC_DEBLOCK;
1371 m_codecContext->skip_loop_filter = AVDISCARD_DEFAULT;
1372 m_codecContext->workaround_bugs = AVMEDIA_TYPE_VIDEO;
1373 m_codecContext->codec_id = AV_CODEC_ID_H264;
1374 m_codecContext->skip_idct = AVDISCARD_DEFAULT;
1376 m_codecContext->width = m_videoWidth;
1377 m_codecContext->height = m_videoHeight;
1382 m_codecContext->flags2 |= AV_CODEC_FLAG2_CHUNKS;
1385 if (avcodec_open2(m_codecContext, codec,
nullptr) < 0) {
1386 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Failed to open codec.");
1390 AVPixelFormat pFormat = AV_PIX_FMT_BGR24;
1391 int numBytes = av_image_get_buffer_size(pFormat, m_codecContext->width, m_codecContext->height, 1);
1392 m_buffer =
static_cast<uint8_t *
>(av_malloc(
static_cast<unsigned long>(numBytes) *
sizeof(uint8_t)));
1395 m_packet = av_packet_alloc();
1396 m_picture = av_frame_alloc();
1398 m_bgr_picture_mutex.lock();
1399 m_bgr_picture = av_frame_alloc();
1400 m_bgr_picture_mutex.unlock();
1402 m_img_convert_ctx = sws_getContext(m_codecContext->width, m_codecContext->height, m_codecContext->pix_fmt,
1403 m_codecContext->width, m_codecContext->height, pFormat, SWS_BICUBIC,
nullptr,
nullptr,
1412void vpRobotBebop2::cleanUpCodec()
1414 m_videoDecodingStarted =
false;
1415 av_packet_unref(m_packet);
1417 if (m_codecContext) {
1418 avcodec_flush_buffers(m_codecContext);
1419 avcodec_free_context(&m_codecContext);
1423 av_frame_free(&m_picture);
1426 av_packet_free(&m_packet);
1429 if (m_bgr_picture) {
1430 m_bgr_picture_mutex.lock();
1431 av_frame_free(&m_bgr_picture);
1432 m_bgr_picture_mutex.unlock();
1435 if (m_img_convert_ctx) {
1436 sws_freeContext(m_img_convert_ctx);
1448void vpRobotBebop2::startVideoDecoding()
1450 if (!m_videoDecodingStarted) {
1452 m_videoDecodingStarted =
true;
1455 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Video decoding is already started.");
1464void vpRobotBebop2::stopVideoDecoding()
1466 if (m_videoDecodingStarted) {
1470 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Video decoding is already stopped.");
1481void vpRobotBebop2::computeFrame(ARCONTROLLER_Frame_t *frame)
1485 if (m_update_codec_params && m_codec_params_data.size()) {
1486 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"Updating H264 codec parameters (Buffer Size: %lu) ...",
1487 m_codec_params_data.size());
1489 m_packet->data = &m_codec_params_data[0];
1490 m_packet->size =
static_cast<int>(m_codec_params_data.size());
1492 int ret = avcodec_send_packet(m_codecContext, m_packet);
1496 ret = avcodec_receive_frame(m_codecContext, m_picture);
1498 if (ret == 0 || ret == AVERROR(EAGAIN)) {
1499 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"H264 codec parameters updated.");
1502 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Unexpected error while updating H264 parameters.");
1506 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Unexpected error while sending H264 parameters.");
1508 m_update_codec_params =
false;
1509 av_packet_unref(m_packet);
1510 av_frame_unref(m_picture);
1514 m_packet->data = frame->data;
1515 m_packet->size =
static_cast<int>(frame->used);
1517 int ret = avcodec_send_packet(m_codecContext, m_packet);
1520 char *errbuff =
new char[AV_ERROR_MAX_STRING_SIZE];
1521 av_strerror(ret, errbuff, AV_ERROR_MAX_STRING_SIZE);
1522 std::string err(errbuff);
1524 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Error sending a packet for decoding : %d, %s", ret, err.c_str());
1529 ret = avcodec_receive_frame(m_codecContext, m_picture);
1533 if (ret == AVERROR(EAGAIN)) {
1534 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"AVERROR(EAGAIN)");
1536 else if (ret == AVERROR_EOF) {
1537 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"AVERROR_EOF");
1541 char *errbuff =
new char[AV_ERROR_MAX_STRING_SIZE];
1542 av_strerror(ret, errbuff, AV_ERROR_MAX_STRING_SIZE);
1543 std::string err(errbuff);
1545 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Error receiving a decoded frame : %d, %s", ret, err.c_str());
1549 m_bgr_picture_mutex.lock();
1550 av_frame_unref(m_bgr_picture);
1551 av_image_fill_arrays(m_bgr_picture->data, m_bgr_picture->linesize, m_buffer, AV_PIX_FMT_BGR24,
1552 m_codecContext->width, m_codecContext->height, 1);
1554 sws_scale(m_img_convert_ctx, (m_picture)->data, (m_picture)->linesize, 0, m_codecContext->height,
1555 (m_bgr_picture)->data, (m_bgr_picture)->linesize);
1557 m_bgr_picture_mutex.unlock();
1561 av_packet_unref(m_packet);
1563 av_frame_unref(m_picture);
1571void vpRobotBebop2::cleanUp()
1573 if (m_deviceController !=
nullptr) {
1577#ifdef VISP_HAVE_FFMPEG
1583 m_deviceState = ARCONTROLLER_Device_GetState(m_deviceController, &m_errorController);
1584 if ((m_errorController == ARCONTROLLER_OK) && (m_deviceState != ARCONTROLLER_DEVICE_STATE_STOPPED)) {
1586 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"Disconnecting ...");
1587 m_errorController = ARCONTROLLER_Device_Stop(m_deviceController);
1589 if (m_errorController == ARCONTROLLER_OK) {
1591 ARSAL_Sem_Wait(&(m_stateSem));
1594 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"Deleting device controller ...");
1595 ARCONTROLLER_Device_Delete(&m_deviceController);
1598 ARSAL_Sem_Destroy(&(m_stateSem));
1600 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"- Cleanup done.");
1604 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Error while cleaning up memory.");
1621void vpRobotBebop2::stateChangedCallback(eARCONTROLLER_DEVICE_STATE newState, eARCONTROLLER_ERROR error,
1624 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Controller state changed, new state: %d.", newState);
1629 case ARCONTROLLER_DEVICE_STATE_STOPPED:
1631 drone->m_running =
false;
1633 ARSAL_Sem_Post(&(drone->m_stateSem));
1636 case ARCONTROLLER_DEVICE_STATE_RUNNING:
1638 ARSAL_Sem_Post(&(drone->m_stateSem));
1646#ifdef VISP_HAVE_FFMPEG
1656eARCONTROLLER_ERROR vpRobotBebop2::decoderConfigCallback(ARCONTROLLER_Stream_Codec_t codec,
void *customData)
1660 uint8_t *sps_buffer_ptr = codec.parameters.h264parameters.spsBuffer;
1661 uint32_t sps_buffer_size =
static_cast<uint32_t
>(codec.parameters.h264parameters.spsSize);
1662 uint8_t *pps_buffer_ptr = codec.parameters.h264parameters.ppsBuffer;
1663 uint32_t pps_buffer_size =
static_cast<uint32_t
>(codec.parameters.h264parameters.ppsSize);
1665 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"H264 configuration packet received: #SPS: %d #PPS: %d", sps_buffer_size,
1668 drone->m_update_codec_params = (sps_buffer_ptr && pps_buffer_ptr && sps_buffer_size && pps_buffer_size &&
1669 (pps_buffer_size < 32) && (sps_buffer_size < 32));
1671 if (drone->m_update_codec_params) {
1674 drone->m_codec_params_data.resize(sps_buffer_size + pps_buffer_size);
1675 std::copy(sps_buffer_ptr, sps_buffer_ptr + sps_buffer_size, drone->m_codec_params_data.begin());
1676 std::copy(pps_buffer_ptr, pps_buffer_ptr + pps_buffer_size, drone->m_codec_params_data.begin() + sps_buffer_size);
1680 drone->m_codec_params_data.clear();
1682 return ARCONTROLLER_OK;
1693eARCONTROLLER_ERROR vpRobotBebop2::didReceiveFrameCallback(ARCONTROLLER_Frame_t *frame,
void *customData)
1697 if (frame !=
nullptr) {
1699 if (drone->m_videoDecodingStarted) {
1700 drone->computeFrame(frame);
1705 ARSAL_PRINT(ARSAL_PRINT_WARNING, TAG,
"frame is nullptr.");
1708 return ARCONTROLLER_OK;
1721void vpRobotBebop2::cmdBatteryStateChangedRcv(ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary,
1724 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1725 ARCONTROLLER_DICTIONARY_ELEMENT_t *singleElement =
nullptr;
1727 if (elementDictionary ==
nullptr) {
1728 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"elements is nullptr");
1733 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, singleElement);
1735 if (singleElement ==
nullptr) {
1736 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"singleElement is nullptr");
1741 HASH_FIND_STR(singleElement->arguments, ARCONTROLLER_DICTIONARY_KEY_COMMON_COMMONSTATE_BATTERYSTATECHANGED_PERCENT,
1744 if (arg ==
nullptr) {
1745 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"arg is nullptr");
1748 drone->m_batteryLevel = arg->value.U8;
1749 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Battery level changed : %u percent remaining.", drone->m_batteryLevel);
1751 if (drone->m_batteryLevel <= 5) {
1752 ARSAL_PRINT(ARSAL_PRINT_WARNING, TAG,
" - WARNING, very low battery level, drone will stop soon !");
1754 else if (drone->m_batteryLevel <= 10) {
1755 ARSAL_PRINT(ARSAL_PRINT_WARNING, TAG,
" - Warning, low battery level !");
1769void vpRobotBebop2::cmdCameraOrientationChangedRcv(ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary,
1772 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1773 ARCONTROLLER_DICTIONARY_ELEMENT_t *element =
nullptr;
1774 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, element);
1775 if (element !=
nullptr) {
1776 HASH_FIND_STR(element->arguments, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_CAMERASTATE_ORIENTATIONV2_TILT, arg);
1778 if (arg !=
nullptr) {
1779 drone->m_currentCameraTilt =
static_cast<double>(arg->value.Float);
1782 HASH_FIND_STR(element->arguments, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_CAMERASTATE_ORIENTATIONV2_PAN, arg);
1783 if (arg !=
nullptr) {
1784 drone->m_currentCameraPan =
static_cast<double>(arg->value.Float);
1800void vpRobotBebop2::cmdCameraSettingsRcv(ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary,
vpRobotBebop2 *drone)
1802 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1803 ARCONTROLLER_DICTIONARY_ELEMENT_t *element =
nullptr;
1804 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, element);
1805 if (element !=
nullptr) {
1806 HASH_FIND_STR(element->arguments, ARCONTROLLER_DICTIONARY_KEY_COMMON_CAMERASETTINGSSTATE_CAMERASETTINGSCHANGED_FOV,
1808 if (arg !=
nullptr) {
1809 drone->m_cameraHorizontalFOV =
static_cast<double>(arg->value.Float);
1810 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Camera horizontal FOV : %f degrees.",
1811 static_cast<double>(drone->m_cameraHorizontalFOV));
1813 HASH_FIND_STR(element->arguments,
1814 ARCONTROLLER_DICTIONARY_KEY_COMMON_CAMERASETTINGSSTATE_CAMERASETTINGSCHANGED_PANMAX, arg);
1815 if (arg !=
nullptr) {
1816 drone->m_maxCameraPan =
static_cast<double>(arg->value.Float);
1817 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Max camera pan : %f degrees.",
1818 static_cast<double>(drone->m_maxCameraPan));
1820 HASH_FIND_STR(element->arguments,
1821 ARCONTROLLER_DICTIONARY_KEY_COMMON_CAMERASETTINGSSTATE_CAMERASETTINGSCHANGED_PANMIN, arg);
1822 if (arg !=
nullptr) {
1823 drone->m_minCameraPan =
static_cast<double>(arg->value.Float);
1824 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Min camera pan : %f degrees.",
1825 static_cast<double>(drone->m_minCameraPan));
1827 HASH_FIND_STR(element->arguments,
1828 ARCONTROLLER_DICTIONARY_KEY_COMMON_CAMERASETTINGSSTATE_CAMERASETTINGSCHANGED_TILTMAX, arg);
1829 if (arg !=
nullptr) {
1830 drone->m_maxCameraTilt =
static_cast<double>(arg->value.Float);
1831 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Max camera tilt : %f degrees.",
1832 static_cast<double>(drone->m_maxCameraTilt));
1834 HASH_FIND_STR(element->arguments,
1835 ARCONTROLLER_DICTIONARY_KEY_COMMON_CAMERASETTINGSSTATE_CAMERASETTINGSCHANGED_TILTMIN, arg);
1836 if (arg !=
nullptr) {
1837 drone->m_minCameraTilt =
static_cast<double>(arg->value.Float);
1838 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Min camera tilt : %f degrees.",
1839 static_cast<double>(drone->m_minCameraTilt));
1854void vpRobotBebop2::cmdMaxPitchRollChangedRcv(ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary,
1857 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1858 ARCONTROLLER_DICTIONARY_ELEMENT_t *element =
nullptr;
1860 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, element);
1861 if (element !=
nullptr) {
1862 HASH_FIND_STR(element->arguments, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PILOTINGSETTINGSSTATE_MAXTILTCHANGED_CURRENT,
1864 if (arg !=
nullptr) {
1865 drone->m_maxTilt =
static_cast<double>(arg->value.Float);
1880void vpRobotBebop2::cmdRelativeMoveEndedRcv(ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary,
vpRobotBebop2 *drone)
1882 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1883 ARCONTROLLER_DICTIONARY_ELEMENT_t *element =
nullptr;
1885 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, element);
1887 if (element !=
nullptr) {
1888 HASH_FIND_STR(element->arguments, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PILOTINGEVENT_MOVEBYEND_ERROR, arg);
1890 if (arg !=
nullptr) {
1891 eARCOMMANDS_ARDRONE3_PILOTINGEVENT_MOVEBYEND_ERROR
error =
1892 static_cast<eARCOMMANDS_ARDRONE3_PILOTINGEVENT_MOVEBYEND_ERROR
>(arg->value.I32);
1893 if ((error != ARCOMMANDS_ARDRONE3_PILOTINGEVENT_MOVEBYEND_ERROR_OK) &&
1894 (error != ARCOMMANDS_ARDRONE3_PILOTINGEVENT_MOVEBYEND_ERROR_INTERRUPTED)) {
1895 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Relative move ended with error %d", error);
1897 drone->m_relativeMoveEnded =
true;
1912void vpRobotBebop2::cmdExposureSetRcv(ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary,
vpRobotBebop2 *drone)
1914 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1915 ARCONTROLLER_DICTIONARY_ELEMENT_t *element =
nullptr;
1917 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, element);
1919 if (element !=
nullptr) {
1921 HASH_FIND_STR(element->arguments, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PICTURESETTINGSSTATE_EXPOSITIONCHANGED_VALUE,
1924 if (arg !=
nullptr) {
1925 drone->m_exposureSet =
true;
1939void vpRobotBebop2::commandReceivedCallback(eARCONTROLLER_DICTIONARY_KEY commandKey,
1940 ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary,
void *customData)
1944 if (drone ==
nullptr)
1947 switch (commandKey) {
1948 case ARCONTROLLER_DICTIONARY_KEY_COMMON_COMMONSTATE_BATTERYSTATECHANGED:
1950 cmdBatteryStateChangedRcv(elementDictionary, drone);
1953 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PILOTINGSETTINGSSTATE_MAXTILTCHANGED:
1955 cmdMaxPitchRollChangedRcv(elementDictionary, drone);
1958 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PILOTINGEVENT_MOVEBYEND:
1960 cmdRelativeMoveEndedRcv(elementDictionary, drone);
1963 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PILOTINGSTATE_FLATTRIMCHANGED:
1965 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"Flat trim finished ...");
1966 drone->m_flatTrimFinished =
true;
1969 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PICTURESETTINGSSTATE_EXPOSITIONCHANGED:
1971 cmdExposureSetRcv(elementDictionary, drone);
1974 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PICTURESETTINGSSTATE_VIDEORESOLUTIONSCHANGED:
1976 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"Video resolution set ...");
1977 drone->m_videoResolutionSet =
true;
1980 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED:
1982 drone->m_streamingStarted =
true;
1985 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOSTREAMMODECHANGED:
1987 drone->m_streamingModeSet =
true;
1990 case ARCONTROLLER_DICTIONARY_KEY_COMMON_SETTINGSSTATE_RESETCHANGED:
1992 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"Settings reset ...");
1993 drone->m_settingsReset =
true;
1996 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_CAMERASTATE_ORIENTATIONV2:
1998 cmdCameraOrientationChangedRcv(elementDictionary, drone);
2001 case ARCONTROLLER_DICTIONARY_KEY_COMMON_CAMERASETTINGSSTATE_CAMERASETTINGSCHANGED:
2003 cmdCameraSettingsRcv(elementDictionary, drone);
2013#elif !defined(VISP_BUILD_SHARED_LIBS)
2016void dummy_vpRobotBebop2() { }
unsigned int size() const
Return the number of elements of the 2D array.
Implementation of column vector and the associated operations.
error that can be emitted by ViSP classes.
static vpHomogeneousMatrix direct(const vpColVector &v)
Implementation of an homogeneous matrix and operations on such kind of matrices.
vpRotationMatrix getRotationMatrix() const
vpTranslationVector getTranslationVector() const
static void BGRToGrey(unsigned char *bgr, unsigned char *grey, unsigned int width, unsigned int height, bool flip=false, unsigned int nThreads=0)
static void BGRToRGBa(unsigned char *bgr, unsigned char *rgba, unsigned int width, unsigned int height, bool flip=false)
Definition of the vpImage class member functions.
std::string getIpAddress()
double getMinCameraPan() const
void setMaxTilt(double maxTilt)
void setPosition(float dX, float dY, float dZ, float dPsi, bool blocking)
void setVelocity(const vpColVector &vel, double delta_t)
void setExposure(float expo)
double getCurrentCameraPan() const
void setVideoStabilisationMode(int mode)
double getMinCameraTilt() const
double getMaxCameraTilt() const
void setVerbose(bool verbose)
void setVerticalSpeed(int value)
void getGrayscaleImage(vpImage< unsigned char > &I)
void setStreamingMode(int mode)
unsigned int getBatteryLevel()
void getRGBaImage(vpImage< vpRGBa > &I)
void setYawSpeed(int value)
void setCameraPan(double pan, bool blocking=false)
void takeOff(bool blocking=true)
double getCurrentCameraTilt() const
double getCameraHorizontalFOV() const
void setVideoResolution(int mode)
void setCameraTilt(double tilt, bool blocking=false)
vpRobotBebop2(bool verbose=false, bool setDefaultSettings=true, std::string ipAddress="192.168.42.1", int discoveryPort=44444)
void setCameraOrientation(double tilt, double pan, bool blocking=false)
double getMaxCameraPan() const
vpThetaUVector getThetaUVector()
Class that consider the case of a translation vector.
VISP_EXPORT void sleepMs(double t)