|
发表于 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输入,从而控制舵机转动。 |
|