├── LICENSE ├── Py Apple Dynamics V6.8 ├── Py Apple Dynamics V6.8 固件及程序 │ ├── V6.8 MicroPython 固件 │ │ └── micropython.bin │ ├── V6.8 源代码 │ │ ├── PA_ATTITUDE.py │ │ ├── PA_AVGFILT.py │ │ ├── PA_IK.py │ │ ├── PA_IMU.py │ │ ├── PA_SERVO.py │ │ ├── PA_STABLIZE.py │ │ ├── PA_TROT.py │ │ ├── PA_WALK.py │ │ ├── cal.html │ │ ├── config.py │ │ ├── config_s.py │ │ ├── control.html │ │ ├── main.py │ │ ├── padog.py │ │ └── web_c.py │ ├── uPyCraft.exe │ └── 用前读我.md └── 软件和驱动 │ ├── 1驱动 │ └── CH34x_Install_Windows_v3_4.zip │ └── 2软件 │ ├── uPyCraft_V1.1.exe │ ├── 官方烧录软件 使用方法(flash_download_tool_v3.8.5).pdf │ ├── 官方烧录软件(flash_download_tool_v3.8.5).zip │ └── 软件使用说明.txt ├── Py-Apple Controller V4.0 直插版(最新) ├── 万能控直插版V4.0 原理图 PCB │ └── 菠萝万能控 V4 │ │ ├── PADog.PcbLib │ │ ├── PADog.SchLib │ │ ├── 菠萝万能控 V4.PrjPcb │ │ ├── 菠萝万能控 V4.PrjPcbStructure │ │ ├── 菠萝万能控V4.0.SchDoc │ │ └── 菠萝万能控V4.0.pcbdoc ├── 教程资料 │ ├── Py-Apple Controller 使用说明书 V4.0.pdf │ ├── Py-Apple Dynamics V4.0 二次开发教程.pdf │ └── 开源菠萝四足机器人项目--上手指南(先看我).pdf └── 菠萝万能控直插版V4.0配件清单.xlsx ├── README.md ├── pic └── pic1.jpg └── 二代菠萝(Py-Apple Structure V10.0 串联) ├── Py-apple Struture V10.0.zip └── 菠萝狗V10.0配件清单 串联腿.xlsx /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 MicroPython 固件/micropython.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 MicroPython 固件/micropython.bin -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 源代码/PA_ATTITUDE.py: -------------------------------------------------------------------------------- 1 | #Copyright Deng(灯哥) (ream_d@yeah.net) Py-apple dog project 2 | #Github:https://github.com/ToanTech/py-apple-quadruped-robot 3 | #Licensed under the Apache License, Version 2.0 (the "License"); 4 | #you may not use this file except in compliance with the License. 5 | #You may obtain a copy of the License at:http://www.apache.org/licenses/LICENSE-2.0 6 | 7 | from math import sin,cos,pi 8 | 9 | def cal_ges(PIT,ROL,l,b,w,x,Hc): 10 | YA=0 11 | P=PIT*pi/180 12 | R=ROL*pi/180 13 | Y=YA*pi/180 14 | #腿1 15 | ABl_x=l/2 - x -(l*cos(P)*cos(Y))/2 + (b*cos(P)*sin(Y))/2 16 | ABl_y=w/2 - (b*(cos(R)*cos(Y) + sin(P)*sin(R)*sin(Y)))/2 - (l*(cos(R)*sin(Y) - cos(Y)*sin(P)*sin(R)))/2 17 | ABl_z= - Hc - (b*(cos(Y)*sin(R) - cos(R)*sin(P)*sin(Y)))/2 - (l*(sin(R)*sin(Y) + cos(R)*cos(Y)*sin(P)))/2 18 | #腿2 19 | AB2_x=l/2 - x - (l*cos(P)*cos(Y))/2 - (b*cos(P)*sin(Y))/2 20 | AB2_y=(b*(cos(R)*cos(Y) + sin(P)*sin(R)*sin(Y)))/2 - w/2 - (l*(cos(R)*sin(Y) - cos(Y)*sin(P)*sin(R)))/2 21 | AB2_z=(b*(cos(Y)*sin(R) - cos(R)*sin(P)*sin(Y)))/2 - Hc - (l*(sin(R)*sin(Y) + cos(R)*cos(Y)*sin(P)))/2 22 | #腿3 23 | AB3_x=(l*cos(P)*cos(Y))/2 - x - l/2 + (b*cos(P)*sin(Y))/2 24 | AB3_y=w/2 - (b*(cos(R)*cos(Y) + sin(P)*sin(R)*sin(Y)))/2 + (l*(cos(R)*sin(Y) - cos(Y)*sin(P)*sin(R)))/2 25 | AB3_z=(l*(sin(R)*sin(Y) + cos(R)*cos(Y)*sin(P)))/2 - (b*(cos(Y)*sin(R) - cos(R)*sin(P)*sin(Y)))/2 - Hc 26 | #腿4 27 | AB4_x=(l*cos(P)*cos(Y))/2 - x - l/2 - (b*cos(P)*sin(Y))/2 28 | AB4_y=(b*(cos(R)*cos(Y) + sin(P)*sin(R)*sin(Y)))/2 - w/2 + (l*(cos(R)*sin(Y) - cos(Y)*sin(P)*sin(R)))/2 29 | AB4_z=(b*(cos(Y)*sin(R) - cos(R)*sin(P)*sin(Y)))/2 - Hc + (l*(sin(R)*sin(Y) + cos(R)*cos(Y)*sin(P)))/2 30 | 31 | x1=ABl_x 32 | y1=ABl_z 33 | 34 | x2=AB2_x 35 | y2=AB2_z 36 | 37 | x3=AB4_x 38 | y3=AB4_z 39 | 40 | x4=AB3_x 41 | y4=AB3_z 42 | 43 | return x1,x2,x3,x4,y1,y2,y3,y4 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 源代码/PA_AVGFILT.py: -------------------------------------------------------------------------------- 1 | class avg_filiter(): 2 | def __init__(self,cache_data): 3 | self.cache = cache_data 4 | self.len = len(cache_data) 5 | self.cache[0] = self.len 6 | self.sum = 0 7 | for item in cache_data[3:]: 8 | self.sum += item 9 | self.cache[1] = self.sum 10 | 11 | def avg(self,new_data): 12 | self.cache[1] = self.cache[1] - self.cache[3] 13 | self.cache[1] = self.cache[1] + new_data 14 | self.cache[3:-1] = self.cache[4:] 15 | self.cache[-1] = new_data 16 | return self.cache[1]//(self.len - 3) 17 | 18 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 源代码/PA_IK.py: -------------------------------------------------------------------------------- 1 | #Copyright Deng(灯哥) (ream_d@yeah.net) Py-apple dog project 2 | #Github:https://github.com/ToanTech/py-apple-quadruped-robot 3 | #Licensed under the Apache License, Version 2.0 (the "License"); 4 | #you may not use this file except in compliance with the License. 5 | #You may obtain a copy of the License at:http://www.apache.org/licenses/LICENSE-2.0 6 | 7 | from math import asin,acos,atan,pi,sqrt 8 | 9 | def ik(case,l1,l2,x1,x2,x3,x4,y1,y2,y3,y4): 10 | if case==0: 11 | #=============串联腿============= 12 | #腿1 13 | x1=-x1 14 | shank1=pi-acos((x1*x1+y1*y1-l1*l1-l2*l2)/(-2*l1*l2)) 15 | fai1=acos((l1*l1+x1*x1+y1*y1-l2*l2)/(2*l1*sqrt(x1*x1+y1*y1))) 16 | if x1>0: 17 | ham1=abs(atan(y1/x1))-fai1 18 | elif x1<0: 19 | ham1=pi-abs(atan(y1/x1))-fai1 20 | else: 21 | ham1=pi-1.5707-fai1 22 | shank1=180*shank1/pi 23 | ham1=180*ham1/pi 24 | 25 | #腿2 26 | x2=-x2 27 | shank2=pi-acos((x2*x2+y2*y2-l1*l1-l2*l2)/(-2*l1*l2)) 28 | 29 | fai2=acos((l1*l1+x2*x2+y2*y2-l2*l2)/(2*l1*sqrt(x2*x2+y2*y2))) 30 | if x2>0: 31 | ham2=abs(atan(y2/x2))-fai2 32 | elif x2<0: 33 | ham2=pi-abs(atan(y2/x2))-fai2 34 | else: 35 | ham2=pi-1.5707-fai2 36 | shank2=180*shank2/pi 37 | ham2=180*ham2/pi 38 | 39 | #腿3 40 | x3=-x3 41 | shank3=pi-acos((x3*x3+y3*y3-l1*l1-l2*l2)/(-2*l1*l2)) 42 | fail3=acos((l1*l1+x3*x3+y3*y3-l2*l2)/(2*l1*sqrt(x3*x3+y3*y3))) 43 | if x3>0: 44 | ham3=abs(atan(y3/x3))-fail3 45 | elif x3<0: 46 | ham3=pi-abs(atan(y3/x3))-fail3 47 | else: 48 | ham3=pi-1.5707-fail3 49 | shank3=180*shank3/pi 50 | ham3=180*ham3/pi 51 | 52 | #腿4 53 | x4=-x4 54 | shank4=pi-acos((x4*x4+y4*y4-l1*l1-l2*l2)/(-2*l1*l2)) 55 | fai4=acos((l1*l1+x4*x4+y4*y4-l2*l2)/(2*l1*sqrt(x4*x4+y4*y4))) 56 | if x4>0: 57 | ham4=abs(atan(y4/x4))-fai4 58 | elif x4<0: 59 | ham4=pi-abs(atan(y4/x4))-fai4 60 | else: 61 | ham4=pi-1.5707-fai4 62 | 63 | shank4=180*shank4/pi 64 | ham4=180*ham4/pi 65 | 66 | return ham1,ham2,ham3,ham4,shank1,shank2,shank3,shank4 67 | #=============并连腿============= 68 | elif case==1: 69 | #腿1 70 | y1=-y1 71 | L1=sqrt(x1*x1+y1*y1) 72 | psai1=asin(x1/L1) 73 | fai1=acos((L1*L1+l1*l1-l2*l2)/(2*l1*L1)) 74 | sita1_1=180*(fai1-psai1)/pi 75 | sita2_1=180*(fai1+psai1)/pi 76 | #腿2 77 | #x2=0 78 | #y2=71 79 | y2=-y2 80 | L2=sqrt(x2*x2+y2*y2) 81 | psai2=asin(x2/L2) 82 | fai2=acos((L2*L2+l1*l1-l2*l2)/(2*l1*L2)) 83 | sita1_2=180*(fai2-psai2)/pi 84 | sita2_2=180*(fai2+psai2)/pi 85 | #腿3 86 | #x3=0 87 | #y3=71 88 | y3=-y3 89 | L3=sqrt(x3*x3+y3*y3) 90 | psai3=asin(x3/L3) 91 | fai3=acos((L3*L3+l1*l1-l2*l2)/(2*l1*L3)) 92 | sita1_3=180*(fai3-psai3)/pi 93 | sita2_3=180*(fai3+psai3)/pi 94 | #腿4 95 | y4=-y4 96 | L4=sqrt(x4*x4+y4*y4) 97 | psai4=asin(x4/L4) 98 | fai4=acos((L4*L4+l1*l1-l2*l2)/(2*l1*L4)) 99 | sita1_4=180*(fai4-psai4)/pi 100 | sita2_4=180*(fai4+psai4)/pi 101 | 102 | return sita1_1,sita1_2,sita1_3,sita1_4,sita2_1,sita2_2,sita2_3,sita2_4 103 | 104 | 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 源代码/PA_IMU.py: -------------------------------------------------------------------------------- 1 | import math 2 | import machine 3 | from time import sleep,sleep_ms 4 | Kp=0.8 #比例增益支配率收敛到加速度计/磁强计 5 | Ki=0.001 #积分增益支配率的陀螺仪偏见的衔接 6 | halfT=0.004 #采样周期的一半 7 | q0=1 8 | q1=0 9 | q2=0 10 | q3=0; #四元数的元素 ,代表估计方向 11 | exInt=0 12 | eyInt=0 13 | ezInt=0 #按比例缩小积分误差 14 | 15 | def IMUupdate(gx,gy,gz,ax,ay,az): 16 | K=0.7 17 | a=[0,0,0,0,0,0,0,0] 18 | global Kp,Ki,halfT,q0,q1,q2,q3,exInt,eyInt,ezInt 19 | if ax!=0 or ay!=0 or az!=0: 20 | norm=math.sqrt(ax*ax+ay*ay+az*az); 21 | ax=ax/norm; #单位化 22 | ay=ay/norm; 23 | az=az/norm; 24 | #估计方向的重力 25 | vx=2* (q1*q3-q0*q2 ); 26 | vy=2* (q0*q1+q2*q3 ); 27 | vz=q0*q0-q1*q1-q2*q2+q3*q3; 28 | #错误的领域和方向传感器测量参考方向之间的交叉乘积的总和 29 | ex= (ay*vz-az*vy ); 30 | ey= (az*vx-ax*vz ); 31 | ez= (ax*vy-ay*vx ); 32 | #积分误差比例积分增益 33 | exInt=exInt+ex*Ki; 34 | eyInt=eyInt+ey*Ki; 35 | ezInt=ezInt+ez*Ki; 36 | #调整后的陀螺仪测量 37 | gx=gx+Kp*ex+exInt; 38 | gy=gy+Kp*ey+eyInt; 39 | gz=gz+Kp*ez+ezInt; 40 | #整合四元数率和正常化 41 | q0=q0+ (-q1*gx-q2*gy-q3*gz )*halfT; 42 | q1=q1+ (q0*gx+q2*gz-q3*gy )*halfT; 43 | q2=q2+ (q0*gy-q1*gz+q3*gx )*halfT; 44 | q3=q3+ (q0*gz+q1*gy-q2*gx )*halfT; 45 | #正常化四元 46 | norm=math.sqrt(q0*q0+q1*q1+q2*q2+q3*q3 ); 47 | q0=q0/norm; 48 | q1=q1/norm; 49 | q2=q2/norm; 50 | q3=q3/norm; 51 | Pitch=math.asin (-2*q1*q3+2*q0*q2 )*57.3; #pitch ,转换为度数 52 | if -2*q1*q1-2*q2*q2+1!=0: 53 | Roll=math.atan ((2*q2*q3+2*q0*q1)/(-2*q1*q1-2*q2*q2+1) )*57.3; #rollv 54 | a[0]=Pitch 55 | a[1]=Roll 56 | if ay*ay+az*az!=0: 57 | a[2]=-math.atan(ax/math.sqrt(ay*ay+az*az))*57.2957795 58 | if ax*ax+az*az!=0: 59 | a[3]=math.atan(ay/math.sqrt(ax*ax+az*az))*57.2957795 60 | a[4]=gx 61 | a[5]=gy 62 | a[6]=gz 63 | a[0]=-K*Pitch-(1-K)*a[2] 64 | a[1]=K*Roll+(1-K)*a[3] 65 | return a 66 | 67 | class accel(): 68 | error=[0,0,0] 69 | def __init__(self, i2c, addr=0x68): 70 | self.iic = i2c 71 | self.addr = addr 72 | self.iic.start() 73 | sleep_ms(1) 74 | self.iic.writeto(self.addr, bytearray([107, 0])) 75 | sleep_ms(1) 76 | self.iic.writeto_mem(self.addr,0x19,b'\x07') #gyro 125hz 77 | sleep_ms(1) 78 | self.iic.writeto_mem(self.addr,0x1a,b'\x04') #low filter 21hz 79 | sleep_ms(1) 80 | self.iic.writeto_mem(self.addr,0x1b,b'\x08') #gryo 500/s 65.5lsb/g 81 | sleep_ms(1) 82 | self.iic.writeto_mem(self.addr,0x1c,b'\x08') #acceler 4g ,8192lsb.g 83 | sleep_ms(1) 84 | self.iic.stop() 85 | 86 | def get_raw_values(self): 87 | self.iic.start() 88 | a = self.iic.readfrom_mem(self.addr, 0x3B, 14) 89 | self.iic.stop() 90 | return a 91 | 92 | def get_ints(self): 93 | b = self.get_raw_values() 94 | c = [] 95 | for i in b: 96 | c.append(i) 97 | return c 98 | 99 | def bytes_toint(self, firstbyte, secondbyte): 100 | if not firstbyte & 0x80: 101 | return firstbyte << 8 | secondbyte 102 | return - (((firstbyte ^ 255) << 8) | (secondbyte ^ 255) + 1) 103 | 104 | def error_gy(self): 105 | sleep(3) 106 | global error 107 | error=[0,0,0] 108 | vals = {} 109 | for i in range(0,10): 110 | raw_ints = self.get_raw_values() 111 | vals["GyX"] = self.bytes_toint(raw_ints[8], raw_ints[9]) 112 | vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11]) 113 | vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13]) 114 | error[0]= error[0]+vals["GyX"] 115 | error[1]= error[1]+vals["GyY"] 116 | error[2]= error[2]+vals["GyZ"] 117 | sleep_ms(8) 118 | error[1]=error[1]/10.0 119 | error[2]=error[2]/10.0 120 | error[0]=error[0]/10.0 121 | 122 | def get_values(self): 123 | global error 124 | vals = {} 125 | raw_ints = self.get_raw_values() 126 | vals["AcX"] = self.bytes_toint(raw_ints[0], raw_ints[1]) 127 | vals["AcY"] = self.bytes_toint(raw_ints[2], raw_ints[3]) 128 | vals["AcZ"] = self.bytes_toint(raw_ints[4], raw_ints[5]) 129 | vals["Tmp"] = self.bytes_toint(raw_ints[6], raw_ints[7]) / 340.00 + 36.53 130 | vals["GyX"] = self.bytes_toint(raw_ints[8], raw_ints[9])-error[0] 131 | vals["GyY"] = self.bytes_toint(raw_ints[10], raw_ints[11])-error[1] 132 | vals["GyZ"] = self.bytes_toint(raw_ints[12], raw_ints[13])-error[2] 133 | #vals["GyZ1"] = self.bytes_toint(raw_ints[12], raw_ints[13]) 134 | return vals # returned in range of Int16 135 | # -32768 to 32767 136 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 源代码/PA_SERVO.py: -------------------------------------------------------------------------------- 1 | #Copyright Deng(灯哥) (ream_d@yeah.net) Py-apple dog project 2 | #Github:https://github.com/ToanTech/py-apple-quadruped-robot 3 | #Licensed under the Apache License, Version 2.0 (the "License"); 4 | #you may not use this file except in compliance with the License. 5 | #You may obtain a copy of the License at:http://www.apache.org/licenses/LICENSE-2.0 6 | #函数说明: 7 | #PA_SERVO.angle(舵机通道号,舵机角度值) 8 | #PA_SERVO.release() #释放所有舵机到软状态 9 | #移植说明: 10 | #针对不同主控,重新按照 PA_SERVO.angle,PA_SERVO.release 函数形式封装舵机库,就可以通用运动控制/步态控制代码 11 | 12 | 13 | from machine import I2C 14 | from machine import Pin 15 | import ustruct 16 | import time 17 | 18 | class PCA9685: 19 | def __init__(self, i2c, address=0x40): 20 | self.i2c = i2c 21 | self.address = address 22 | self.reset() 23 | 24 | def _write(self, address, value): 25 | self.i2c.writeto_mem(self.address, address, bytearray([value])) 26 | 27 | def _read(self, address): 28 | return self.i2c.readfrom_mem(self.address, address, 1)[0] 29 | 30 | def reset(self): 31 | self._write(0x00, 0x00) # Mode1 32 | 33 | def freq(self, freq=None): 34 | 35 | if freq is None: 36 | return int(25000000.0 / 4096 / (self._read(0xfe) - 0.5)) 37 | prescale = int(25000000.0 / 4096.0 / freq + 0.5) 38 | old_mode = self._read(0x00) # Mode 1 39 | self._write(0x00, (old_mode & 0x7F) | 0x10) # Mode 1, sleep 40 | self._write(0xfe, prescale) # Prescale 41 | self._write(0x00, old_mode) # Mode 1 42 | time.sleep_us(5) 43 | self._write(0x00, old_mode | 0xa1) # Mode 1, autoincrement on 44 | 45 | def pwm(self, index, on=None, off=None): 46 | if on is None or off is None: 47 | data = self.i2c.readfrom_mem(self.address, 0x06 + 4 * index, 4) 48 | return ustruct.unpack('=padog.pit_max_ang: 55 | Sta_Pitch=padog.pit_max_ang 56 | elif Sta_Pitch<=-padog.pit_max_ang: 57 | Sta_Pitch=-padog.pit_max_ang 58 | except: 59 | pass 60 | 61 | try: 62 | #print('R:',q[2]) 63 | filter_data_r = f_gyro_data_r.avg(round(q[2])) 64 | Sta_Roll=Sta_Roll-(filter_data_r-r_origin)*kp_sta 65 | 66 | if Sta_Roll>=padog.rol_max_ang: 67 | Sta_Roll=padog.rol_max_ang 68 | elif Sta_Roll<=-padog.rol_max_ang: 69 | Sta_Roll=-padog.rol_max_ang 70 | except: 71 | pass 72 | 73 | padog.PIT_goal=Sta_Pitch 74 | padog.ROL_goal=Sta_Roll 75 | 76 | 77 | q=PA_IMU.IMUupdate(ay["GyX"]/65.5*0.0174533,ay["GyY"]/65.5*0.0174533,ay["GyZ"]/65.5*0.0174533,ay["AcX"]/8192,ay["AcY"]/8192,ay["AcZ"]/8192) 78 | 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 源代码/PA_TROT.py: -------------------------------------------------------------------------------- 1 | #Copyright Deng(灯哥) (ream_d@yeah.net) Py-apple dog project 2 | #Github:https://github.com/ToanTech/py-apple-quadruped-robot 3 | #Licensed under the Apache License, Version 2.0 (the "License"); 4 | #you may not use this file exchept in compliance with the License. 5 | #You may obtain a copy of the License at:http://www.apache.org/licenses/LICENSE-2.0 6 | from math import sin,cos,pi,atan,tan 7 | from machine import I2C, Pin 8 | import padog 9 | 10 | #初始变量设置 11 | faai=0.5 12 | Ts=1 13 | 14 | def cal_t(t,xs,xf,h,r1,r4,r2,r3): #小跑步态执行函数 15 | global q,sita,cg_adjust 16 | 17 | if t<=Ts*faai: 18 | sigma=2*pi*t/(faai*Ts) 19 | zep=h*(1-cos(sigma))/2 20 | xep_z=(xf-xs)*((sigma-sin(sigma))/(2*pi))+xs 21 | xep_b=(xs-xf)*((sigma-sin(sigma))/(2*pi))+xf 22 | #输出y 23 | y1=zep 24 | y2=0 25 | y3=zep 26 | y4=0 27 | #输出x 28 | x1=-xep_b*r1 29 | x2=-xep_z*r2 30 | x3=-xep_b*r3 31 | x4=-xep_z*r4 32 | 33 | elif t>Ts*faai and t<=Ts: 34 | sigma=2*pi*(t-Ts*faai)/(faai*Ts) 35 | zep=h*(1-cos(sigma))/2; 36 | xep_z=(xf-xs)*((sigma-sin(sigma))/(2*pi))+xs 37 | xep_b=(xs-xf)*((sigma-sin(sigma))/(2*pi))+xf 38 | #输出y 39 | y1=0 40 | y2=zep 41 | y3=0 42 | y4=zep 43 | #输出x 44 | x1=-xep_z*r1 45 | x2=-xep_b*r2 46 | x3=-xep_z*r3 47 | x4=-xep_b*r4 48 | 49 | return x1,x2,x3,x4,y1,y2,y3,y4 50 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 源代码/PA_WALK.py: -------------------------------------------------------------------------------- 1 | #Copyright Deng(灯哥) (ream_d@yeah.net) Py-apple dog project 2 | #Github:https://github.com/ToanTech/py-apple-quadruped-robot 3 | #Licensed under the Apache License, Version 2.0 (the "License"); 4 | #you may not use this file except in compliance with the License. 5 | #You may obtain a copy of the License at:http://www.apache.org/licenses/LICENSE-2.0 6 | from math import sin,cos,pi,atan,tan 7 | from machine import I2C, Pin 8 | import padog 9 | import PA_IMU 10 | import PA_AVGFILT 11 | import array 12 | 13 | #中间变量设定 14 | x1_s=0;x2_s=0;x3_s=0;x4_s=0;y1_s=0;y2_s=0;y3_s=0;y4_s=0 15 | cg_adjust=0 16 | xs=0 17 | faai=0.5 18 | Ts=1 19 | q=[] 20 | #设置陀螺仪 IIC 接口 21 | try: 22 | i2cc = I2C(scl=Pin(22), sda=Pin(21)) #集成板 23 | acc = PA_IMU.accel(i2cc) 24 | acc.error_gy() 25 | except: 26 | i2cc = I2C(scl=Pin(32), sda=Pin(33)) #直插板 27 | acc = PA_IMU.accel(i2cc) 28 | acc.error_gy() 29 | 30 | #滑动平均滤波(PITCH 轴) 31 | gyro_data_p = array.array('i', [0]*10) 32 | f_gyro_data_p = PA_AVGFILT.avg_filiter(gyro_data_p) 33 | 34 | def cal_adjust(CG_Y,l,xk,sita,period): #计算重心偏移量函数,使得机器人重心投影始终落在三角形面 35 | result=(CG_Y+period*(l+xk)/4+110*tan(sita*1.5)) #计算高度暂时固定在典型的110,1.5是角度P环值 36 | #print(result) #打印出调整量,用于调试 37 | return result 38 | 39 | 40 | def cal_w(CG_X,CG_Y,l,xf,h,speed,t,r1,r4,r2,r3): #WALK步态主计算函数,相序 1-2-3-4 41 | global d,z 42 | global x1_s,x2_s,x3_s,x4_s,y1_s,y2_s,y3_s,y4_s 43 | global q,sita,cg_adjust 44 | 45 | #获得陀螺仪数据 46 | ay=acc.get_values() 47 | q=PA_IMU.IMUupdate(ay["GyX"]/65.5*0.0174533,ay["GyY"]/65.5*0.0174533,ay["GyZ"]/65.5*0.0174533,ay["AcX"]/8192,ay["AcY"]/8192,ay["AcZ"]/8192) 48 | try: 49 | gyro_p=f_gyro_data_p.avg(round(q[1])) 50 | except: 51 | pass 52 | 53 | #开始步态计算 54 | if t=Ts*faai and t<2*Ts*faai: #迈出腿2 77 | #print("腿2") 78 | padog.gesture(0,CG_X,cal_adjust(CG_Y,l,0,gyro_p*pi/180,-1)) 79 | if abs(padog.X_S-padog.X_goal)<3: 80 | padog.gesture(0,CG_X,cal_adjust(CG_Y,l,0,gyro_p*pi/180,-1)) 81 | padog.t=padog.t+speed 82 | t=t-faai*Ts 83 | sigma=2*pi*t/(faai*Ts) 84 | zep=h*(1-cos(sigma))/2 85 | xep_b=(xf-xs)*((sigma-sin(sigma))/(2*pi))+xs 86 | #输出y 87 | y1=0 88 | y2=zep 89 | y3=0 90 | y4=0 91 | #输出x 92 | x1=xf 93 | x2=xep_b*r2 94 | x3=0 95 | x4=0 96 | x1_s=x1;x2_s=x2;x3_s=x3;x4_s=x4;y1_s=y1;y2_s=y2;y3_s=y3;y4_s=y4 97 | return x1_s,x2_s,x3_s,x4_s,y1_s,y2_s,y3_s,y4_s 98 | if t>=2*Ts*faai and t<3*Ts*faai: #迈出腿3 99 | #print("腿3") 100 | padog.gesture(0,CG_X,cal_adjust(CG_Y,l,xf,gyro_p*pi/180,1)) 101 | if abs(padog.X_S-padog.X_goal)<3: 102 | padog.gesture(0,CG_X,cal_adjust(CG_Y,l,xf,gyro_p*pi/180,1)) 103 | padog.t=padog.t+speed 104 | t=t-faai*Ts*2 105 | sigma=2*pi*t/(faai*Ts) 106 | zep=h*(1-cos(sigma))/2 107 | xep_b=(xf-xs)*((sigma-sin(sigma))/(2*pi))+xs 108 | #输出y 109 | y1=0 110 | y2=0 111 | y3=zep 112 | y4=0 113 | #输出x 114 | x1=xf 115 | x2=xf 116 | x3=xep_b*r3 117 | x4=0 118 | x1_s=x1;x2_s=x2;x3_s=x3;x4_s=x4;y1_s=y1;y2_s=y2;y3_s=y3;y4_s=y4 119 | return x1_s,x2_s,x3_s,x4_s,y1_s,y2_s,y3_s,y4_s 120 | 121 | if t>=3*Ts*faai and t<4*Ts*faai: #迈出腿4 122 | #print("腿4") 123 | padog.gesture(0,CG_X,cal_adjust(CG_Y,l,xf,gyro_p*pi/180,1)) 124 | if abs(padog.X_S-padog.X_goal)<3: 125 | padog.gesture(0,CG_X,cal_adjust(CG_Y,l,xf,gyro_p*pi/180,1)) 126 | padog.t=padog.t+speed 127 | t=t-faai*Ts*3 128 | sigma=2*pi*t/(faai*Ts) 129 | zep=h*(1-cos(sigma))/2 130 | xep_b=(xf-xs)*((sigma-sin(sigma))/(2*pi))+xs 131 | #输出y 132 | y1=0 133 | y2=0 134 | y3=0 135 | y4=zep 136 | #输出x 137 | x1=xf 138 | x2=xf 139 | x3=xf 140 | x4=xep_b*r4 141 | x1_s=x1;x2_s=x2;x3_s=x3;x4_s=x4;y1_s=y1;y2_s=y2;y3_s=y3;y4_s=y4 142 | return x1_s,x2_s,x3_s,x4_s,y1_s,y2_s,y3_s,y4_s 143 | if t>=4*Ts*faai: #足端坐标归零 144 | padog.gesture(0,CG_X,CG_Y) 145 | if x1_s>0: 146 | x1_s=x1_s-x1_s*0.1 147 | elif x1_s<0: 148 | x1_s=x1_s+x1_s*0.1 149 | x2_s=x1_s;x3_s=x1_s;x4_s=x1_s 150 | if abs(padog.X_S-padog.X_goal)<1 and abs(x1_s)<1: 151 | padog.t=padog.t+0.1 152 | return x1_s,x2_s,x3_s,x4_s,y1_s,y2_s,y3_s,y4_s 153 | 154 | 155 | 156 | 157 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 源代码/cal.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Py-apple 舵机标定 7 | 49 | 50 | 51 |

