- Получить ссылку
- X
- Электронная почта
- Другие приложения
КОНТРОЛЛЕР БЛЕНДЕРА
ссылка
Этот скрипт на python позволяет в реальном времени управлять роботизированной рукой в Blender. Он работает, считывая углы обратной кинематики из якоря руки и отправляя их через последовательный порт в arduino, управляющий физической рукой.
Проект был упрощен, чтобы предоставить простой пример того, как получить данные из blender и отправить их в arduino, и готов к немедленному использованию.
Чтобы начать управлять рукой сначала загрузите код arduino на доску. Затем откройте Blender и нажмите «Run Script» и значок воспроизведения (как показано на рисунке ниже) и наведите курсор мыши на руку после нажатия клавиши «G» (необходимо выбрать «Link3IK»).

Этот проект лицензируется в соответствии с Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
Скрипт для управления роботизированной рукой с помощью мыши от Blender, который отправляет соответствующие углы IK через последовательный порт. http://www.alvaroferran.com/projects/...
BlenderController
В этом репо показано, как управлять роботом из блендера с помощью python. Для запуска контроллера сначала загрузите код arduino на плату. Затем в файле блендера нажмите «Run Script», затем значок воспроизведения и, наконец, наведите курсор мыши на контрольную кость и нажмите клавишу «G».
Этот проект лицензируется в соответствии с Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
Скрипты
1) Ардуино "BlenderController / Arduino /BlenderController.ino"
| # include < Servo.h > | |
| Сервопривод s1, s2; | |
| void setup () { | |
| Последовательный. начало ( 115200 ); | |
| Последовательный. flush (); | |
| s1. прикрепить ( 9 ); | |
| s2. прикрепить ( 8 ); | |
| } | |
| String readString () { | |
| String inString = " " ; | |
| char inChar; | |
| while (Serial. available ()> 0 ) { | |
| inChar = ( char ) Серийный. читать (); | |
| inString + = inChar; | |
| задержка ( 1 ); | |
| } | |
| вернуть inString; | |
| } | |
| int * parseString (String msg) { | |
| static int a [ 2 ]; | |
| int commaIndex = msg. indexOf ( ' , ' ); | |
| a [ 0 ] = сообщение подстрока ( 0 , commaIndex). toInt (); | |
| a [ 1 ] = сообщение подстрока (commaIndex + 1 ). toInt (); | |
| вернуть ; | |
| } | |
| void writeValues ( int b []) { | |
| если (b [ 0 ] < 20 ), b [ 0 ] = 20 ; | |
| если (b [ 0 ]> 150 ), b [ 0 ] = 150 ; | |
| если (b [ 1 ] < 40 ) b [ 1 ] = 40 ; | |
| если (b [ 1 ]> 160 ), b [ 1 ] = 160 ; | |
| // s1.write (b [0]); | |
| s1. написать ( карта (b [ 0 ], 0 , 180 , 150 , 20 )); | |
| s2. написать ( карта (б [ 1 ], 0 , 180 , 40 , 160 )); | |
| Последовательный. печать (b [ 0 ]); | |
| Последовательный. печать ( " " ); | |
| Последовательный. println (b [ 1 ]); | |
| } | |
| void loop () { | |
| // Serial.print ("a"); | |
| if (Serial. available ()) { | |
| String входящий = readString (); | |
| int * angles = parseString (входящий); | |
| writeValues (углы); | |
| } | |
| } |
2) Блендер Контролер
| @@ -0,0 +1,55 @@ | ||
| # include < Servo.h > | ||
| Сервопривод s1, s2; | ||
| void setup () { | ||
| Последовательный. начало ( 115200 ); | ||
| Последовательный. flush (); | ||
| s1. прикрепить ( 9 ); | ||
| s2. прикрепить ( 8 ); | ||
| } | ||
| String readString () { | ||
| String inString = " " ; | ||
| char inChar; | ||
| while (Serial. available ()> 0 ) { | ||
| inChar = ( char ) Серийный. читать (); | ||
| inString + = inChar; | ||
| задержка ( 1 ); | ||
| } | ||
| вернуть inString; | ||
| } | ||
| int * parseString (String msg) { | ||
| static int a [ 2 ]; | ||
| int commaIndex = msg. indexOf ( ' , ' ); | ||
| a [ 0 ] = сообщение подстрока ( 0 , commaIndex). toInt (); | ||
| a [ 1 ] = сообщение подстрока (commaIndex + 1 ). toInt (); | ||
| вернуть ; | ||
| } | ||
| void writeValues ( int b []) { | ||
| если (b [ 0 ] < 20 ), b [ 0 ] = 20 ; | ||
| если (b [ 0 ]> 150 ), b [ 0 ] = 150 ; | ||
| если (b [ 1 ] < 40 ) b [ 1 ] = 40 ; | ||
| если (b [ 1 ]> 160 ), b [ 1 ] = 160 ; | ||
| // s1.write (b [0]); | ||
| s1. написать ( карта (b [ 0 ], 0 , 180 , 150 , 20 )); | ||
| s2. написать ( карта (б [ 1 ], 0 , 180 , 40 , 160 )); | ||
| Последовательный. печать (b [ 0 ]); | ||
| Последовательный. печать ( " " ); | ||
| Последовательный. println (b [ 1 ]); | ||
| } | ||
| void loop () { | ||
| // Serial.print ("a"); | ||
| if (Serial. available ()) { | ||
| String входящий = readString (); | ||
| int * angles = parseString (входящий); | ||
| writeValues (углы); | ||
| } | ||
| } |
| @@ -0,0 +1,55 @@ | ||
| импорт БПИ | ||
| импорт математики | ||
| время импорта | ||
| импорт SYS | ||
| импортный сериал | ||
| импорт глобус | ||
| port = ' ' .join (glob.glob ( " / dev / ttyUSB * " )) | ||
| ser = serial.Serial (порт, 115200 ) | ||
| print ( " подключено к: " + ser.portstr) | ||
| ob = bpy.data.objects [ ' Арматура ' ] | ||
| bpy.context.scene.objects.active = ob | ||
| bpy.ops.object.mode_set ( mode = ' POSE ' ) | ||
| смещение 1 = 30 | ||
| смещение2 = 140 | ||
| def get_local_orientation ( pose_bone ): | ||
| local_orientation = pose_bone.matrix_channel.to_euler () | ||
| если pose_bone.parent равен None : | ||
| вернуть local_orientation | ||
| еще : | ||
| x = local_orientation.x - pose_bone.parent.matrix_channel.to_euler (). x | ||
| y = local_orientation.y - pose_bone.parent.matrix_channel.to_euler (). y | ||
| z = local_orientation.z - pose_bone.parent.matrix_channel.to_euler (). z | ||
| возврат (x, y, z) | ||
| def sendAngles (): | ||
| bone1 = ob.pose.bones [ ' Link1IK ' ] | ||
| bone2 = ob.pose.bones [ ' Link2IK ' ] | ||
| angle1 = str ( round (math.degrees (get_local_orientation (bone1) [ 2 ]) + offset1)) # [0] = x, [1] = y, [2] = z | ||
| angle2 = str ( round (math.degrees (get_local_orientation (bone2) [ 2 ]) + offset2)) | ||
| печать ( " % s % s \ n " % (angle1, angle2)) | ||
| ser.write ((angle1 + ' , ' + angle2) .encode ( ' UTF-8 ' )) | ||
| def frameChange ( passScene ): | ||
| sendAngles () | ||
| bpy.app.handlers.frame_change_pre.append (frameChange) |
| <p align = "center"> | ||
| <img src = "Screenshot.png"> | ||
| </ Р> | ||
| В этом репо показано, как управлять роботом из блендера с помощью python. | ||
| Для запуска контроллера сначала загрузите код arduino на плату. Затем в файле блендера нажмите «Run Script», затем значок воспроизведения и, наконец, наведите курсор мыши на контрольную кость и нажмите клавишу «G». |
3)
| импорт БПИ | |
| импорт математики | |
| время импорта | |
| импорт SYS | |
| импортный сериал | |
| импорт глобус | |
| port = ' ' .join (glob.glob ( " / dev / ttyUSB * " )) | |
| ser = serial.Serial (порт, 115200 ) | |
| print ( " подключено к: " + ser.portstr) | |
| ob = bpy.data.objects [ ' Арматура ' ] | |
| bpy.context.scene.objects.active = ob | |
| bpy.ops.object.mode_set ( mode = ' POSE ' ) | |
| смещение 1 = 30 | |
| смещение2 = 140 | |
| def get_local_orientation ( pose_bone ): | |
| local_orientation = pose_bone.matrix_channel.to_euler () | |
| если pose_bone.parent равен None : | |
| вернуть local_orientation | |
| еще : | |
| x = local_orientation.x - pose_bone.parent.matrix_channel.to_euler (). x | |
| y = local_orientation.y - pose_bone.parent.matrix_channel.to_euler (). y | |
| z = local_orientation.z - pose_bone.parent.matrix_channel.to_euler (). z | |
| возврат (x, y, z) | |
| def sendAngles (): | |
| bone1 = ob.pose.bones [ ' Link1IK ' ] | |
| bone2 = ob.pose.bones [ ' Link2IK ' ] | |
| angle1 = str ( round (math.degrees (get_local_orientation (bone1) [ 2 ]) + offset1)) # [0] = x, [1] = y, [2] = z | |
| angle2 = str ( round (math.degrees (get_local_orientation (bone2) [ 2 ]) + offset2)) | |
| печать ( " % s % s \ n " % (angle1, angle2)) | |
| ser.write ((angle1 + ' , ' + angle2) .encode ( ' UTF-8 ' )) | |
| def frameChange ( passScene ): | |
| sendAngles () | |
| bpy.app.handlers.frame_change_pre.append (frameChange) |
4) Доктор
| { | |
| " image " : " Screenshot.png " , | |
| " tags " : [ " robotics " , " blender " , " python " , " servo " ] | |
| } |

Комментарии
Отправить комментарий