8,498
社区成员
发帖
与我相关
我的任务
分享我希望在 MATLAB中通过无线电向Pixhawk发送电机指令。经过搜索,MAV_CMD_DO_SET_ACTUATOR这个命令应该是合适的。我可以在MATLAB中使用 MAV_CMD_COMPONENT_ARM_DISARM解锁 Pixhawk。然而MAV_CMD_DO_SET_ACTUATOR目前并不好使。下面是我的代码。
tele_com_port = "COM16";
device = serial(tele_com_port, "BaudRate", 57600);
dialect = mavlinkdialect("common.xml");
mavlink = mavlinkio(dialect);
% Arm, MAV_CMD_COMPONENT_ARM_DISARM
cmd_arm = createcmd(dialect, "long", 400);
cmd_arm.Payload.target_system = uint8(1);
cmd_arm.Payload.param1 = single(1);
buffer_cmd_arm = serializemsg(mavlink, cmd_arm);
% Set rotor input, MAV_CMD_DO_SET_ACTUATOR
cmd_set_actuator = createcmd(dialect, "long", 187);
cmd_set_actuator.Payload.target_system = uint8(1);
cmd_set_actuator.Payload.param1 = single(0.1);
cmd_set_actuator.Payload.param2 = single(0,1);
cmd_set_actuator.Payload.param3 = single(0,1);
cmd_set_actuator.Payload.param4 = single(0.1);
buffer_cmd_set_actuator = serializemsg(mavlink, cmd_set_actuator);
fclose(device);
fopen(device);
% Arm.
fwrite(device, buffer_cmd_arm, "uint8");
fprintf("Armed\n");
% Set rotor inputs.
for i = 0: 1000
thr = (0.8 - 0.2) / 1000 * i + 0.2;
cmd_set_actuator.Payload.param1 = single(thr);
cmd_set_actuator.Payload.param2 = single(thr);
cmd_set_actuator.Payload.param3 = single(thr);
cmd_set_actuator.Payload.param4 = single(thr);
buffer_cmd_set_actuator = serializemsg(mavlink, cmd_set_actuator);
% fwrite(device, buffer_cmd_set_actuator, "uint8");
fwrite(device, buffer_cmd_set_actuator);
pause(0.02);
end
fprintf("Done\n");
fclose(device);
QGC中的电机设置如下图。


用上面这段代码给Pixhawk解锁后电机一直常速转,而且在这段代码跑完之前电机就停转了,所以应该是电机命令并没有正确发送。求助呀大神们,感谢!T T