Py-apple Dog 舵机标定

52 |
53 |
54 |
55 | 腿 1 56 |
57 |
58 | 腿 2 59 |
60 |
61 | 腿 3 62 |
63 |
64 | 腿 4 65 |
66 | 67 |
68 |
69 |
70 |
71 |
72 | 小腿- 73 |
74 |
75 | 大腿+ 76 |
77 |
78 | 小腿+ 79 |
80 |
81 | 大腿- 82 |
83 | 84 |
85 |
86 |
87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 源代码/config.py: -------------------------------------------------------------------------------- 1 | #=============Wifi设置============= 2 | #do_connect_STA('Toan','Toan123456') #WIFI账号密码 3 | do_connect_STA('SSE Broadband DBDE05','h2mynZpHzaKPMqJL') #WIFI账号密码 4 | #do_connect_AP() 5 | #=============步态参数============= 6 | Ts=1 #周期 7 | faai=0.5 #占空比 8 | pit_max_ang=15 #设定俯仰轴最大限制角度 9 | rol_max_ang=15 #设定滚转轴最大限制角度 10 | xs_max=80 #设定最大x轴移动角度 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 源代码/config_s.py: -------------------------------------------------------------------------------- 1 | init_1h=90 2 | 3 | init_1s=90 4 | 5 | init_2h=90 6 | 7 | init_2s=90 8 | 9 | init_3h=90 10 | 11 | init_3s=90 12 | 13 | init_4h=90 14 | 15 | init_4s=90 16 | 17 | l1=80 18 | 19 | l2=69 20 | 21 | l=142 22 | 23 | b=92.80001 24 | 25 | w=108 26 | 27 | speed=0.035 28 | 29 | h=45 30 | 31 | Kp_H=0.06 32 | 33 | Kp_G=0.03 34 | 35 | ma_case=0 36 | 37 | in_y=0 38 | 39 | vmc_mode=0 40 | 41 | CG_X=0 42 | CG_Y=30 43 | walk_h=60 44 | walk_speed=0.015 45 | trot_cg_f=4 46 | trot_cg_b=8 47 | trot_cg_t=0 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 源代码/control.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 菠萝万能控 V6.8 8 | 33 | 279 | 280 |

