Hello people!
A group of friends and I set out on a project for school. We're extremely ambitious and face a tight deadline. I am really keen on accomplishing this and was hoping to find some support here.
Basically, we would like to merge the body of a quadcopter with a wing and enable a function for it to fly like a plane (stabilized horizontally from its regular vertical position). Looking at introducing a programmed "Transit mode" for it to automatically pitch forward (it will start to fly forward) and hold it's pitch.
We are using an APM2 and an xBee, not sure what else you'd need. We have our quad flying pretty well, both manually and automatically by waypoints (using Mission Planner).
The other guys are now working on a prototype wing as our custom frame.
I have been trying to code a brand new function in ArduCopter 2.7.3 but to no avail. I have followed the recent webinar set up by Andreas M. Antonopoulos. I think I have sufficient knowledge of how the code works but I was wondering if anyone would like to help in our endeavor.
My first few questions would be:
- Where do I insert a new function? In the UserCode.pde?
- Where are the limiters that ensure the quad does not flip over? Is it:
target_angle = constrain(target_angle, -4500, 4500);
- How do I go about giving the motors a programmed function/behavior (to get it to transit from quad to "plane" mode)?
- If we want to re-position the motors on our prototype wing, would we have to create a new AP_Motors class file (since the frame is different, as mentioned during the webinar)?
I am sure more questions will come as we progress in our project.
I have seen how helpful this community is, especially with the webinar, and am really hoping to find the support and guidance my friends and I need to succeed.
Thanks for spending your time reading all this and any help/suggestions you have would be greatly appreciated.
[Attached is a picture of our first prototype, the final design will differ]
Replies
Updates!
Our 4th wing design flew. As a proof of concept, it works.
No control surfaces, 4 motors, covers 100m in approximatly 3 seconds.
Transmitter control scheme has been successfully changed.
VTOL-copter now flies at 90deg pitched forward for horizontal flight.
Now looking at addition features/improvements:
- Lengthen flight duration
- Improving stabilization during flight
- Automation
- Addition of stabilizing camera mount(s)
Picture of 3rd wing design:
Today, we're looking at replacing Simple Mode flight with our "transited mode". On the ArduCopter 2.7.3, is Simple Mode found under "case ROLL_PITCH_TOY" or "ROLL_PITCH_STABLE_OF"? The ArduCopter wiki says it should be ROLL_PITCH_SIMPLE, but that doesn't exist in 2.7.3 right?
I am also wondering if there is a section of program that allows the quad to stabilize in it's regular parallel-to-ground flight position. We are thinking of applying that to it's "transited mode" so the plane will hold it's pitch. Or is there a better way to do this?
We are also looking at the angle_boost function. I do not think we will be completely removing it since we still want to be able to fly like a quad (somewhat). Though flying in "transited mode", we will probably not need it since the wing is calculated and designed to provide enough lift.
As for a new AP_Motors class, we are thinking of trying to fly in some of the existing classes first. One of our guys did his calculations and found that the motor positions in the design we are using will probably not affect their (quad) performance too much, although we will have to fly before we can really tell.
So we've made changes to the attitude.pde and the radio.pde to test the angle limits of our quad. The amended program compiles and uploads to the APM just fine. However, when we try to use Mission Planner to connect to the APM, it always fails. The .pde/.ino files are in the right place. We've checked and re-check but have not found any syntax or logical errors in our changes to the Arducopter 2.7.3.
Does anyone know why the APM would stop responding to the mission planner this way? Or if perhaps there might have been a problem with our uploading process?
Zachary,
Those changes will be too core to be simply put into the UserCode.pde I think.
Yes, if you want to put the motors in a different configuration (not 90 degrees apart) then you'll likely need to write a new AP_Motors class to do the mixing appropriately.
There may be limits in the attitude.pde's get_stabilize_roll and get_stabilize_pitch functions but there are also limits on the radio input. Please have a look at the init_rc_in function in radio.pde (search for "g.rc_1.set_angle(4500)".
I think the best way to do this is to change the interpretation of the roll, pitch and yaw input which is done in the update_roll_pitch_mode and update_yaw_mode functions. So for example in update_roll_pitch..there are these lines you see below. the rc_1.control_in is the roll input from the pilot, the rc_2.control_in is the pitch input. These are sent to the stabilize controllers which uses them as the target roll or pitch angles. You'll find something similar in the update_yaw_mode function.
What I think you want though is to change the target roll, pitch and yaw angles depending upon the attitude of the copter. So the more it say leans forward, a portion of the pilot's yaw command starts to actually mean roll..and roll starts to mean yaw. If done properly, i don't think you will need a hard switch between modes.. it will just blend in nicely.
by the way, you may also need to disable the angle_boost function or weaken it's effect..that adds power as you lean more..but if your copter's body starts providing lift as you lean over more..then it's less likely that you need this "boost" anymore.
good luck
I assume you familiar with the (paparazzi) quadshot?
http://thequadshot.com/
If you haven't already looked at the "ATMOV" transitioning airframe developed by students at TU Delft you should check that out too.
http://www.teamatmos.nl/atmov-design
It would be cool if you managed to merge ArduCopter and ArduPlane firmwares, and added features for transitioning between them, it's certainly a neat trick :)