|
发表于 2024-8-7 14:11:53
1014 浏览 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输入,从而控制舵机转动。 |
|
|
|
|
|
|
|