Is there a command to simply move the drone forward, backward, ascend and descend using MAVSDK? If so, could you please share the code?
There is manual control command possible using mavsdk.
For eg: if you are using Python, you can find the description here and an example code here.
For moving, you need to translate the required directions to the appropriate control axis.
For eg: in your case,
forward/backward → Pitch
ascend/descend → Thrust
You can explore the mavsdk documentation for more features.
Thank you for your reply.
I can’t open the code example link, can you share it again?
Instead of manual control with a joystick, etc., is there a command that can give directions in meters, such as moving forward 1m or moving 2m to the right?
thank you.
in C++
move 1m to north and 2m to east:
...
mavsdk::Telemetry::PositionVelocityNed currentPosition = telemetry.position_velocity_ned();
mavsdk::Offboard::PositionNedYaw targetPostion;
targetPosition.north_m = currentPosition.north_m + 1;
targetPosition.east_m = currentPosition.east_m + 2;
targetPosition.down_m = currentPostion.down_m;
offboard.set_position_ned(targetPosition);
...
I would probably suggest offboard position control as @Artem_Borisov suggested, rather than manual control because it comes in units like meters or meters/second which I believe is what you’re after.
Thank you for your reply.
Actually, I tried off-board control using the program shown below, but after going up, it immediately went down and stopped moving near the ground.
If you have any questions, please let me know.
The drone I’m using is X500V2, FC is Pixhawks6C, and firmware is PX4.
#!/usr/bin/env python3
import asyncio
from mavsdk import System
from mavsdk.offboard import (OffboardError, VelocityBodyYawspeed)
async def run():
""" Does Offboard control using velocity body coordinates. """
drone = System()
await drone.connect(system_address="serial:///dev/ttyACM0:57600")
print("Waiting for drone to connect...")
async for state in drone.core.connection_state():
if state.is_connected:
print(f"-- Connected to drone!")
break
print("Waiting for drone to have a global position estimate...")
async for health in drone.telemetry.health():
if health.is_global_position_ok and health.is_home_position_ok:
print("-- Global position estimate OK")
break
print("-- Arming")
await drone.action.arm()
print("-- Setting initial setpoint")
await drone.offboard.set_velocity_body(
VelocityBodyYawspeed(0.0, 0.0, 0.0, 0.0))
print("-- Starting offboard")
try:
await drone.offboard.start()
except OffboardError as error:
print(f"Starting offboard mode failed with error code: \
{error._result.result}")
print("-- Disarming")
await drone.action.disarm()
return
print("-- Turn clock-wise and climb")
await drone.offboard.set_velocity_body(
VelocityBodyYawspeed(0.0, 0.0, -1.0, 0.0))
await asyncio.sleep(4)
print("-- Turn back anti-clockwise")
await drone.offboard.set_velocity_body(
VelocityBodyYawspeed(1.0, 0.0, 0.0, 0.0))
await asyncio.sleep(1)
print("-- Wait for a bit")
await drone.offboard.set_velocity_body(
VelocityBodyYawspeed(0.0, 0.0, 0.0, 0.0))
await asyncio.sleep(8)
print("--down")
await drone.offboard.set_velocity_body(
VelocityBodyYawspeed(0.0,0.0,1.0,0.0))
await asyncio.sleep(1)
print("-- Stopping offboard")
try:
await drone.offboard.stop()
except OffboardError as error:
print(f"Stopping offboard mode failed with error code: \
{error._result.result}")
if __name__ == "__main__":
# Run the asyncio loop
asyncio.run(run())
You need to check what errors come up over telemetry. Or at least look at the log, or share it here.