DJI ONBOARD SDK/DJI OSDK ROS—— 基礎控制功能 Joystick的使用
概述
使用OSDK/OSDK_ROS 的無人機飛行控制功能,能夠設置并獲取無人機各項基礎參數,控制無人機執行基礎飛行動作,通過Joystick 功能控制無人機執行復雜的飛行動作。
Joystick 功能
Joystick 是一個無人機綜合控制功能,使用Joystick 功能時,開發者根據實際的應用需要,通過調用Joystick 中的接口,同時設置無人機使用的坐標系、水平控制的模式、垂直控制的模式、yaw角度控制的模式和懸停模式,才能設計出滿足使用需求的無人機飛行控制邏輯。
1. 設置坐標系
機體坐標系
機體坐標系以無人機的重心為原點,無人機機頭前進的方向為X軸,機頭前進方向的右側為Y軸,Z軸與X軸、Y軸相互垂直交于重心且指向無人機下方(遵循“右手法則”)。在機體坐標下,無人機圍繞X軸、Y軸和Z軸旋轉時的飛行動作,可稱為橫滾(無人機僅繞X軸旋轉)、俯仰(無人機僅繞Y軸旋轉)和偏航(無人機僅繞Z軸旋轉)。
大地坐標系
大地坐標系也稱世界坐標系或當地水平坐標系,在該坐標系中,無人機指向地球正北的方向為X軸,正東的方向為Y軸,X軸與Y軸相互垂直,Z軸豎直指向無人機下方,在滿足“右手法則”的前提下,Z軸將根據無人機飛行的實際情況調節角度,因此該坐標系也稱為“北-東-地(N-E-D)坐標系”。
2. 設置水平控制模式
姿態角控制模式:在該模式下,水平方向的指令為無人機的姿態角。(在機體坐標系下,該角度為roll 和pitch)
速度控制模式:在該模式下,水平方向的指令為無人機的速度
位置控制模式:在該模式下,水平方向的指令為無人機的位置
角速度控制:在該模式下,水平方向的指令為無人機的旋轉角速度
說明: 當位置指令的模不為0時,無人機會以指定的速度向前飛行,否則,無人機將懸停在指定的位置。
3.設置垂直控制模式
速度控制模式:控制無人機垂直方向的速度
位置控制模式:控制無人機垂直方向的位置,該位置為相對于起飛點的絕對位置
油門控制模式:控制無人機的油門
4. 設置yaw角度控制模式
角度控制模式:在該模式下,yaw方向旋轉的指令為yaw 的角度
角速率控制模式:在該模式下,yaw方向旋轉的指令為yaw 的角速率
5. 設置無人機懸停模式
僅在水平控制模式中的速度控制模式下,開發者可以設置無人機的懸停模式:
開啟穩定模式:開啟穩定模式后,無人機將在指定的位置上懸停
關閉穩定模式:關閉穩定模式后,無人機將按照速度命令飛行,當無人機的前進速度為0時候,無人機可能會隨風飄動
使用Joystick飛行控制功能
使用Joystick 功能需要先設置Joystick 的模式和對應的控制指令,再執行Joystick 指令,實現對無人機的控制。 如下代碼以在dji_osdk_ros例子中,使用Joystick 功能控制無人機。
設置joystick的模式 1:
void velocityAndYawRateCtrl(const JoystickCommand &offsetDesired, uint32_t timeMs)
{double originTime = 0;double currentTime = 0;uint64_t elapsedTimeInMs = 0;SetJoystickMode joystickMode;JoystickAction joystickAction;joystickMode.request.horizontal_mode = joystickMode.request.HORIZONTAL_VELOCITY;joystickMode.request.vertical_mode = joystickMode.request.VERTICAL_VELOCITY;joystickMode.request.yaw_mode = joystickMode.request.YAW_RATE;joystickMode.request.horizontal_coordinate = joystickMode.request.HORIZONTAL_GROUND;joystickMode.request.stable_mode = joystickMode.request.STABLE_ENABLE;set_joystick_mode_client.call(joystickMode);joystickAction.request.joystickCommand.x = offsetDesired.x;joystickAction.request.joystickCommand.y = offsetDesired.y;joystickAction.request.joystickCommand.z = offsetDesired.z;joystickAction.request.joystickCommand.yaw = offsetDesired.yaw;originTime = ros::Time::now().toSec();currentTime = originTime;elapsedTimeInMs = (currentTime - originTime)*1000;while(elapsedTimeInMs <= timeMs){currentTime = ros::Time::now().toSec();elapsedTimeInMs = (currentTime - originTime) * 1000;joystick_action_client.call(joystickAction);}
}
設置水平控制模式:
joystickMode.request.horizontal_mode = joystickMode.request.HORIZONTAL_VELOCITY;
設置水平控制模式:
joystickMode.request.vertical_mode = joystickMode.request.VERTICAL_VELOCITY;
設置yaw角度控制模式:
joystickMode.request.yaw_mode = joystickMode.request.YAW_RATE;
設置yaw角度控制模式:
joystickMode.request.horizontal_coordinate = joystickMode.request.HORIZONTAL_GROUND;
設置坐標系:
joystickMode.request.horizontal_coordinate = joystickMode.request.HORIZONTAL_GROUND;
設置無人機懸停模式:
joystickMode.request.stable_mode = joystickMode.request.STABLE_ENABLE;
通過參考JoystickMode所有參數可以獲得所有備選參數。
設置joystick的模式2 :
bool moveByPosOffset(FlightTaskControl& task,const JoystickCommand &offsetDesired,float posThresholdInM,float yawThresholdInDeg)
{task.request.task = FlightTaskControl::Request::TASK_POSITION_AND_YAW_CONTROL;task.request.joystickCommand.x = offsetDesired.x;task.request.joystickCommand.y = offsetDesired.y;task.request.joystickCommand.z = offsetDesired.z;task.request.joystickCommand.yaw = offsetDesired.yaw;task.request.posThresholdInM = posThresholdInM;task.request.yawThresholdInDeg = yawThresholdInDeg;task_control_client.call(task);return task.response.result;
}
使用常用的設置模式:
task.request.task = FlightTaskControl::Request::TASK_POSITION_AND_YAW_CONTROL;
這是一種快捷的設置方式,具體請參考JoystickMode相關
問題:
如何利用joystickMode功能,擴展出更強大和靈活的無人機飛行控制功能 ? 例如:如何實現控制無人機運動速度(包括運動方向)的同時也能控制其運動位移和方位角 ?
期待你的見解…
dji_osdk_ros例子
JoystickMode所有參數
JoystickMode常用模式