菠萝万能控 6.8

281 |

By 灯哥

282 |
283 | 284 |
285 |
286 |
287 | 转向(%) :
288 | 前后(%) : 289 |
290 | 291 | 298 | 299 | 300 |
301 |
(- 俯仰角 +):
302 |
303 |
(- 滚转角 +):
304 |
305 |
(- 后前平移 +):毫米
306 |
307 |
(- 高度调节 +):毫米
308 |
309 | 310 | 311 | 364 | 365 |
366 |
367 |
368 |
369 |
370 | 371 |
372 |
373 |
374 |
375 |
376 |
377 | 378 | 379 | 380 | 381 | 382 | 383 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 源代码/main.py: -------------------------------------------------------------------------------- 1 | import _thread 2 | import padog 3 | import time 4 | from machine import Timer 5 | from machine import UART 6 | from padog import g,m 7 | # 8 | from machine import time_pulse_us 9 | from machine import Pin 10 | 11 | 12 | #run_mode=0:web遥控模式 13 | #run_mode=1:OpenMV 巡线模式 14 | #run_mode=2:OpenMV 颜色识别模式 15 | #run_mode=3:调试模式 16 | 17 | run_mode=0 18 | 19 | uart6=UART(2,115200) 20 | t = Timer(1) 21 | 22 | def OpenMV_Run(t): 23 | command="" 24 | if uart6.any(): 25 | read = uart6.read(1).decode('gbk') 26 | while read != '/': 27 | command = command + read 28 | read = uart6.read(1).decode('gbk') 29 | if(command != "1/" ) and command!="": 30 | try: 31 | exec(command) 32 | print("exec:",command) 33 | except: 34 | print("execerr:",command) 35 | command = "" 36 | 37 | 38 | def app_1(): 39 | exec(open('web_c.py').read()) 40 | 41 | def app_2(): 42 | try: 43 | exec(open('my_code.py').read()) 44 | except: 45 | print('积木编程代码执行出错,跳过...') 46 | 47 | 48 | def serial_run_loop(): 49 | while True: 50 | padog.mainloop() 51 | 52 | def loop(t): 53 | padog.mainloop() 54 | 55 | 56 | #模式判定 57 | if run_mode==0: 58 | _thread.start_new_thread(app_1, ()) 59 | t.init(period=10,mode=Timer.PERIODIC,callback=loop) 60 | elif run_mode==1: 61 | t.init(period=50,mode=Timer.PERIODIC,callback=OpenMV_Run) 62 | padog.gesture(padog.in_pit,padog.in_rol,padog.in_y) 63 | padog.speed=0.045 64 | serial_run_loop() 65 | elif run_mode==2: 66 | t.init(period=10,mode=Timer.PERIODIC,callback=OpenMV_Run) 67 | padog.gesture(padog.in_pit,padog.in_rol,padog.in_y) 68 | padog.speed=0.045 69 | serial_run_loop() 70 | elif run_mode==3: 71 | _thread.start_new_thread(app_1, ()) 72 | serial_run_loop() 73 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 源代码/padog.py: -------------------------------------------------------------------------------- 1 | #Copyright Deng(灯哥) (ream_d@yeah.net) Py-apple dog project 2 | #Github:https://github.com/ToanTech/py-apple-quadruped-robot 3 | #Licensed under the Apache License, Version 2.0 (the "License"); 4 | #you may not use this file except in compliance with the License. 5 | #You may obtain a copy of the License at:http://www.apache.org/licenses/LICENSE-2.0 6 | 7 | #引入模块 8 | import PA_SERVO 9 | import PA_TROT 10 | import PA_WALK 11 | import PA_IK 12 | import PA_ATTITUDE 13 | import PA_STABLIZE 14 | import time 15 | from machine import Pin 16 | 17 | led=Pin(22,Pin.OUT) 18 | led.value(0) #Open LED 19 | #连接网络,启用WEBREPL 20 | selfadd=0 21 | 22 | def do_connect_STA(essid, password): 23 | global selfadd 24 | import network 25 | wifi = network.WLAN(network.STA_IF) 26 | if not wifi.isconnected(): 27 | print('connecting to network...') 28 | wifi.active(True) 29 | wifi.connect(essid, password) 30 | while not wifi.isconnected(): 31 | pass 32 | print('network config:', wifi.ifconfig()) 33 | selfadd=wifi.ifconfig()[0] 34 | 35 | def do_connect_AP(): 36 | global selfadd 37 | import network 38 | wifi = network.WLAN(network.AP_IF) 39 | if not wifi.isconnected(): 40 | print('connecting to network...') 41 | wifi.active(True) 42 | while not wifi.isconnected(): 43 | pass 44 | print('network config:', wifi.ifconfig()) 45 | selfadd=wifi.ifconfig()[0] 46 | 47 | exec(open('config.py').read()) 48 | exec(open('config_s.py').read()) #加载舵机中位 49 | led.value(1) #网络加载完成,关闭LED 50 | #=============一些中间或初始变量============= 51 | t=0 52 | init_x=0;init_y=-100 53 | ges_x_1=0;ges_x_2=0;ges_x_3=0;ges_x_4=0 54 | ges_y_1=init_y;ges_y_2=init_y;ges_y_3=init_y;ges_y_4=init_y 55 | PIT_S=0;ROL_S=0;X_S=0;PIT_goal=0;ROL_goal=0;X_goal=0 56 | spd=0;L=0;R=0 57 | R_H=abs(init_y);H_goal=100 58 | init_case=0 59 | key_stab=False;gait_mode=0 60 | stop_run_node=0 61 | 62 | def cal_test_shank(x): 63 | p1=0.006649 64 | p2=0.4414 65 | p3=5.53 66 | return p1*x*x+p2*x+p3 67 | 68 | 69 | def servo_output(case,init,ham1,ham2,ham3,ham4,shank1,shank2,shank3,shank4): 70 | if case==0 and init==0: 71 | #腿1 72 | PA_SERVO.angle(4, init_1h+90-ham1) # 腿1大腿 73 | PA_SERVO.angle(5, (init_1s-90)+cal_test_shank(shank1)) # 腿1小腿 74 | #腿2 75 | PA_SERVO.angle(6,init_2h-90+ham2) # 腿2大腿 76 | PA_SERVO.angle(7, (init_2s+90)-cal_test_shank(shank2)) # 腿2小腿 77 | #腿3 78 | PA_SERVO.angle(8, init_3h-90+ham3) # 腿3大腿 79 | PA_SERVO.angle(9, (init_3s+90)-cal_test_shank(shank3)) # 腿3小腿 80 | #腿4 81 | PA_SERVO.angle(10, init_4h+90-ham4) # 腿4大腿 82 | PA_SERVO.angle(11, (init_4s-90)+cal_test_shank(shank4)) # 腿4小腿 83 | else: 84 | #腿1 85 | PA_SERVO.angle(4, init_1h) # 腿1大腿 86 | PA_SERVO.angle(5, init_1s) # 腿1小腿 87 | #腿2 88 | PA_SERVO.angle(6, init_2h) # 腿2大腿 89 | PA_SERVO.angle(7, init_2s) # 腿2小腿 90 | #腿3 91 | PA_SERVO.angle(8, init_3h) # 腿3大腿 92 | PA_SERVO.angle(9, init_3s) # 腿3小腿 93 | #腿4 94 | PA_SERVO.angle(10, init_4h) # 腿4大腿 95 | PA_SERVO.angle(11, init_4s) # 腿4小腿 96 | 97 | 98 | 99 | sitaa=0 100 | def show_circle(times): 101 | global sitaa,stop_run_node 102 | for i in range(times): 103 | stop_run_node=1 104 | while True: 105 | h=50 106 | R=15 107 | PIT_C=atan(R*sin(sitaa)/h)*180/pi 108 | ROL_C=atan(R*cos(sitaa)/h)*180/pi 109 | if sitaa>=3.14*2: 110 | sitaa=0 111 | break 112 | else: 113 | sitaa=sitaa+0.1 114 | P_G=PA_ATTITUDE.cal_ges(PIT_C,ROL_C,l,b,w,X_S,R_H) 115 | ges_x_1=P_G[0];ges_x_2=P_G[1]; ges_x_3=P_G[2]; ges_x_4=P_G[3];ges_y_1=P_G[4];ges_y_2=P_G[5]; ges_y_3=P_G[6]; ges_y_4=P_G[7] 116 | A_=PA_IK.ik(ma_case,l1,l2,ges_x_1,ges_x_2,ges_x_3,ges_x_4,ges_y_1,ges_y_2,ges_y_3,ges_y_4) 117 | servo_output(ma_case,init_case,A_[0],A_[1],A_[2],A_[3],A_[4],A_[5],A_[6],A_[7]) 118 | stop_run_node=0 119 | 120 | 121 | def height(goal): #高度调节函数 122 | global H_goal 123 | H_goal=goal 124 | 125 | def gesture(PIT,ROL,X): 126 | global PIT_goal,ROL_goal,X_goal 127 | PIT_goal=PIT 128 | ROL_goal=ROL 129 | X_goal=X 130 | 131 | #快速调节函数(适用于串口) 132 | def g(PIT): 133 | global PIT_goal 134 | PIT_goal=PIT 135 | 136 | def m(spd_,L_,R_): 137 | global spd,L,R 138 | spd=spd_;L=L_;R=R_ 139 | #快速调节函数(适用于串口) 140 | 141 | 142 | def move(spd_,L_,R_): 143 | global spd,L,R 144 | spd=spd_;L=L_;R=R_ 145 | 146 | def stable(key): 147 | global key_stab 148 | key_stab=key 149 | 150 | def servo_init(key): 151 | global init_case 152 | init_case=key 153 | 154 | def gait(mode): #设置步态 155 | global gait_mode 156 | gait_mode=mode 157 | 158 | 159 | 160 | def mainloop(): 161 | global t 162 | global R_H 163 | global PIT_S,ROL_S,X_S 164 | global ges_x_1,ges_x_2,ges_x_3,ges_x_4 165 | global ges_y_1,ges_y_2,ges_y_3,ges_y_4 166 | #锁定 167 | if stop_run_node==1: 168 | return 0 169 | #判断步态模式 170 | if gait_mode==0: 171 | if t>=(Ts-speed):#一个完整的运动周期结束 trot 172 | t=0 173 | elif L==0 and R==0: 174 | t=0 175 | else: 176 | t=t+speed 177 | #P_=PA_TROT.cal_t(t,-spd*4,spd*4,h,L,L,R,R) 178 | P_=PA_TROT.cal_t(t,0,spd*10,h,L,L,R,R) 179 | elif gait_mode==1: 180 | if t>=(Ts*2+0.5-walk_speed):#一个完整的运动周期结束 walk 181 | t=0 182 | elif L==0 and R==0: 183 | t=0 184 | else: 185 | pass #pass,因为walk采用模块内自动加 186 | P_=PA_WALK.cal_w(CG_X,CG_Y,l,abs(spd)*7,walk_h,walk_speed,t,L,L,R,R) 187 | 188 | #高度调节器1 189 | if R_H>H_goal: 190 | R_H=R_H-abs(R_H-H_goal)*Kp_H 191 | elif R_HPIT_goal: #俯仰 195 | PIT_S=PIT_S-abs(PIT_S-PIT_goal)*Kp_G 196 | elif PIT_SROL_goal: #滚转 200 | ROL_S=ROL_S-abs(ROL_S-ROL_goal)*Kp_G 201 | elif ROL_SX_goal: #X位置 205 | X_S=X_S-abs(X_S-X_goal)*Kp_G 206 | elif X_S=pit_max_ang:PIT_S=pit_max_ang 210 | if PIT_S<=-pit_max_ang:PIT_S=-pit_max_ang 211 | if ROL_S>=rol_max_ang:ROL_S=rol_max_ang 212 | if ROL_S<=-rol_max_ang:ROL_S=-rol_max_ang 213 | #TROT模态根据迈腿长度自动调节重心 214 | if gait_mode==0: 215 | if spd>=0 and (L+R)!=0: 216 | P_G=PA_ATTITUDE.cal_ges(PIT_S,ROL_S,l,b,w,X_S-abs(spd)*trot_cg_f,R_H) 217 | elif spd<0 and (L+R)!=0: 218 | P_G=PA_ATTITUDE.cal_ges(PIT_S,ROL_S,l,b,w,X_S+abs(spd)*trot_cg_b,R_H) 219 | elif (L+R)==0: #原地旋转 220 | P_G=PA_ATTITUDE.cal_ges(PIT_S,ROL_S,l,b,w,X_S+abs(spd)*trot_cg_t,R_H) 221 | else: 222 | P_G=PA_ATTITUDE.cal_ges(PIT_S,ROL_S,l,b,w,X_S,R_H) 223 | ges_x_1=P_G[0];ges_x_2=P_G[1]; ges_x_3=P_G[2]; ges_x_4=P_G[3];ges_y_1=P_G[4];ges_y_2=P_G[5]; ges_y_3=P_G[6]; ges_y_4=P_G[7] 224 | #自稳调节器(只静态稳定): 225 | if spd==0 and L==0 and R==0 and key_stab==True: 226 | PA_STABLIZE.stab() 227 | #作动 228 | A_=PA_IK.ik(ma_case,l1,l2,P_[0]+ges_x_1,P_[1]+ges_x_2,P_[2]+ges_x_3,P_[3]+ges_x_4,P_[4]+ges_y_1,P_[5]+ges_y_2,P_[6]+ges_y_3,P_[7]+ges_y_4) 229 | servo_output(ma_case,init_case,A_[0],A_[1],A_[2],A_[3],A_[4],A_[5],A_[6],A_[7]) 230 | 231 | 232 | 233 | print("Py-apple V6.8 通用控制器 by 灯哥 2021214 ESP32)") 234 | print("开源协议:Apache License 2.0") 235 | print("作者邮件:ream_d@yeah.net") 236 | 237 | 238 | 239 | 240 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/V6.8 源代码/web_c.py: -------------------------------------------------------------------------------- 1 | import padog 2 | import socket 3 | from math import floor 4 | #-----------------------HTTP Server-----------------------# 5 | user_leg_num="1" 6 | url_cal="cal.html" 7 | url_c="control.html" 8 | thr=0;turn=0;L=0;R=0;Pitch=0;Roll=0;Yst=padog.in_y;Hgt=110 #中间变量定义 9 | color_leg1='#7DFF7D';color_leg2='#FF9E9E';color_leg3='#FF9E9E';color_leg4='#FF9E9E'; 10 | test_add=0 11 | url_n=url_c 12 | g_s_num=100 13 | addr = (padog.selfadd,80) #定义socket绑定的地址,ip地址为本地,端口为80 14 | s = socket.socket() #创建一个socket对象 15 | s.bind(addr) #绑定地址 16 | s.listen(1) #设置允许连接的客户端数量 17 | print('listening on:', addr) 18 | padog.gesture(Pitch,Roll,Yst) 19 | 20 | while True: 21 | cl, addr = s.accept() #接受客户端的连接请求,cl为此链接创建的一个新的scoket对象,addr客户端地址 22 | #print('client connected from:', addr) 23 | req=str(cl.recv(1024)) 24 | cl.sendall('HTTP/1.1 200 OK\nConnection: close\nServer: FireBeetle\nContent-Type: text/html\n\n') 25 | req=req.split('\\r\\n') 26 | #http header 解析 27 | req_data=req[0].lstrip().rstrip().replace(' ','').lower() 28 | if req_data.find('favicon.ico')>-1: 29 | cl.close() 30 | continue 31 | else: 32 | req_data=req_data.replace('get/?','').replace('http/1.1','').replace("b'","") 33 | #print('req_data',req_data) 34 | if req_data.find('speed')>-1: 35 | print(req_data.replace('&',';')) 36 | exec(req_data.replace('&',';')) 37 | padog.l1=l1 38 | padog.l2=l2 39 | padog.l=l 40 | padog.b=b 41 | padog.w=w 42 | padog.speed=speed 43 | padog.h=h 44 | padog.Kp_H=kp_h 45 | padog.Kp_G=kp_g 46 | padog.CG_X=cg_x 47 | padog.CG_Y=cg_y 48 | padog.walk_h=walk_h 49 | padog.walk_speed=walk_speed 50 | padog.trot_cg_f=trot_cg_f 51 | padog.trot_cg_b=trot_cg_b 52 | padog.trot_cg_t=trot_cg_t 53 | #判断摇杆 54 | index_f = req_data.find('f=') 55 | index_find_t = req_data.find('t=') 56 | value_f = req_data[index_f+2:index_find_t].lstrip().rstrip() 57 | index_t = req_data.find('t=') 58 | value_t = req_data[index_t+2:index_t+6].lstrip().rstrip() 59 | try: 60 | thr=int(value_f)*6/100 61 | turn=int(value_t) 62 | except: 63 | pass 64 | #判断按钮 65 | index = req_data.find('key=') 66 | value = req_data[index+4:index+6].lstrip().rstrip() 67 | #Pitch 68 | if req_data.find('pit=')>-1: 69 | index_p = req_data.find('pit=') 70 | value_p = req_data[index_p+4:index_p+7].lstrip().rstrip() 71 | if value_p!='/': 72 | print('pit:',str(value_p)) 73 | Pitch=int(value_p) 74 | #Roll 75 | if req_data.find('rol=')>-1: 76 | index_r = req_data.find('rol=') 77 | value_r = req_data[index_r+4:index_r+7].lstrip().rstrip() 78 | if value_r!='/': 79 | #print('rol:',str(value_r)) 80 | Roll=int(value_r) 81 | #Height 82 | if req_data.find('hgt=')>-1: 83 | index_h = req_data.find('hgt=') 84 | value_h = req_data[index_h+4:index_h+7].lstrip().rstrip() 85 | if value_h!='/': 86 | print('hgt:',str(value_h)) 87 | Hgt=int(value_h) 88 | #Y_controller 89 | if req_data.find('yst=')>-1: 90 | index_y = req_data.find('yst=') 91 | value_y = req_data[index_y+4:index_y+7].lstrip().rstrip() 92 | if value_y!='/': 93 | print('yst:',str(value_y)) 94 | Yst=int(value_y) 95 | #运动控制用 96 | elif value == 'ss': 97 | Pitch=0;Roll=0 #清除姿态 98 | padog.stable(False) #清除陀螺仪 99 | padog.gait(0) #重置步态模式 100 | url_n=url_cal 101 | elif value == 'go': 102 | print('True') 103 | padog.stable(True) 104 | elif value == 'gc': 105 | print('False') 106 | padog.stable(False) 107 | elif value == 'g0': 108 | padog.stable(False) #切换walk步态时自动关闭陀螺仪,防止冲突 109 | padog.gait(0) 110 | elif value == 'g1': 111 | padog.stable(False) 112 | padog.gait(1) 113 | #标定判断用 114 | if value == 'l2': 115 | user_leg_num='2' 116 | color_leg1='#FF9E9E';color_leg2='#7DFF7D';color_leg3='#FF9E9E';color_leg4='#FF9E9E' 117 | elif value == 'l4': 118 | user_leg_num='4' 119 | color_leg1='#FF9E9E';color_leg2='#FF9E9E';color_leg3='#FF9E9E';color_leg4='#7DFF7D' 120 | elif value == 'l1': 121 | user_leg_num='1' 122 | color_leg1='#7DFF7D';color_leg2='#FF9E9E';color_leg3='#FF9E9E';color_leg4='#FF9E9E' 123 | elif value == 'l3': 124 | user_leg_num='3' 125 | color_leg1='#FF9E9E';color_leg2='#FF9E9E';color_leg3='#7DFF7D';color_leg4='#FF9E9E' 126 | elif value == 'sc': #保存并退出 127 | s_f = open("config_s.py", "w+") 128 | #保存中位 129 | s_f.write("init_1h="+str(padog.init_1h)+"\n") 130 | s_f.write("init_1s="+str(padog.init_1s)+"\n") 131 | s_f.write("init_2h="+str(padog.init_2h)+"\n") 132 | s_f.write("init_2s="+str(padog.init_2s)+"\n") 133 | s_f.write("init_3h="+str(padog.init_3h)+"\n") 134 | s_f.write("init_3s="+str(padog.init_3s)+"\n") 135 | s_f.write("init_4h="+str(padog.init_4h)+"\n") 136 | s_f.write("init_4s="+str(padog.init_4s)+"\n") 137 | #保存机械、步态参数 138 | s_f.write("l1="+str(padog.l1)+"\n") 139 | s_f.write("l2="+str(padog.l2)+"\n") 140 | s_f.write("l="+str(padog.l)+"\n") 141 | s_f.write("b="+str(padog.b)+"\n") 142 | s_f.write("w="+str(padog.w)+"\n") 143 | s_f.write("speed="+str(padog.speed)+"\n") 144 | s_f.write("h="+str(padog.h)+"\n") 145 | s_f.write("Kp_H="+str(padog.Kp_H)+"\n") 146 | s_f.write("Kp_G="+str(padog.Kp_G)+"\n") 147 | s_f.write("CG_X="+str(padog.CG_X)+"\n") 148 | s_f.write("CG_Y="+str(padog.CG_Y)+"\n") 149 | s_f.write("walk_h="+str(padog.walk_h)+"\n") 150 | s_f.write("walk_speed="+str(padog.walk_speed)+"\n") 151 | s_f.write("ma_case="+str(padog.ma_case)+"\n") 152 | s_f.write("trot_cg_f="+str(padog.trot_cg_f)+"\n") 153 | s_f.write("trot_cg_b="+str(padog.trot_cg_b)+"\n") 154 | s_f.write("trot_cg_t="+str(padog.trot_cg_t)+"\n") 155 | #保存重心平移量 156 | s_f.write("in_y="+str(Yst)+"\n") 157 | s_f.close() 158 | url_n=url_c 159 | padog.servo_init(0) 160 | 161 | elif value == 'hi': 162 | exec("padog.init_"+user_leg_num+"h="+"padog.init_"+user_leg_num+"h+1") 163 | elif value == 'hd': 164 | exec("padog.init_"+user_leg_num+"h="+"padog.init_"+user_leg_num+"h-1") 165 | elif value == 'si': 166 | exec("padog.init_"+user_leg_num+"s="+"padog.init_"+user_leg_num+"s+1") 167 | elif value == 'sd': 168 | exec("padog.init_"+user_leg_num+"s="+"padog.init_"+user_leg_num+"s-1") 169 | elif value == 't9': 170 | padog.servo_init(1) 171 | 172 | with open(url_n, 'r') as f: 173 | while(req_data.find('speed')>-1 or (req_data.find('f=')==-1 and req_data.find('g0')==-1 and req_data.find('g1')==-1 and req_data.find('go')==-1 and req_data.find('gc')==-1 and req_data.find('pit=')==-1 and req_data.find('rol=')==-1 and req_data.find('yst=')==-1 and req_data.find('hgt=')==-1)): 174 | out=f.read(1300) 175 | if out: 176 | try: 177 | cl.sendall(out) 178 | except:pass 179 | else: 180 | #返回此时控制器初始设定值 181 | try: 182 | cl.sendall(""" 183 | 186 | """) 187 | except:pass 188 | break 189 | #test_add=test_add+1 190 | #print('Gogo:',test_add) 191 | if url_n=="cal.html": 192 | try: 193 | cl.sendall(""" 194 |
195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 |
1号大腿:"""+str(padog.init_1h)+"""
1号小腿:"""+str(padog.init_1s)+"""
2号大腿:"""+str(padog.init_2h)+"""
2号小腿:"""+str(padog.init_2s)+"""
4号大腿:"""+str(padog.init_4h)+"""
4号小腿:"""+str(padog.init_4s)+"""
3号大腿:"""+str(padog.init_3h)+"""
3号小腿:"""+str(padog.init_3s)+"""


