dji2mav_bringup.cpp
Go to the documentation of this file.
00001 /****************************************************************************
00002  * @Brief   A bringup node for dji2mav. Using dji2mav interface v0.3.x
00003  * @Version 0.3.0
00004  * @Author  Chris Liu
00005  * @Create  2015/11/02
00006  * @Modify  2015/12/25
00007  ****************************************************************************/
00008 
00009 #define DJI2MAV_LOG_INFO
00010 //#define GCS_NUM 2
00011 //#define MAVLINK_COMM_NUM_BUFFERS GCS_NUM
00012 
00013 #include <string>
00014 
00015 #include <ros/ros.h>
00016 #include <dji_sdk/dji_drone.h>
00017 #include <dji_sdk/LocalPosition.h>
00018 #include <dji_sdk/Velocity.h>
00019 #include <dji_sdk/AttitudeQuaternion.h>
00020 
00021 #include "dji_sdk_dji2mav/mavHandler.h"
00022 #include "dji_sdk_dji2mav/mavContainer.h"
00023 #include "dji_sdk_dji2mav/modules/heartbeat/mavHeartbeat.h"
00024 #include "dji_sdk_dji2mav/modules/sensors/mavSensors.h"
00025 #include "dji_sdk_dji2mav/modules/waypoint/mavWaypoint.h"
00026 #include "dji_sdk_dji2mav/modules/hotpoint/mavHotpoint.h"
00027 
00028 
00029 DJIDrone* drone;
00030 dji2mav::MavSensors* g_sensors;
00031 
00032 
00033 void locPosCB(const dji_sdk::LocalPosition &msg) {
00034     g_sensors->setLocalPosition(&msg.ts, &msg.x, &msg.y, &msg.z);
00035 }
00036 
00037 void velCB(const dji_sdk::Velocity &msg) {
00038     g_sensors->setVelocity(&msg.ts, &msg.vx, 
00039             &msg.vy, &msg.vz);
00040 }
00041 
00042 void attCB(const dji_sdk::AttitudeQuaternion &msg) {
00043     g_sensors->setAttitudeQuaternion(&msg.ts, &msg.q0, &msg.q1, &msg.q2, 
00044             &msg.q3, &msg.wx, &msg.wy, &msg.wz);
00045 }
00046 
00047 void gloPosCB(const dji_sdk::GlobalPosition &msg) {
00048     g_sensors->setGlobalPosition(&msg.ts, &msg.latitude, &msg.longitude, 
00049             &msg.altitude, &msg.height);
00050 }
00051 
00052 
00053 
00054 void respondToHeartbeat() {
00055     ROS_INFO("Get heartbeat");
00056 }
00057 
00058 void respondToMissionRequestList() {
00059     ROS_INFO("Get mission request list");
00060 }
00061 
00062 void respondToMissionRequest(uint16_t param) {
00063     ROS_INFO("Get mission request %d", param);
00064 }
00065 
00066 void respondToMissionAck() {
00067     ROS_INFO("Mission ack get");
00068 }
00069 
00070 void respondToMissionCount(uint16_t param) {
00071     ROS_INFO("Get mission count %d", param);
00072 }
00073 
00074 void respondToMissionItem(uint16_t param) {
00075     ROS_INFO("Get mission item %d", param);
00076 }
00077 
00078 void respondToMissionClearAll() {
00079     ROS_INFO("Get mission clear all");
00080 }
00081 
00082 void respondToMissionSetCurrent(uint16_t param) {
00083     ROS_INFO("Get mission set current %u", param);
00084 }
00085 
00086 
00087 
00088 void respondToWpTarget(const float mission[][7], uint16_t beginIdx, 
00089         uint16_t endIdx) {
00090 
00091     dji_sdk::MissionWaypointTask task;
00092     memset(&task, 0, sizeof(dji_sdk::MissionWaypointTask));
00093 
00094     task.mission_exec_times = 0x01;
00095     task.yaw_mode = 0x03;
00096     task.velocity_range = 10.0; //must be set
00097     task.idle_velocity = 3.0; //must be set
00098 
00099     ROS_INFO("beginIdx %d, endIdx %d", beginIdx, endIdx);
00100     for(int i = beginIdx; i < endIdx; ++i) {
00101         dji_sdk::MissionWaypoint wp;
00102         memset(&wp, 0, sizeof(dji_sdk::MissionWaypoint));
00103 
00104         wp.latitude = mission[i][4];
00105         wp.longitude = mission[i][5];
00106         wp.altitude = mission[i][6];
00107         wp.target_yaw = (int16_t)mission[i][3];
00108         wp.has_action = 0x01; //true or false
00109         wp.action_time_limit = 0xffff;
00110 
00111         wp.waypoint_action.action_repeat = 0x01; //times!
00112         wp.waypoint_action.command_list[0] = 0x00;
00113         wp.waypoint_action.command_parameter[0] = (int16_t) (mission[i][0] * 1000.0);
00114 
00115         task.mission_waypoint.push_back(wp);
00116     }
00117     ROS_INFO("Size of the wpl: %d", task.mission_waypoint.size());
00118 
00119     ROS_INFO("Going to wait for Waypoint server...");
00120     drone->waypoint_navigation_wait_server();
00121     ROS_INFO("...get response!");
00122 
00123     drone->mission_waypoint_upload(task);
00124     ros::Duration(1.0).sleep();
00125     drone->mission_start();
00126     ROS_INFO("Start waypoint mission.");
00127 
00128 /*
00129     ROS_INFO("Going to wait for Waypoint result...");
00130     if(drone->waypoint_navigation_wait_for_result()) {
00131         ROS_INFO("...succeed executing current task!");
00132     } else {
00133         ROS_INFO("...fail to execute current task!");
00134     }
00135 */
00136 
00137 }
00138 
00139 
00140 void respondToHpTarget(const float hp[], uint16_t size, uint16_t cmd) {
00141     dji_sdk::MissionHotpointTask task;
00142     memset(&task, 0, sizeof(dji_sdk::MissionHotpointTask));
00143 
00144     task.latitude = hp[4];
00145     task.longitude = hp[5];
00146     task.altitude = hp[6];
00147 
00148     if(hp[2] < 0)
00149         task.is_clockwise = 0x00;
00150     else
00151         task.is_clockwise = 0x01;
00152     task.radius = abs(hp[2]);
00153 
00154     //task.? = hp[3];//unused
00155 
00156     task.angular_speed = 5;
00157     task.start_point = 0x04;//frome current position to the nearest point
00158     task.yaw_mode = 0x01;//point to the center of the circle
00159 
00160     switch(cmd) {
00161         case 17:
00162             break;
00163         case 18:
00164             //turns
00165             break;
00166         case 19:
00167             //time
00168             break;
00169     }
00170 
00171     ROS_INFO("Going to wait for Hotpoint server...");
00172     drone->waypoint_navigation_wait_server();
00173     ROS_INFO("...get response!");
00174 
00175     drone->mission_hotpoint_upload(task);
00176     ros::Duration(1.0).sleep();
00177     drone->mission_start();
00178     ROS_INFO("Start hotpoint mission.");
00179 
00180 /*
00181     ROS_INFO("Going to wait for Hotpoint result...");
00182     if( drone->waypoint_navigation_wait_for_result() )
00183         ROS_INFO("...succeed executing current task!");
00184     else
00185         ROS_INFO("...fail to execute current task!");
00186 */
00187 }
00188 
00189 
00190 
00191 int main(int argc, char* argv[]) {
00192 
00193     ros::init(argc, argv, "dji2mav_bringup");
00194     ros::NodeHandle nh;
00195     ros::NodeHandle nh_private("~");
00196     drone = new DJIDrone(nh);
00197 
00198     std::string targetIp1, targetIp2;
00199     int targetPort1, targetPort2;
00200     int srcPort1, srcPort2;
00201     nh_private.param( "targetIp1", targetIp1, std::string("10.60.23.136") );
00202     nh_private.param("targetPort1", targetPort1, 14550);
00203     nh_private.param( "targetIp2", targetIp2, std::string("10.60.23.136") );
00204     nh_private.param("targetPort2", targetPort2, 14548);
00205     nh_private.param("srcPort1", srcPort1, 14551);
00206     nh_private.param("srcPort2", srcPort2, 14549);
00207 
00208     drone->activate();
00209     ros::Duration(1.0).sleep();
00210     drone->request_sdk_permission_control();
00211 
00212     /* set the sysid "1" and the number of GCS is 2 */
00213     dji2mav::MavHandler handler(1, 2);
00214     handler.establish(0, targetIp1, (uint16_t)targetPort1, srcPort1);
00215     handler.establish(1, targetIp2, (uint16_t)targetPort2, srcPort2);
00216 
00217     /* set heartbeat module and employ senders for it on GCS 0 and 1 */
00218     dji2mav::MavHeartbeat heartbeat(handler, "heartbeat", 2, 0, 1);
00219     dji2mav::MavSensors sensors(handler, "sensors", 2, 0, 1);
00220     dji2mav::MavWaypoint waypoint(handler, "waypoint", 1, 0);
00221     dji2mav::MavHotpoint hotpoint(handler, "hotpoint", 1, 1);
00222 
00223     g_sensors = &sensors;
00224 
00225     /* Register responser */
00226 //  heartbeat.setHeartbeatHook(respondToHeartbeat);
00227 
00228     waypoint.setMissionRequestListHook(respondToMissionRequestList);
00229     waypoint.setMissionRequestHook(respondToMissionRequest);
00230     waypoint.setMissionAckHook(respondToMissionAck);
00231     waypoint.setMissionCountHook(respondToMissionCount);
00232     waypoint.setMissionItemHook(respondToMissionItem);
00233     waypoint.setMissionClearAllHook(respondToMissionClearAll);
00234     waypoint.setMissionSetCurrentHook(respondToMissionSetCurrent);
00235     waypoint.setTargetHook(respondToWpTarget);
00236 
00237     hotpoint.setTargetHook(respondToHpTarget);
00238 
00239     /* set the module container and register module with its MOI */
00240     dji2mav::MavContainer container(handler);
00241     container.registerModule(heartbeat, 1, MAVLINK_MSG_ID_HEARTBEAT);
00242     container.registerModule(sensors, 0);
00243     container.registerModule(waypoint, 7, MAVLINK_MSG_ID_MISSION_REQUEST_LIST, 
00244             MAVLINK_MSG_ID_MISSION_REQUEST, MAVLINK_MSG_ID_MISSION_ACK, 
00245             MAVLINK_MSG_ID_MISSION_COUNT, MAVLINK_MSG_ID_MISSION_ITEM, 
00246             MAVLINK_MSG_ID_MISSION_CLEAR_ALL, MAVLINK_MSG_ID_MISSION_SET_CURRENT);
00247     container.registerModule(hotpoint, 7, MAVLINK_MSG_ID_MISSION_REQUEST_LIST, 
00248             MAVLINK_MSG_ID_MISSION_REQUEST, MAVLINK_MSG_ID_MISSION_ACK, 
00249             MAVLINK_MSG_ID_MISSION_COUNT, MAVLINK_MSG_ID_MISSION_ITEM, 
00250             MAVLINK_MSG_ID_MISSION_CLEAR_ALL, MAVLINK_MSG_ID_MISSION_SET_CURRENT);
00251 
00252     /* Register Subscribers */
00253     ros::Subscriber sub1 = nh.subscribe("/dji_sdk/local_position", 1, locPosCB);
00254     ros::Subscriber sub2 = nh.subscribe("/dji_sdk/velocity", 1, velCB);
00255     ros::Subscriber sub3 = nh.subscribe("/dji_sdk/attitude_quaternion", 1, attCB);
00256     ros::Subscriber sub4 = nh.subscribe("/dji_sdk/global_position", 1, gloPosCB);
00257 
00258     container.run();
00259 
00260     while( ros::ok() ) {
00261         ros::Duration(0.02).sleep();
00262         ros::spinOnce();
00263     }
00264 
00265     ROS_INFO("Going to destruct the ROS node...");
00266     drone->release_sdk_permission_control();
00267     delete drone;
00268     ROS_INFO("...finish. Exit...");
00269 
00270     return 0;
00271 }
00272 


dji_sdk_dji2mav
Author(s):
autogenerated on Thu Jun 6 2019 17:55:34