10/27/2019

Управление манипулятором Блендер Питон

Этот скрипт на python позволяет в реальном времени управлять роботизированной рукой в ​​Blender. Он работает, считывая углы обратной кинематики из якоря руки и отправляя их через последовательный порт в arduino, управляющий физической рукой.


Ссылка https://github.com/alvaroferran/BlenderController
http://www.alvaroferran.com/projects/blender-controller



Он был использован для управления M1R0 и Thor

Проект был упрощен, чтобы предоставить простой пример того, как получить данные из 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) Блендер Контролер

Сервопривод 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 (углы);
}
} 
-------------




импорт БПИ
импорт математики
время импорта

импорт 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">
</ Р>
.







Для запуска контроллера сначала загрузите код arduino на  плату.

импорт БПИ

В этом репо показано, как управлять роботом из блендера с помощью python. Для запуска контроллера сначала загрузите код arduino на плату. Затем в файле блендера нажмите «Run Script», затем значок воспроизведения и, наконец, наведите курсор мыши на контрольную кость и нажмите клавишу «G»

импорт математики
время импорта
импорт 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 " ]
}

Комментариев нет:

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