204 | """) 205 | 206 | cl.sendall(""" 207 |
208 |

控制器参数设定

209 |
210 |
211 |
212 | """+ 213 | """

大腿(杆1)长     : 

"""+\ 214 | """

小腿(杆2)长     : 

"""+\ 215 | """

机器人长度      : 

"""+\ 216 | """

机器人宽度      : 

"""+\ 217 | """

机器人腿间距     : 

"""+\ 218 | """

TROT步态步频    : 

"""+\ 219 | """

TROT抬腿高度    : 

"""+\ 220 | """

TROT前进重心调整P : 

"""+\ 221 | """

TROT后退重心调整P : 

"""+\ 222 | """

TROT转向重心调整P : 

"""+\ 223 | 224 | """

WALK步态抬腿高度  : 

"""+\ 225 | """

WALK步态步频    : 

"""+\ 226 | """

高度调节P环     : 

"""+\ 227 | """

姿态调节P环     : 

"""+\ 228 | """

X方向重心偏移量   : 

"""+\ 229 | """

Y方向重心偏移量   : 

"""+\ 230 | """
"""+\ 231 | """
232 |
233 | 234 | 235 | """) 236 | except:pass 237 | cl.close() #关闭socket 238 | 239 | #命令 240 | if thr>=6: 241 | thr=6 242 | elif thr<=-3: 243 | thr=-3 244 | 245 | if turn>=80: 246 | L=1;R=-1;thr=2 247 | elif turn<=-80: 248 | L=-1;R=1;thr=2 249 | else: 250 | L=1;R=1 251 | 252 | if thr==0: 253 | padog.move(0,0,0) 254 | else: 255 | padog.move(thr,L,R) 256 | 257 | padog.height(Hgt) 258 | padog.gesture(Pitch,Roll,Yst) 259 | 260 | 261 | 262 | 263 | 264 | -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/uPyCraft.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/uPyCraft.exe -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/Py Apple Dynamics V6.8 固件及程序/用前读我.md: -------------------------------------------------------------------------------- 1 | 先烧录本文件夹中的micropython固件 2 | 3 | 再烧录V6.8源代码 4 | 5 | 具体烧录方法请看项目首页中的项目搭建流程 -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/软件和驱动/1驱动/CH34x_Install_Windows_v3_4.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py Apple Dynamics V6.8/软件和驱动/1驱动/CH34x_Install_Windows_v3_4.zip -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/软件和驱动/2软件/uPyCraft_V1.1.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py Apple Dynamics V6.8/软件和驱动/2软件/uPyCraft_V1.1.exe -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/软件和驱动/2软件/官方烧录软件 使用方法(flash_download_tool_v3.8.5).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py Apple Dynamics V6.8/软件和驱动/2软件/官方烧录软件 使用方法(flash_download_tool_v3.8.5).pdf -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/软件和驱动/2软件/官方烧录软件(flash_download_tool_v3.8.5).zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py Apple Dynamics V6.8/软件和驱动/2软件/官方烧录软件(flash_download_tool_v3.8.5).zip -------------------------------------------------------------------------------- /Py Apple Dynamics V6.8/软件和驱动/2软件/软件使用说明.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py Apple Dynamics V6.8/软件和驱动/2软件/软件使用说明.txt -------------------------------------------------------------------------------- /Py-Apple Controller V4.0 直插版(最新)/万能控直插版V4.0 原理图 PCB/菠萝万能控 V4/PADog.PcbLib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py-Apple Controller V4.0 直插版(最新)/万能控直插版V4.0 原理图 PCB/菠萝万能控 V4/PADog.PcbLib -------------------------------------------------------------------------------- /Py-Apple Controller V4.0 直插版(最新)/万能控直插版V4.0 原理图 PCB/菠萝万能控 V4/PADog.SchLib: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py-Apple Controller V4.0 直插版(最新)/万能控直插版V4.0 原理图 PCB/菠萝万能控 V4/PADog.SchLib -------------------------------------------------------------------------------- /Py-Apple Controller V4.0 直插版(最新)/万能控直插版V4.0 原理图 PCB/菠萝万能控 V4/菠萝万能控 V4.PrjPcb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py-Apple Controller V4.0 直插版(最新)/万能控直插版V4.0 原理图 PCB/菠萝万能控 V4/菠萝万能控 V4.PrjPcb -------------------------------------------------------------------------------- /Py-Apple Controller V4.0 直插版(最新)/万能控直插版V4.0 原理图 PCB/菠萝万能控 V4/菠萝万能控 V4.PrjPcbStructure: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py-Apple Controller V4.0 直插版(最新)/万能控直插版V4.0 原理图 PCB/菠萝万能控 V4/菠萝万能控 V4.PrjPcbStructure -------------------------------------------------------------------------------- /Py-Apple Controller V4.0 直插版(最新)/万能控直插版V4.0 原理图 PCB/菠萝万能控 V4/菠萝万能控V4.0.SchDoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py-Apple Controller V4.0 直插版(最新)/万能控直插版V4.0 原理图 PCB/菠萝万能控 V4/菠萝万能控V4.0.SchDoc -------------------------------------------------------------------------------- /Py-Apple Controller V4.0 直插版(最新)/万能控直插版V4.0 原理图 PCB/菠萝万能控 V4/菠萝万能控V4.0.pcbdoc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py-Apple Controller V4.0 直插版(最新)/万能控直插版V4.0 原理图 PCB/菠萝万能控 V4/菠萝万能控V4.0.pcbdoc -------------------------------------------------------------------------------- /Py-Apple Controller V4.0 直插版(最新)/教程资料/Py-Apple Controller 使用说明书 V4.0.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py-Apple Controller V4.0 直插版(最新)/教程资料/Py-Apple Controller 使用说明书 V4.0.pdf -------------------------------------------------------------------------------- /Py-Apple Controller V4.0 直插版(最新)/教程资料/Py-Apple Dynamics V4.0 二次开发教程.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py-Apple Controller V4.0 直插版(最新)/教程资料/Py-Apple Dynamics V4.0 二次开发教程.pdf -------------------------------------------------------------------------------- /Py-Apple Controller V4.0 直插版(最新)/教程资料/开源菠萝四足机器人项目--上手指南(先看我).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py-Apple Controller V4.0 直插版(最新)/教程资料/开源菠萝四足机器人项目--上手指南(先看我).pdf -------------------------------------------------------------------------------- /Py-Apple Controller V4.0 直插版(最新)/菠萝万能控直插版V4.0配件清单.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/Py-Apple Controller V4.0 直插版(最新)/菠萝万能控直插版V4.0配件清单.xlsx -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 菠萝狗--一个低成本大型全套四足机器人软硬件开源项目 2 | 3 | ## 1 简介 4 | 5 | 本项目为菠萝狗(Py-Apple Dog) 的开源主站,项目旨在设计制造一只低成本的,可供简易DIY的开源四足机器狗。项目注重多平台化,是一个大型全套四足机器人开源项目。主要由四个分项目构成(点击可进入到对应的Github中),本项目主页仓库会放最新的Dynamics、Controller 和 Structure 的集合版本,方便大家快速下载: 6 | 7 | - [Py-Apple Dynamics 系列 开源四足控制软件](https://github.com/ToanTech/py-apple-dynamics) 8 | 9 | - [Py-Apple Controller 系列 开源四足万能控制器](https://github.com/ToanTech/py-apple-controller) 10 | 11 | - [Py-Apple Structure 系列 开源四足机械结构](https://github.com/ToanTech/py-apple-structure) 12 | 13 | - [Py-Apple BLDC 系列 开源无刷四足机器人!!](https://github.com/ToanTech/py-apple-bldc-quadruped-robot) 14 | 15 | 四个项目相辅相成,又相互配套。每个部分独立更新,集合起来就是一个大型且全套的四足机器人软硬件开源项目。**喜欢项目的话,请B站一键三连并 Star 项目哦**。[项目详细介绍,点击查看](http://www.leggedrobot.cn/forum.php?mod=viewthread&tid=52&extra=page%3D1) 16 | 17 | ![image1](/pic/pic1.jpg) 18 | 19 | | 运动性能 | 遥控功能 | 平衡性能 | 二次开发接口 | AI 功能 | 20 | | ---------------------------- | -------------- | ---------------- | ------------------ | ---------------- | 21 | | 8DOF 运动学逆解 | 航模遥控器控制 | 静态自稳 | 串口通讯接口 | 巡线程序 | 22 | | VMC算法 | 网页在线遥控 | WALK步态动态自稳 | 少儿图形化积木编程 | 颜色识别跟踪程序 | 23 | | 空间连杆角度补偿 | 网页在线调参 | 摔倒自恢复 | | | 24 | | 俯仰、滚转姿态控制 | | | | | 25 | | 高度控制 | | | | | 26 | | 支持自行调节机械结构尺寸参数 | | | | | 27 | 28 | 29 | 30 | ## 2 用户支持和讨论论坛 31 | 32 | 项目配套有完善的用户支持资料和讨论群组,敬请访问: 33 | 34 | - 用户支持**QQ群1**(舵机四足机器狗交流群 ):**1071643412** 35 | - 用户支持**QQ群2**(无刷四足机器狗交流群 ):**1005923565** 36 | - 官方配置文档:http://padog.com.cn/#/ 37 | - 官方Gitee仓库(国内下载资料,速度更快):[ream_d (ream_d) - Gitee.com](https://gitee.com/ream_d) 38 | - 项目效果视频浏览(B站):[灯哥开源四足机器人](https://space.bilibili.com/493192058/?share_source=copy_link&share_medium=iphone&bbid=4416d8abc8a2b4ce8ee4b65c247edea8&ts=1587442435) 39 | 40 | ## 3 开源开发信息 41 | 42 | - [Py-Apple Dynamics Github 仓库](https://github.com/ToanTech/py-apple-dynamics) 43 | - [Py-Apple Controller Github 仓库](https://github.com/ToanTech/py-apple-controller) 44 | - [Py-Apple Structure Github 仓库](https://github.com/ToanTech/py-apple-structure) 45 | - 二次开发教程,参与各本开源项目开发的方法,请对应点击到各 Github 仓库中查看 46 | - 菠萝狗开源四足机器人项目开发者交流QQ群:**960502665** 47 | 48 | ## 4 Py-Apple Dog 项目搭建方法 49 | 50 | - #### 如果你是0基础 51 | 52 | 1.先学习 [频道1](https://space.bilibili.com/493192058/channel/detail?cid=135700) 和 [频道2](https://www.bilibili.com/video/BV1b5411L7ks) 的灯哥基础视频(用电脑打开,手机可能打不开频道) 53 | 54 | 2.访问[Py-Apple Structure 系列 开源四足机械结构](https://github.com/ToanTech/py-apple-structure) 选择并根据里面指导打印并配齐机械结构和零件 55 | 56 | 3.访问[Py-Apple Controller 系列 开源四足万能控制器](https://github.com/ToanTech/py-apple-controller)选择并根据里面指导制造主控板 57 | 58 | 4.访问[Py-Apple Dynamics 系列 开源四足控制软件](https://github.com/ToanTech/py-apple-dynamics)选择并根据里面指导下载烧录四足机器人控制程序 59 | 60 | 5.按照前面的视频,学习机器人操作,开始享受 61 | 62 | 6.加入项目讨论总QQ群聊,还有讨论论坛,寻找爱好者组织 63 | 64 | 7.进一步学习,尝试按照[二次开发](http://padog.com.cn/#/PAD-3.0-Manual/4二次开发/4.0二次开发) 65 | 66 | - #### 如果你已经有基础(直接搭建项目) 67 | 68 | 1.访问[Py-Apple Structure 系列 开源四足机械结构](https://github.com/ToanTech/py-apple-structure) 选择并根据里面指导打印并配齐机械结构和零件 69 | 70 | 2.访问[Py-Apple Controller 系列 开源四足万能控制器](https://github.com/ToanTech/py-apple-controller)选择并根据里面指导制造主控板 71 | 72 | 3.访问[Py-Apple Dynamics 系列 开源四足控制软件](https://github.com/ToanTech/py-apple-dynamics)选择并根据里面指导下载烧录四足机器人控制程序 73 | 74 | 4..按照[频道1](https://www.bilibili.com/video/BV1b5411L7ks/) 的视频,学习机器人操作,开始享受 75 | 76 | 5.加入项目讨论总QQ群聊,还有讨论论坛,寻找爱好者组织 77 | 78 | 6.进一步学习,尝试按照[二次开发](http://padog.com.cn/#/PAD-3.0-Manual/4二次开发/4.0二次开发) 79 | 80 | 7.有兴趣了解程序和机器人控制原理的原理的,可以按照 [频道1](https://space.bilibili.com/493192058/channel/detail?cid=135700) 和 [频道2](https://space.bilibili.com/493192058/channel/detail?cid=135699) 学习四足机器人原理视频 81 | 82 | - #### 直接配齐所有电子元器件 83 | 84 | 菠萝狗全项目制造资料是完全开源的,你可以自行DIY。 85 | 86 | 但是,如果**想要一站式配齐所有硬件、机械、螺丝的话,可以来考虑一下我的 DIY 套件**,绝对良心价。欢迎大家购买套件支持我,支持开源项目。**为熬夜开发菠萝狗和制作四足机器人教程的我吃饭加鸡腿,熬夜添咖啡!!** 87 | 88 | **项目官方淘宝店:**[ 灯哥开源](https://shop564514875.taobao.com/) 89 | 90 | ## 5 Py-Apple Quadruped Robot 项目贡献者 91 | 92 | - [核心代码贡献者](https://github.com/ToanTech/py-apple-dynamics/blob/master/contributors_m.md) 93 | - [短期部分功能贡献者](https://github.com/ToanTech/py-apple-dynamics/blob/master/contributors_s.md) 94 | - [WIKI或者资料贡献者](https://github.com/ToanTech/py-apple-dynamics/blob/master/contributors_w.md) 95 | - [机械结构贡献者列表](https://github.com/ToanTech/py-apple-structure/blob/master/contributors_m.md) 96 | - [万能控制器贡献者列表](https://github.com/ToanTech/py-apple-controller/blob/master/contributors_m.md) 97 | 98 | ## 6 配套的教程(点击即可进入) 99 | 100 | 针对这只开源四足机器人,为大家精心准备了配套的四足机器人教程**(共三个系列)** 101 | 102 | - #### 灯哥系列(新版本)--更新中 最新更新:2021.4.5 103 | [灯哥0基础DIY四足机器人指南(新版) ](https://www.bilibili.com/video/BV1b5411L7ks/) 104 | - #### 灯哥系列(老版本) 105 | 106 | [1. 灯哥0基础DIY四足机器人指南(1)--绪论 ](https://www.bilibili.com/video/BV1YE411A7VA/) 107 | 108 | [2. 灯哥0基础DIY四足机器人指南(2)--机械设计要点](https://www.bilibili.com/video/BV1HV411f7nT/) 109 | 110 | [3. 灯哥0基础DIY四足机器人指南(3)--手把手教你组装一只机器狗](https://www.bilibili.com/video/BV1Sk4y1d7RH/) 111 | 112 | [4. 灯哥0基础DIY四足机器人指南(4)--机器狗运动学逆解与电路连接 ](https://www.bilibili.com/video/BV13T4y1G7qy/) 113 | 114 | [5. 灯哥0基础DIY四足机器人指南(5)--开源代码踏步调试](https://www.bilibili.com/video/BV1Ak4y1R7cD/) 115 | 116 | [6. 灯哥0基础DIY四足机器人指南(6)--3D建模入门与新菠萝狗构型](https://www.bilibili.com/video/BV1Jf4y1S7U9) 117 | 118 | [7. 灯哥0基础DIY四足机器人指南(7)--软件架构、高度调节与逆解的实现 ](https://www.bilibili.com/video/BV1Qe411s7kp/) 119 | 120 | [8. 灯哥0基础DIY四足机器人指南(8)--用Matlab画出摆线步态曲线](https://www.bilibili.com/video/BV1KQ4y1K7aV/) 121 | 122 | - #### 灯妹系列 123 | 124 | [1. 灯妹四足机器人数学知识小课(1)--旋转变换](https://www.bilibili.com/video/BV1Hp4y1D7zn/) 125 | 126 | [2.【进阶教程】机器狗12自由度逆解【灯哥0基础DIY四足机器人指南】-进阶篇1](https://www.bilibili.com/video/BV1jX4y1g7u6/) 127 | 128 | [3.【进阶教程】机器狗12自由度正解【灯哥0基础DIY四足机器人指南】-进阶篇2](https://www.bilibili.com/video/BV1Gv41177gd/) 129 | 130 | - #### 代码文字版详解 131 | 132 | [Py-apple Dynamics 6.0 代码文字版本详解 by LiangYuHao](https://blog.csdn.net/weixin_41659552?spm=1001.2014.3001.5343) -------------------------------------------------------------------------------- /pic/pic1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/pic/pic1.jpg -------------------------------------------------------------------------------- /二代菠萝(Py-Apple Structure V10.0 串联)/Py-apple Struture V10.0.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/二代菠萝(Py-Apple Structure V10.0 串联)/Py-apple Struture V10.0.zip -------------------------------------------------------------------------------- /二代菠萝(Py-Apple Structure V10.0 串联)/菠萝狗V10.0配件清单 串联腿.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ToanTech/py-apple-quadruped-robot/d2bb34f82ff1d1c69c657c50e3af1608ebb6d1fb/二代菠萝(Py-Apple Structure V10.0 串联)/菠萝狗V10.0配件清单 串联腿.xlsx --------------------------------------------------------------------------------