| 
 | 
 
 
发表于 2024-8-7 14:11:53
 4991 浏览  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通道。 
请问这种情况如何解决呢 
 |   
 
  扫一扫浏览分享 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
| 
 | 
 
 
发表于 2024-8-8 10:05:45
                                 
 
 
可能是你的 OverrideRCIn 消息的格式和发布逻辑上有问题,没有正确设置所有未使用的通道为默认值。这会导致覆盖消息没有生效。 
可以试一下: 
- #include <ros/ros.h>
 
 - #include <mavros_msgs/OverrideRCIn.h>
 
  
- int main(int argc, char **argv)
 
 - {
 
 -     ros::init(argc, argv, "servo_control");
 
 -     ros::NodeHandle nh;
 
 -     ros::Publisher servo_pub = nh.advertise<mavros_msgs::OverrideRCIn>("/mavros/rc/override", 10);
 
  
-     ros::Rate loop_rate(10); // 10 Hz
 
  
-     while (ros::ok())
 
 -     {
 
 -         mavros_msgs::OverrideRCIn msg;
 
  
-         // 初始化所有通道为中立值
 
 -         for (int i = 0; i < 8; i++) {
 
 -             msg.channels[i] = 0; // 不覆盖该通道
 
 -         }
 
  
-         // 设置通道5(索引4)的值,例如1600
 
 -         msg.channels[4] = 1600;
 
  
-         ROS_INFO("Publishing RC Override: %d", msg.channels[4]);
 
 -         servo_pub.publish(msg);
 
  
-         ros::spinOnce();
 
 -         loop_rate.sleep();
 
 -     }
 
  
-     return 0;
 
 - }
 
 
  复制代码 
 
关键点: 
 
1. 确保所有未使用的通道被设置为0:这表示这些通道将不会被覆盖。 
2. 频率问题:确保消息发布的频率足够高,以便飞控能及时接收到覆盖指令。 
 
你可以在 ros::Rate loop_rate(10); 这行代码中调整发布频率。多数情况,10Hz是一个合适的频率。 
 
另外,切换到 OFFBOARD 模式并解锁后运行代码。这样应该能确保 OverrideRCIn 消息正确覆盖原有的RC输入,从而控制舵机转动。 |   
 
 
 
 |  
| 
 | 
 
 
 | 
 | 
 
| 
 | 
 | 
 
 
 
 
         
  
         
 |