00001
00002
00003
00004
00005
00006
00007
00008
00009 #define DJI2MAV_LOG_INFO
00010
00011
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;
00097 task.idle_velocity = 3.0;
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;
00109 wp.action_time_limit = 0xffff;
00110
00111 wp.waypoint_action.action_repeat = 0x01;
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
00130
00131
00132
00133
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
00155
00156 task.angular_speed = 5;
00157 task.start_point = 0x04;
00158 task.yaw_mode = 0x01;
00159
00160 switch(cmd) {
00161 case 17:
00162 break;
00163 case 18:
00164
00165 break;
00166 case 19:
00167
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
00182
00183
00184
00185
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
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
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
00226
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
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
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