如何在MATLAB中通过无线电给Pixhawk发送电机指令

Rxdem 2024-02-05 23:33:31

配置

  • Pixhawk 4
  • PX4 1.14.0
  • QGC 4.3.0
  • Holybro Telemetry Radio
  • MATLAB r2023b

问题

我希望在 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中的电机设置如下图。

img

img

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

...全文
684 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
超维空间科技 2024-02-13
  • 打赏
  • 举报
回复
消息不对,应该是用command消息
Rxdem 2024-02-14
  • 举报
回复
@超维空间科技 发送电机指令的消息不对吗?我查文档应该是用 "MAV_CMD_DO_SET_ACTUATOR" 呀,而且这个是command。大佬麻烦再详细一点呗
超维空间科技 2024-02-14
  • 举报
回复
@Rxdem 可以试下set_servo那个
Rxdem 2024-02-14
  • 举报
回复
@超维空间科技 刚刚试了"MAV_CMD_DO_SET_SERVO",还是同样的现象,解锁后电机的转速不变。另外这个命令每次只能设置一个舵机,但我需要同时改变四个电机的转速。。。
5条回复

8,498

社区成员

发帖
与我相关
我的任务
社区描述
超维空间科技交流学习社区
无人机开源 技术论坛(原bbs) 江苏省·南京市
社区管理员
  • 超维空间科技
  • 超维空间—南京分维
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

每天晚上9点前的提问当天解答,9点后的提问第二天解答

提问前请先搜索以前的贴子,以免重复提问

试试用AI创作助手写篇文章吧