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);
1156 std::exit(EXIT_FAILURE);
1163eARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE vpRobotBebop2::getFlyingState()
1165 if (m_deviceController !=
nullptr) {
1166 eARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE flyingState =
1167 ARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_MAX;
1168 eARCONTROLLER_ERROR
error;
1170 ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary = ARCONTROLLER_ARDrone3_GetCommandElements(
1171 m_deviceController->aRDrone3, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED, &error);
1173 if (error == ARCONTROLLER_OK && elementDictionary !=
nullptr) {
1174 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1175 ARCONTROLLER_DICTIONARY_ELEMENT_t *element =
nullptr;
1177 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, element);
1179 if (element !=
nullptr) {
1182 HASH_FIND_STR(element->arguments, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE,
1185 if (arg !=
nullptr) {
1187 flyingState =
static_cast<eARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE
>(arg->value.I32);
1194 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Error when checking flying state : drone isn't connected.");
1195 return ARCOMMANDS_ARDRONE3_PILOTINGSTATE_FLYINGSTATECHANGED_STATE_MAX;
1203eARCOMMANDS_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED_ENABLED vpRobotBebop2::getStreamingState()
1205 if (m_deviceController !=
nullptr) {
1206 eARCOMMANDS_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED_ENABLED streamingState =
1207 ARCOMMANDS_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED_ENABLED_MAX;
1208 eARCONTROLLER_ERROR
error;
1210 ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary = ARCONTROLLER_ARDrone3_GetCommandElements(
1211 m_deviceController->aRDrone3, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED,
1214 if (error == ARCONTROLLER_OK && elementDictionary !=
nullptr) {
1215 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1216 ARCONTROLLER_DICTIONARY_ELEMENT_t *element =
nullptr;
1218 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, element);
1220 if (element !=
nullptr) {
1222 HASH_FIND_STR(element->arguments,
1223 ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED_ENABLED, arg);
1225 if (arg !=
nullptr) {
1228 static_cast<eARCOMMANDS_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED_ENABLED
>(arg->value.I32);
1232 return streamingState;
1235 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Error when checking streaming state : drone isn't connected.");
1236 return ARCOMMANDS_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED_ENABLED_MAX;
1244ARDISCOVERY_Device_t *vpRobotBebop2::discoverDrone()
1246 eARDISCOVERY_ERROR errorDiscovery = ARDISCOVERY_OK;
1248 ARDISCOVERY_Device_t *device = ARDISCOVERY_Device_New(&errorDiscovery);
1250 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Starting drone Wifi discovery ...");
1251 const char *charIpAddress = m_ipAddress.c_str();
1253 ARDISCOVERY_Device_InitWifi(device, ARDISCOVERY_PRODUCT_BEBOP_2,
"bebop2", charIpAddress, m_discoveryPort);
1255 if (errorDiscovery != ARDISCOVERY_OK) {
1256 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Discovery error :%s", ARDISCOVERY_Error_ToString(errorDiscovery));
1258 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"- Drone controller created.");
1268void vpRobotBebop2::createDroneController(ARDISCOVERY_Device_t *discoveredDrone)
1270 m_deviceController = ARCONTROLLER_Device_New(discoveredDrone, &m_errorController);
1271 if (m_errorController != ARCONTROLLER_OK) {
1272 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Creation of deviceController failed.");
1274 ARDISCOVERY_Device_Delete(&discoveredDrone);
1275 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"- Device created.");
1282void vpRobotBebop2::setupCallbacks()
1285 m_errorController = ARCONTROLLER_Device_AddStateChangedCallback(m_deviceController, stateChangedCallback,
this);
1286 if (m_errorController != ARCONTROLLER_OK) {
1287 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"add State callback failed.");
1291 m_errorController = ARCONTROLLER_Device_AddCommandReceivedCallback(m_deviceController, commandReceivedCallback,
this);
1293 if (m_errorController != ARCONTROLLER_OK) {
1294 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"add Command callback failed.");
1297#ifdef VISP_HAVE_FFMPEG
1299 m_errorController = ARCONTROLLER_Device_SetVideoStreamCallbacks(m_deviceController, decoderConfigCallback,
1300 didReceiveFrameCallback,
nullptr,
this);
1302 if (m_errorController != ARCONTROLLER_OK) {
1303 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"- error: %s", ARCONTROLLER_Error_ToString(m_errorController));
1306 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"- Callbacks set up.");
1313void vpRobotBebop2::startController()
1316 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"Connecting ...");
1317 m_errorController = ARCONTROLLER_Device_Start(m_deviceController);
1319 if (m_errorController != ARCONTROLLER_OK) {
1320 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"- error :%s", ARCONTROLLER_Error_ToString(m_errorController));
1324 ARSAL_Sem_Wait(&(m_stateSem));
1327 m_deviceState = ARCONTROLLER_Device_GetState(m_deviceController, &m_errorController);
1329 if ((m_errorController != ARCONTROLLER_OK) || (m_deviceState != ARCONTROLLER_DEVICE_STATE_RUNNING)) {
1330 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"- deviceState :%d", m_deviceState);
1331 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"- error :%s", ARCONTROLLER_Error_ToString(m_errorController));
1333 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"- Controller started.");
1336#ifdef VISP_HAVE_FFMPEG
1342void vpRobotBebop2::initCodec()
1346 avformat_network_init();
1349 const AVCodec *codec = avcodec_find_decoder(AV_CODEC_ID_H264);
1351 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Codec not found.");
1356 m_codecContext = avcodec_alloc_context3(codec);
1358 if (!m_codecContext) {
1359 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Failed to allocate codec context.");
1364 m_codecContext->pix_fmt = AV_PIX_FMT_YUV420P;
1365 m_codecContext->skip_frame = AVDISCARD_DEFAULT;
1366 m_codecContext->error_concealment = FF_EC_GUESS_MVS | FF_EC_DEBLOCK;
1367 m_codecContext->skip_loop_filter = AVDISCARD_DEFAULT;
1368 m_codecContext->workaround_bugs = AVMEDIA_TYPE_VIDEO;
1369 m_codecContext->codec_id = AV_CODEC_ID_H264;
1370 m_codecContext->skip_idct = AVDISCARD_DEFAULT;
1372 m_codecContext->width = m_videoWidth;
1373 m_codecContext->height = m_videoHeight;
1378 m_codecContext->flags2 |= AV_CODEC_FLAG2_CHUNKS;
1381 if (avcodec_open2(m_codecContext, codec,
nullptr) < 0) {
1382 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Failed to open codec.");
1386 AVPixelFormat pFormat = AV_PIX_FMT_BGR24;
1387 int numBytes = av_image_get_buffer_size(pFormat, m_codecContext->width, m_codecContext->height, 1);
1388 m_buffer =
static_cast<uint8_t *
>(av_malloc(
static_cast<unsigned long>(numBytes) *
sizeof(uint8_t)));
1391 m_packet = av_packet_alloc();
1392 m_picture = av_frame_alloc();
1394 m_bgr_picture_mutex.lock();
1395 m_bgr_picture = av_frame_alloc();
1396 m_bgr_picture_mutex.unlock();
1398 m_img_convert_ctx = sws_getContext(m_codecContext->width, m_codecContext->height, m_codecContext->pix_fmt,
1399 m_codecContext->width, m_codecContext->height, pFormat, SWS_BICUBIC,
nullptr,
nullptr,
1408void vpRobotBebop2::cleanUpCodec()
1410 m_videoDecodingStarted =
false;
1411 av_packet_unref(m_packet);
1413 if (m_codecContext) {
1414 avcodec_flush_buffers(m_codecContext);
1415 avcodec_free_context(&m_codecContext);
1419 av_frame_free(&m_picture);
1422 av_packet_free(&m_packet);
1425 if (m_bgr_picture) {
1426 m_bgr_picture_mutex.lock();
1427 av_frame_free(&m_bgr_picture);
1428 m_bgr_picture_mutex.unlock();
1431 if (m_img_convert_ctx) {
1432 sws_freeContext(m_img_convert_ctx);
1444void vpRobotBebop2::startVideoDecoding()
1446 if (!m_videoDecodingStarted) {
1448 m_videoDecodingStarted =
true;
1451 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Video decoding is already started.");
1460void vpRobotBebop2::stopVideoDecoding()
1462 if (m_videoDecodingStarted) {
1466 ARSAL_PRINT(ARSAL_PRINT_ERROR,
"ERROR",
"Video decoding is already stopped.");
1477void vpRobotBebop2::computeFrame(ARCONTROLLER_Frame_t *frame)
1481 if (m_update_codec_params && m_codec_params_data.size()) {
1482 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"Updating H264 codec parameters (Buffer Size: %lu) ...",
1483 m_codec_params_data.size());
1485 m_packet->data = &m_codec_params_data[0];
1486 m_packet->size =
static_cast<int>(m_codec_params_data.size());
1488 int ret = avcodec_send_packet(m_codecContext, m_packet);
1492 ret = avcodec_receive_frame(m_codecContext, m_picture);
1494 if (ret == 0 || ret == AVERROR(EAGAIN)) {
1495 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"H264 codec parameters updated.");
1498 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Unexpected error while updating H264 parameters.");
1502 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Unexpected error while sending H264 parameters.");
1504 m_update_codec_params =
false;
1505 av_packet_unref(m_packet);
1506 av_frame_unref(m_picture);
1510 m_packet->data = frame->data;
1511 m_packet->size =
static_cast<int>(frame->used);
1513 int ret = avcodec_send_packet(m_codecContext, m_packet);
1516 char *errbuff =
new char[AV_ERROR_MAX_STRING_SIZE];
1517 av_strerror(ret, errbuff, AV_ERROR_MAX_STRING_SIZE);
1518 std::string err(errbuff);
1520 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Error sending a packet for decoding : %d, %s", ret, err.c_str());
1525 ret = avcodec_receive_frame(m_codecContext, m_picture);
1529 if (ret == AVERROR(EAGAIN)) {
1530 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"AVERROR(EAGAIN)");
1532 else if (ret == AVERROR_EOF) {
1533 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"AVERROR_EOF");
1537 char *errbuff =
new char[AV_ERROR_MAX_STRING_SIZE];
1538 av_strerror(ret, errbuff, AV_ERROR_MAX_STRING_SIZE);
1539 std::string err(errbuff);
1541 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Error receiving a decoded frame : %d, %s", ret, err.c_str());
1545 m_bgr_picture_mutex.lock();
1546 av_frame_unref(m_bgr_picture);
1547 av_image_fill_arrays(m_bgr_picture->data, m_bgr_picture->linesize, m_buffer, AV_PIX_FMT_BGR24,
1548 m_codecContext->width, m_codecContext->height, 1);
1550 sws_scale(m_img_convert_ctx, (m_picture)->data, (m_picture)->linesize, 0, m_codecContext->height,
1551 (m_bgr_picture)->data, (m_bgr_picture)->linesize);
1553 m_bgr_picture_mutex.unlock();
1557 av_packet_unref(m_packet);
1559 av_frame_unref(m_picture);
1567void vpRobotBebop2::cleanUp()
1569 if (m_deviceController !=
nullptr) {
1573#ifdef VISP_HAVE_FFMPEG
1579 m_deviceState = ARCONTROLLER_Device_GetState(m_deviceController, &m_errorController);
1580 if ((m_errorController == ARCONTROLLER_OK) && (m_deviceState != ARCONTROLLER_DEVICE_STATE_STOPPED)) {
1582 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"Disconnecting ...");
1583 m_errorController = ARCONTROLLER_Device_Stop(m_deviceController);
1585 if (m_errorController == ARCONTROLLER_OK) {
1587 ARSAL_Sem_Wait(&(m_stateSem));
1590 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"Deleting device controller ...");
1591 ARCONTROLLER_Device_Delete(&m_deviceController);
1594 ARSAL_Sem_Destroy(&(m_stateSem));
1596 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"- Cleanup done.");
1600 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Error while cleaning up memory.");
1617void vpRobotBebop2::stateChangedCallback(eARCONTROLLER_DEVICE_STATE newState, eARCONTROLLER_ERROR error,
1620 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Controller state changed, new state: %d.", newState);
1625 case ARCONTROLLER_DEVICE_STATE_STOPPED:
1627 drone->m_running =
false;
1629 ARSAL_Sem_Post(&(drone->m_stateSem));
1632 case ARCONTROLLER_DEVICE_STATE_RUNNING:
1634 ARSAL_Sem_Post(&(drone->m_stateSem));
1642#ifdef VISP_HAVE_FFMPEG
1652eARCONTROLLER_ERROR vpRobotBebop2::decoderConfigCallback(ARCONTROLLER_Stream_Codec_t codec,
void *customData)
1656 uint8_t *sps_buffer_ptr = codec.parameters.h264parameters.spsBuffer;
1657 uint32_t sps_buffer_size =
static_cast<uint32_t
>(codec.parameters.h264parameters.spsSize);
1658 uint8_t *pps_buffer_ptr = codec.parameters.h264parameters.ppsBuffer;
1659 uint32_t pps_buffer_size =
static_cast<uint32_t
>(codec.parameters.h264parameters.ppsSize);
1661 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"H264 configuration packet received: #SPS: %d #PPS: %d", sps_buffer_size,
1664 drone->m_update_codec_params = (sps_buffer_ptr && pps_buffer_ptr && sps_buffer_size && pps_buffer_size &&
1665 (pps_buffer_size < 32) && (sps_buffer_size < 32));
1667 if (drone->m_update_codec_params) {
1670 drone->m_codec_params_data.resize(sps_buffer_size + pps_buffer_size);
1671 std::copy(sps_buffer_ptr, sps_buffer_ptr + sps_buffer_size, drone->m_codec_params_data.begin());
1672 std::copy(pps_buffer_ptr, pps_buffer_ptr + pps_buffer_size, drone->m_codec_params_data.begin() + sps_buffer_size);
1676 drone->m_codec_params_data.clear();
1678 return ARCONTROLLER_OK;
1689eARCONTROLLER_ERROR vpRobotBebop2::didReceiveFrameCallback(ARCONTROLLER_Frame_t *frame,
void *customData)
1693 if (frame !=
nullptr) {
1695 if (drone->m_videoDecodingStarted) {
1696 drone->computeFrame(frame);
1701 ARSAL_PRINT(ARSAL_PRINT_WARNING, TAG,
"frame is nullptr.");
1704 return ARCONTROLLER_OK;
1717void vpRobotBebop2::cmdBatteryStateChangedRcv(ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary,
1720 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1721 ARCONTROLLER_DICTIONARY_ELEMENT_t *singleElement =
nullptr;
1723 if (elementDictionary ==
nullptr) {
1724 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"elements is nullptr");
1729 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, singleElement);
1731 if (singleElement ==
nullptr) {
1732 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"singleElement is nullptr");
1737 HASH_FIND_STR(singleElement->arguments, ARCONTROLLER_DICTIONARY_KEY_COMMON_COMMONSTATE_BATTERYSTATECHANGED_PERCENT,
1740 if (arg ==
nullptr) {
1741 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"arg is nullptr");
1744 drone->m_batteryLevel = arg->value.U8;
1745 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Battery level changed : %u percent remaining.", drone->m_batteryLevel);
1747 if (drone->m_batteryLevel <= 5) {
1748 ARSAL_PRINT(ARSAL_PRINT_WARNING, TAG,
" - WARNING, very low battery level, drone will stop soon !");
1750 else if (drone->m_batteryLevel <= 10) {
1751 ARSAL_PRINT(ARSAL_PRINT_WARNING, TAG,
" - Warning, low battery level !");
1765void vpRobotBebop2::cmdCameraOrientationChangedRcv(ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary,
1768 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1769 ARCONTROLLER_DICTIONARY_ELEMENT_t *element =
nullptr;
1770 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, element);
1771 if (element !=
nullptr) {
1772 HASH_FIND_STR(element->arguments, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_CAMERASTATE_ORIENTATIONV2_TILT, arg);
1774 if (arg !=
nullptr) {
1775 drone->m_currentCameraTilt =
static_cast<double>(arg->value.Float);
1778 HASH_FIND_STR(element->arguments, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_CAMERASTATE_ORIENTATIONV2_PAN, arg);
1779 if (arg !=
nullptr) {
1780 drone->m_currentCameraPan =
static_cast<double>(arg->value.Float);
1796void vpRobotBebop2::cmdCameraSettingsRcv(ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary,
vpRobotBebop2 *drone)
1798 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1799 ARCONTROLLER_DICTIONARY_ELEMENT_t *element =
nullptr;
1800 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, element);
1801 if (element !=
nullptr) {
1802 HASH_FIND_STR(element->arguments, ARCONTROLLER_DICTIONARY_KEY_COMMON_CAMERASETTINGSSTATE_CAMERASETTINGSCHANGED_FOV,
1804 if (arg !=
nullptr) {
1805 drone->m_cameraHorizontalFOV =
static_cast<double>(arg->value.Float);
1806 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Camera horizontal FOV : %f degrees.",
1807 static_cast<double>(drone->m_cameraHorizontalFOV));
1809 HASH_FIND_STR(element->arguments,
1810 ARCONTROLLER_DICTIONARY_KEY_COMMON_CAMERASETTINGSSTATE_CAMERASETTINGSCHANGED_PANMAX, arg);
1811 if (arg !=
nullptr) {
1812 drone->m_maxCameraPan =
static_cast<double>(arg->value.Float);
1813 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Max camera pan : %f degrees.",
1814 static_cast<double>(drone->m_maxCameraPan));
1816 HASH_FIND_STR(element->arguments,
1817 ARCONTROLLER_DICTIONARY_KEY_COMMON_CAMERASETTINGSSTATE_CAMERASETTINGSCHANGED_PANMIN, arg);
1818 if (arg !=
nullptr) {
1819 drone->m_minCameraPan =
static_cast<double>(arg->value.Float);
1820 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Min camera pan : %f degrees.",
1821 static_cast<double>(drone->m_minCameraPan));
1823 HASH_FIND_STR(element->arguments,
1824 ARCONTROLLER_DICTIONARY_KEY_COMMON_CAMERASETTINGSSTATE_CAMERASETTINGSCHANGED_TILTMAX, arg);
1825 if (arg !=
nullptr) {
1826 drone->m_maxCameraTilt =
static_cast<double>(arg->value.Float);
1827 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Max camera tilt : %f degrees.",
1828 static_cast<double>(drone->m_maxCameraTilt));
1830 HASH_FIND_STR(element->arguments,
1831 ARCONTROLLER_DICTIONARY_KEY_COMMON_CAMERASETTINGSSTATE_CAMERASETTINGSCHANGED_TILTMIN, arg);
1832 if (arg !=
nullptr) {
1833 drone->m_minCameraTilt =
static_cast<double>(arg->value.Float);
1834 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
" - Min camera tilt : %f degrees.",
1835 static_cast<double>(drone->m_minCameraTilt));
1850void vpRobotBebop2::cmdMaxPitchRollChangedRcv(ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary,
1853 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1854 ARCONTROLLER_DICTIONARY_ELEMENT_t *element =
nullptr;
1856 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, element);
1857 if (element !=
nullptr) {
1858 HASH_FIND_STR(element->arguments, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PILOTINGSETTINGSSTATE_MAXTILTCHANGED_CURRENT,
1860 if (arg !=
nullptr) {
1861 drone->m_maxTilt =
static_cast<double>(arg->value.Float);
1876void vpRobotBebop2::cmdRelativeMoveEndedRcv(ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary,
vpRobotBebop2 *drone)
1878 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1879 ARCONTROLLER_DICTIONARY_ELEMENT_t *element =
nullptr;
1881 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, element);
1883 if (element !=
nullptr) {
1884 HASH_FIND_STR(element->arguments, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PILOTINGEVENT_MOVEBYEND_ERROR, arg);
1886 if (arg !=
nullptr) {
1887 eARCOMMANDS_ARDRONE3_PILOTINGEVENT_MOVEBYEND_ERROR
error =
1888 static_cast<eARCOMMANDS_ARDRONE3_PILOTINGEVENT_MOVEBYEND_ERROR
>(arg->value.I32);
1889 if ((error != ARCOMMANDS_ARDRONE3_PILOTINGEVENT_MOVEBYEND_ERROR_OK) &&
1890 (error != ARCOMMANDS_ARDRONE3_PILOTINGEVENT_MOVEBYEND_ERROR_INTERRUPTED)) {
1891 ARSAL_PRINT(ARSAL_PRINT_ERROR, TAG,
"Relative move ended with error %d", error);
1893 drone->m_relativeMoveEnded =
true;
1908void vpRobotBebop2::cmdExposureSetRcv(ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary,
vpRobotBebop2 *drone)
1910 ARCONTROLLER_DICTIONARY_ARG_t *arg =
nullptr;
1911 ARCONTROLLER_DICTIONARY_ELEMENT_t *element =
nullptr;
1913 HASH_FIND_STR(elementDictionary, ARCONTROLLER_DICTIONARY_SINGLE_KEY, element);
1915 if (element !=
nullptr) {
1917 HASH_FIND_STR(element->arguments, ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PICTURESETTINGSSTATE_EXPOSITIONCHANGED_VALUE,
1920 if (arg !=
nullptr) {
1921 drone->m_exposureSet =
true;
1935void vpRobotBebop2::commandReceivedCallback(eARCONTROLLER_DICTIONARY_KEY commandKey,
1936 ARCONTROLLER_DICTIONARY_ELEMENT_t *elementDictionary,
void *customData)
1940 if (drone ==
nullptr)
1943 switch (commandKey) {
1944 case ARCONTROLLER_DICTIONARY_KEY_COMMON_COMMONSTATE_BATTERYSTATECHANGED:
1946 cmdBatteryStateChangedRcv(elementDictionary, drone);
1949 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PILOTINGSETTINGSSTATE_MAXTILTCHANGED:
1951 cmdMaxPitchRollChangedRcv(elementDictionary, drone);
1954 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PILOTINGEVENT_MOVEBYEND:
1956 cmdRelativeMoveEndedRcv(elementDictionary, drone);
1959 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PILOTINGSTATE_FLATTRIMCHANGED:
1961 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"Flat trim finished ...");
1962 drone->m_flatTrimFinished =
true;
1965 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PICTURESETTINGSSTATE_EXPOSITIONCHANGED:
1967 cmdExposureSetRcv(elementDictionary, drone);
1970 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_PICTURESETTINGSSTATE_VIDEORESOLUTIONSCHANGED:
1972 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"Video resolution set ...");
1973 drone->m_videoResolutionSet =
true;
1976 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOENABLECHANGED:
1978 drone->m_streamingStarted =
true;
1981 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_MEDIASTREAMINGSTATE_VIDEOSTREAMMODECHANGED:
1983 drone->m_streamingModeSet =
true;
1986 case ARCONTROLLER_DICTIONARY_KEY_COMMON_SETTINGSSTATE_RESETCHANGED:
1988 ARSAL_PRINT(ARSAL_PRINT_INFO, TAG,
"Settings reset ...");
1989 drone->m_settingsReset =
true;
1992 case ARCONTROLLER_DICTIONARY_KEY_ARDRONE3_CAMERASTATE_ORIENTATIONV2:
1994 cmdCameraOrientationChangedRcv(elementDictionary, drone);
1997 case ARCONTROLLER_DICTIONARY_KEY_COMMON_CAMERASETTINGSSTATE_CAMERASETTINGSCHANGED:
1999 cmdCameraSettingsRcv(elementDictionary, drone);
2009#elif !defined(VISP_BUILD_SHARED_LIBS)
2012void 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)