4

阿木币

0

精华

5 小时

在线时间

应届白菜

Rank: 1

发表于 2024-8-7 14:11:53 1386 浏览 1 回复

[控制算法] mavros控制舵机大问题

我用的是cuav X7+飞控,烧录的px41.13.1版本固件,是打算使用mavros控制舵机转动,因为这个飞控没有AUX接口,只有M1-M14的接口,所以我将舵机插到M5口,在飞控参数里将M5映射给AUX1,然后将AUX1映射到遥控器5通道,并且给舵机单独供电,在无人机解锁后,可以通过遥控器控制舵机转动;然后我尝试用代码控制舵机,我添加这个#include <mavros_msgs/OverrideRCIn.h>头文件,发布ros::Publisher servo_pub = nh.advertise<mavros_msgs::OverrideRCIn>("/mavros/rc/override"10)这个话题,然后 通过这几行代码mavros_msgs::OverrideRCIn msg;msg.channels[4] = 1600;ROS_INFO("Publishing RC Override: %d", msg.channels[4]);servo_pub.publish(msg);去控制channels[4]通道的数值,来控制舵机转动。当我运行代码后,无人机切到offboard 并解锁,然后发布这个话题,但是舵机并没有反映,我去查看MAVROS/rc/override的消息,发现这个已经发布成功了,再与查看MAVROS/rc/in的话题,发现这个channels5通道的值一直没有改变,
也就是说,我发布的值没有覆盖掉原来的数值,我也将飞控的参数COM_RC_OVERRIDE设置为3,可以允许mavros命令控制PWM输出,但是舵机依然并没有反应。channels[]是从0开始计数,所以channles[4]控制的就是5通道。
请问这种情况如何解决呢
我知道答案 回答被采纳将会获得 已有1人回答

扫一扫浏览分享
回复

使用道具 举报

255

阿木币

1

精华

55 小时

在线时间

老司机

Rank: 2

发表于 2024-8-8 10:05:45
可能是你的 OverrideRCIn 消息的格式和发布逻辑上有问题,没有正确设置所有未使用的通道为默认值。这会导致覆盖消息没有生效。
可以试一下:
  1. #include <ros/ros.h>
  2. #include <mavros_msgs/OverrideRCIn.h>

  3. int main(int argc, char **argv)
  4. {
  5.     ros::init(argc, argv, "servo_control");
  6.     ros::NodeHandle nh;
  7.     ros::Publisher servo_pub = nh.advertise<mavros_msgs::OverrideRCIn>("/mavros/rc/override", 10);

  8.     ros::Rate loop_rate(10); // 10 Hz

  9.     while (ros::ok())
  10.     {
  11.         mavros_msgs::OverrideRCIn msg;

  12.         // 初始化所有通道为中立值
  13.         for (int i = 0; i < 8; i++) {
  14.             msg.channels[i] = 0; // 不覆盖该通道
  15.         }

  16.         // 设置通道5(索引4)的值,例如1600
  17.         msg.channels[4] = 1600;

  18.         ROS_INFO("Publishing RC Override: %d", msg.channels[4]);
  19.         servo_pub.publish(msg);

  20.         ros::spinOnce();
  21.         loop_rate.sleep();
  22.     }

  23.     return 0;
  24. }
复制代码


关键点:

1. 确保所有未使用的通道被设置为0:这表示这些通道将不会被覆盖。
2. 频率问题:确保消息发布的频率足够高,以便飞控能及时接收到覆盖指令。

你可以在 ros::Rate loop_rate(10); 这行代码中调整发布频率。多数情况,10Hz是一个合适的频率。

另外,切换到 OFFBOARD 模式并解锁后运行代码。这样应该能确保 OverrideRCIn 消息正确覆盖原有的RC输入,从而控制舵机转动。
回复 点赞

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表