python控制arduino上的舵机转动1次

时间: 2023-08-23 16:03:40 浏览: 36
要通过Python控制Arduino上的舵机,可以使用PySerial库实现串口通信,并发送控制指令给Arduino执行。 以下是一个控制舵机旋转一次的Python程序范例: ```python import serial import time # 打开串口 ser = serial.Serial('/dev/ttyACM0', 9600) # 等待连接成功 time.sleep(2) # 控制舵机旋转 ser.write(b'servo 0\n') # 将舵机旋转到0度位置 time.sleep(1) # 等待1秒钟 ser.write(b'servo 180\n') # 将舵机旋转到180度位置 time.sleep(1) # 等待1秒钟 # 关闭串口 ser.close() ``` 在该程序中,我们通过串口发送了两个控制指令,分别是`servo 0`和`servo 180`,表示将舵机旋转到0度位置和180度位置。注意,在Arduino端需要编写对应的程序来解析这些指令并控制舵机运动。 在实际运行程序之前,需要先安装PySerial库。可以通过以下命令进行安装: ```shell pip install pyserial ``` 安装完成后,运行程序即可控制舵机旋转一次。
相关问题

python控制arduino上的舵机

要在Python中控制Arduino上的舵机,可以使用Python的`pyserial`库和Arduino的`Servo`库。以下是一个简单的示例代码: 在Arduino端,需要先安装`Servo`库,方法是在Arduino IDE中选择`工具`->`库管理器`,搜索`Servo`并安装。 ```arduino #include <Servo.h> Servo myservo; void setup() { myservo.attach(9); Serial.begin(9600); } void loop() { if (Serial.available() > 0) { int angle = Serial.parseInt(); myservo.write(angle); } } ``` 上述代码中,Arduino会监听串口,当串口接收到一个整型数值时,将该数值作为舵机的角度值,并通过`myservo.write()`函数控制舵机转动。 在Python端,需要使用`pyserial`库连接到Arduino串口,发送控制指令。以下是一个简单的示例代码: ```python import serial import time ser = serial.Serial('/dev/ttyACM0', 9600) # 根据实际情况修改串口名称 while True: angle = input('请输入舵机角度值:') ser.write(angle.encode()) # 将角度值转换为字节并发送到串口 time.sleep(1) # 延迟1秒 ``` 上述代码中,Python会等待用户输入一个整型数值,将该数值转换为字节并发送到Arduino串口,以控制舵机转动。注意,Python的`input()`函数返回的是字符串类型,需要使用`encode()`方法将其转换为字节类型。 在使用该代码时,需要将Arduino板子的电源线和地线连接到舵机的电源线和地线上,并将舵机信号线连接到Arduino的9号引脚上。

ubuntu用python控制arduino上的舵机

要在 Ubuntu 上使用 Python 控制 Arduino 上的舵机,你需要编写两个程序:一个是 Arduino 程序,用于接收来自计算机的指令并控制舵机;另一个是 Python 程序,用于向 Arduino 发送控制指令。 以下是 Arduino 程序示例,用于控制舵机转动: ```arduino #include <Servo.h> Servo myservo; int pos = 0; void setup() { myservo.attach(9); // 将舵机接口连接到数字引脚 9 Serial.begin(9600); // 开始串口通信,波特率为 9600 } void loop() { if (Serial.available() > 0) { pos = Serial.read(); // 读取串口数据 myservo.write(pos); // 控制舵机转动 } } ``` 在这个程序中,我们使用了 `Servo` 库来控制舵机的转动。我们将舵机接口连接到数字引脚 9,并使用串口通信来接收计算机发送的指令。在 `loop()` 函数中,我们不停地读取串口数据,如果有数据,就将数据作为舵机的角度值进行控制。 然后,我们可以使用 Python 编写程序来向 Arduino 发送控制指令,实现控制舵机转动。以下是 Python 程序示例: ```python import serial import time ser = serial.Serial('/dev/ttyACM0', 9600) # 打开串口,波特率为 9600 def set_angle(angle): ser.write(bytes([angle])) # 将角度值转换为字节并发送到串口 time.sleep(1) # 等待一秒钟,以确保舵机转到位 # 控制舵机转到 0 度 set_angle(0) # 控制舵机转到 90 度 set_angle(90) # 控制舵机转到 180 度 set_angle(180) ser.close() # 关闭串口 ``` 在这个程序中,我们使用了 Pyserial 库来打开串口,并定义了一个函数 `set_angle`,用于向串口发送舵机的角度值。最后,我们调用 `set_angle` 函数控制舵机转到不同的角度,并在程序结束时关闭串口。 需要注意的是,以上示例程序中的串口设备名 `/dev/ttyACM0` 可能会因为不同的系统和硬件而有所不同,你需要根据自己的实际情况进行修改。

相关推荐

### 回答1: 好的,这里提供一份简单的 Python 代码示例,可以用来控制5轴机械臂到指定角度和速度运动。这里我们假设下位机已经配置好了,并能够接收到来自上位机的指令。同时,我们还需要使用 pyserial 库来实现串口通信。 python import serial import time # 设置串口 ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=1) # 定义函数,用于发送指令到下位机 def send_command(command): ser.write(command.encode()) time.sleep(0.1) response = ser.readline().decode('utf-8').rstrip() return response # 控制机械臂移动到指定角度和速度 def move_arm(joint_angles, speeds): # 拼接指令字符串 command = f"MOVE {joint_angles[0]} {joint_angles[1]} {joint_angles[2]} {joint_angles[3]} {joint_angles[4]} " \ f"{speeds[0]} {speeds[1]} {speeds[2]} {speeds[3]} {speeds[4]}\n" # 发送指令并获取响应 response = send_command(command) return response # 示例:控制机械臂移动到指定角度和速度 joint_angles = [45, 90, 135, 180, 225] speeds = [50, 50, 50, 50, 50] response = move_arm(joint_angles, speeds) print(response) 在代码中,我们首先使用 serial 库来设置串口参数,然后定义了一个 send_command 函数,用于发送指令到下位机,并获取响应。接着,我们定义了一个 move_arm 函数,用于控制机械臂移动到指定角度和速度。最后,我们演示了如何调用 move_arm 函数来控制机械臂运动。 在下位机方面,我们需要编写一份 Arduino 代码来接收来自上位机的指令,并控制机械臂运动。这里提供一份简单的示例代码,可以根据需要进行修改。 c++ #include <Servo.h> // 设置舵机引脚 Servo servo1; Servo servo2; Servo servo3; Servo servo4; Servo servo5; // 设置舵机初始角度 int angle1 = 0; int angle2 = 0; int angle3 = 0; int angle4 = 0; int angle5 = 0; void setup() { // 初始化串口 Serial.begin(9600); // 设置舵机引脚 servo1.attach(2); servo2.attach(3); servo3.attach(4); servo4.attach(5); servo5.attach(6); // 移动舵机到初始角度 servo1.write(angle1); delay(50); servo2.write(angle2); delay(50); servo3.write(angle3); delay(50); servo4.write(angle4); delay(50); servo5.write(angle5); delay(50); } void loop() { // 等待接收指令 while (!Serial.available()) {} // 读取并解析指令 String command = Serial.readStringUntil('\n'); int joint_angles[5]; int speeds[5]; sscanf(command.c_str(), "MOVE %d %d %d %d %d %d %d %d %d %d", &joint_angles[0], &joint_angles[1], &joint_angles[2], &joint_angles[3], &joint_angles[4], &speeds[0], &speeds[1], &speeds[2], &speeds[3], &speeds[4]); // 控制机械臂移动到指定角度和速度 for (int i = 0; i < 5; i++) { if (joint_angles[i] != -1) { int current_angle = 0; switch (i) { case 0: current_angle = angle1; break; case 1: current_angle = angle2; break; case 2: current_angle = angle3; break; case 3: current_angle = angle4; break; case 4: current_angle = angle5; break; } int target_angle = joint_angles[i]; int speed = speeds[i]; int direction = (target_angle > current_angle) ? 1 : -1; for (int j = current_angle; j != target_angle; j += direction) { switch (i) { case 0: angle1 = j; servo1.write(j); break; case 1: angle2 = j; servo2.write(j); break; case 2: angle3 = j; servo3.write(j); break; case 3: angle4 = j; servo4.write(j); break; case 4: angle5 = j; servo5.write(j); break; } delay(speed); } } } // 发送响应 Serial.println("OK"); } 在代码中,我们首先使用 Servo 库来设置舵机引脚,然后使用 Serial 库来接收来自上位机的指令,并解析出需要移动到的角度和速度。接着,我们使用循环来控制每个舵机按照指定的速度移动到指定角度。最后,我们发送一个 "OK" 响应给上位机,表示机械臂已经移动到了指定位置。 需要注意的是,这里只是一个简单的示例代码,实际使用时需要根据具体的机械臂参数和控制方式进行调整。 ### 回答2: 下面是用300字回答的示例代码: 上位机端用Python编写的控制5轴机械臂运动的代码: python import serial def move_arm(angles, speeds): cmd = '<' for angle, speed in zip(angles, speeds): cmd += str(angle) + ',' + str(speed) + ',' cmd = cmd.rstrip(',') + '>' ser = serial.Serial('/dev/ttyUSB0', 9600) # 根据实际情况更改串口号和波特率 ser.write(cmd.encode()) ser.close() if __name__ == '__main__': angles = [90, 120, 45, 30, 60] # 五个关节的目标角度 speeds = [50, 60, 70, 80, 90] # 五个关节的速度 move_arm(angles, speeds) 下位机端用Arduino执行的代码: arduino #include <Servo.h> Servo servo1; Servo servo2; Servo servo3; Servo servo4; Servo servo5; void setup() { Serial.begin(9600); servo1.attach(2); // 依次连接到指定引脚 servo2.attach(3); servo3.attach(4); servo4.attach(5); servo5.attach(6); } void loop() { if (Serial.available() > 0) { String cmd = Serial.readStringUntil('>'); cmd.remove(0, 1); // 删除命令开头的'<'符号 cmd.trim(); // 删除命令末尾的'>'符号 int pos = cmd.indexOf(','); int angle = cmd.substring(0, pos).toInt(); cmd.remove(0, pos + 1); pos = cmd.indexOf(','); int speed = cmd.substring(0, pos).toInt(); servo1.write(angle); servo2.write(angle); servo3.write(angle); servo4.write(angle); servo5.write(angle); delay(speed); // 等待运动完成 } } 将上位机和下位机代码分别复制到相应的文件中,然后在上位机中设置五个关节的目标角度和速度,调用move_arm()函数,上位机会将指令通过串口发送给下位机执行。下位机接收到指令后,依次将五个舵机转动到目标角度,并等待指定的时间(用于控制速度)。这样,上位机就实现了通过Python控制5轴机械臂到指定角度和速度运动的功能。 ### 回答3: 上位机和下位机之间的通信可以通过串口进行。首先,需要在上位机中安装pyserial库来实现与Arduino的串口通信。以下是一个简单的示例代码。 python import serial def move_5_axis_arm(angles, speeds): # 设置与Arduino通信的串口号和波特率 ser = serial.Serial('COM3', 9600) # 发送控制指令给Arduino for i in range(5): cmd = "A{}{}{}".format(i+1, angles[i], speeds[i]) ser.write(cmd.encode()) # 等待机械臂运动完成 while ser.readline().decode().strip() != "Done": pass # 关闭串口连接 ser.close() # 示例:控制机械臂的五个关节分别到达90度,速度为100(仅为示例,具体数值需要根据实际情况修改) angles = [90, 90, 90, 90, 90] speeds = [100, 100, 100, 100, 100] move_5_axis_arm(angles, speeds) 在Arduino端,可以通过Serial对象接收上位机发送的控制指令,并控制机械臂按照指定角度和速度运动。以下是一个简单的示例代码。 c++ #include <Servo.h> Servo servo1, servo2, servo3, servo4, servo5; void setup() { // 设置串口通信波特率 Serial.begin(9600); // 将引脚与舵机对象关联 servo1.attach(2); servo2.attach(3); servo3.attach(4); servo4.attach(5); servo5.attach(6); // 将机械臂初始位置设定为0度 servo1.write(0); servo2.write(0); servo3.write(0); servo4.write(0); servo5.write(0); } void loop() { // 等待接收控制指令 if (Serial.available()) { String cmd = Serial.readStringUntil('\n'); // 解析控制指令 int servo_index = cmd.substring(1, 2).toInt(); int angle = cmd.substring(2, 5).toInt(); int speed = cmd.substring(5).toInt(); // 控制机械臂运动 switch (servo_index) { case 1: servo1.write(angle); break; case 2: servo2.write(angle); break; case 3: servo3.write(angle); break; case 4: servo4.write(angle); break; case 5: servo5.write(angle); break; } // 告知上位机运动完成 Serial.println("Done"); } } 通过上述代码,可以实现通过上位机的Python程序控制5轴机械臂到指定的角度和速度,并通过下位机的Arduino执行运动控制。请根据具体硬件配置和需求修改相应的串口号、波特率、舵机引脚以及角度/速度范围等参数。
以下是OpenMV向Arduino发送色块中心坐标的基本思路: 1. 在OpenMV上使用颜色追踪算法识别出目标色块,并计算出其中心坐标; 2. 将中心坐标通过串口发送给Arduino; 3. 在Arduino上接收中心坐标,并进行相应的控制操作。 具体实现步骤如下: 1. 在OpenMV上编写代码,使用颜色追踪算法识别出目标色块,并计算出其中心坐标。代码示例: python import sensor, image, time, pyb # 初始化串口 uart = pyb.UART(3, 9600) # 颜色追踪阈值 thresholds = [(30, 100, -5, 20, -5, 20)] # 初始化摄像头 sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time=2000) sensor.set_auto_gain(False) sensor.set_auto_whitebal(False) while True: # 获取图像 img = sensor.snapshot() # 执行颜色追踪 blobs = img.find_blobs(thresholds) if blobs: # 取第一个色块 blob = blobs[0] # 计算中心坐标 cx = blob.cx() cy = blob.cy() # 画出矩形框和十字线 img.draw_rectangle(blob.rect()) img.draw_cross(cx, cy) # 发送中心坐标 uart.write(str(cx).encode()) uart.write(b',') uart.write(str(cy).encode()) uart.write(b'\n') 2. 在Arduino上编写代码,接收中心坐标,并进行相应的控制操作。代码示例: c #include <Servo.h> // 初始化舵机 Servo servo; void setup() { // 初始化串口 Serial.begin(9600); // 连接舵机 servo.attach(9); } void loop() { if (Serial.available() > 0) { // 读取串口数据 String data = Serial.readStringUntil('\n'); // 分离中心坐标 int commaIndex = data.indexOf(','); int cx = data.substring(0, commaIndex).toInt(); int cy = data.substring(commaIndex + 1).toInt(); // 控制舵机 int angle = map(cx, 0, 320, 0, 180); servo.write(angle); } } 在上述代码中,我们使用了Arduino的Servo库控制舵机,根据中心坐标的x值来控制舵机的转动角度,使得色块保持在摄像头的中心位置。 注意,由于串口通信需要一定的时间,所以在OpenMV上发送中心坐标的频率需要适当控制,以免造成Arduino读取数据的延迟。
这是一个涉及到计算机视觉、嵌入式系统、机械控制的系统,需要涉及到多方面的知识和技能。下面我将为你提供一个大致的思路和代码框架,但需要你根据具体情况进行调整和完善。 1. 计算机视觉部分 OpenMV是一款嵌入式计算机视觉平台,可以通过Python编程实现图像处理和机器视觉应用。我们可以使用OpenMV来检测蔬菜并与Arduino通信控制机械臂抓取目标。 首先,我们需要训练一个分类器来识别茄子。可以使用机器学习算法(如支持向量机、随机森林等)来训练分类器,也可以使用预训练的模型(如OpenCV的Haar Cascade分类器)。这里以预训练的模型为例: python import sensor, image, time from pyb import UART # 初始化串口通信 uart = UART(3, 115200) # 初始化摄像头 sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time = 2000) # 加载Haar Cascade分类器 cascade = image.HaarCascade("cascade.xml") while(True): # 获取图像 img = sensor.snapshot() # 检测茄子 objects = img.find_features(cascade, threshold=0.5, scale_factor=1.5) # 判断是否检测到茄子 if objects: # 发送指令给Arduino控制机械臂抓取茄子 uart.write("grasp".encode()) 上述代码中,我们使用了OpenMV的Haar Cascade分类器来检测茄子,并且使用串口通信向Arduino发送指令控制机械臂抓取目标。 2. Arduino部分 Arduino Mega 2560是一款开源的微控制器板,可以通过C/C++编程实现各种控制任务。我们可以使用Arduino Mega 2560来控制六轴机械臂,并且接收OpenMV发送的指令进行抓取任务。 首先,我们需要连接Arduino与六轴机械臂,并且编写相应的控制程序。这里我们使用Servo库来控制舵机,可以根据具体情况进行调整。接着,我们需要初始化串口通信并且等待OpenMV发送指令: cpp #include <Servo.h> // 初始化舵机 Servo servo1; Servo servo2; Servo servo3; Servo servo4; Servo servo5; Servo servo6; // 初始化串口通信 void setup() { Serial.begin(115200); servo1.attach(2); servo2.attach(3); servo3.attach(4); servo4.attach(5); servo5.attach(6); servo6.attach(7); } // 等待指令并且执行抓取任务 void loop() { if (Serial.available() > 0) { String command = Serial.readString(); if (command == "grasp") { // 执行抓取任务 // ... } } } 上述代码中,我们初始化了6个舵机,并且等待串口通信接收指令。当接收到OpenMV发送的指令时,执行抓取任务。 3. 机械臂控制部分 机械臂的控制需要根据具体情况进行调整,这里提供一个简单的控制框架。我们可以根据机械臂的结构和动力学模型,计算出每个舵机的角度,并且通过PWM信号驱动舵机转动。这里以三轴机械臂为例: cpp // 机械臂长度 float l1 = 10.0; float l2 = 10.0; float l3 = 10.0; // 机械臂关节角度 float theta1 = 0.0; float theta2 = 0.0; float theta3 = 0.0; // 控制舵机角度 void set_servo_angle(int servo, float angle) { int pulse_width = map(angle, 0, 180, 1000, 2000); digitalWrite(servo, HIGH); delayMicroseconds(pulse_width); digitalWrite(servo, LOW); delayMicroseconds(20000 - pulse_width); } // 机械臂逆运动学计算 void inverse_kinematics(float x, float y, float z) { float d = sqrt(x * x + y * y); theta1 = atan2(y, x); theta3 = acos((d * d + z * z - l1 * l1 - l2 * l2 - l3 * l3) / (2 * l2 * l3)); theta2 = atan2(z, d) - atan2(l3 * sin(theta3), l2 + l3 * cos(theta3)); set_servo_angle(2, theta1 * 180 / PI); set_servo_angle(3, theta2 * 180 / PI); set_servo_angle(4, theta3 * 180 / PI); } // 执行抓取任务 void grasp() { // 计算目标位置 float x = 0.0; float y = 0.0; float z = 0.0; // 计算舵机角度 inverse_kinematics(x, y, z); // 控制舵机 // ... } 上述代码中,我们使用逆运动学计算出每个舵机的角度,并且通过PWM信号驱动舵机转动。需要根据具体情况进行调整和完善。 综上所述,这是一个涉及到多方面知识和技能的系统,需要根据具体情况进行调整和完善。上述代码仅供参考,需要根据实际情况进行修改和优化。

最新推荐

电力设备行业研究周报新能源盈利分化-11页.pdf.zip

电力及公用事业、电子设备与新能源类报告 文件类型:PDF 打开方式:直接解压,无需密码

python065在线自主评测系统

基于当下的在线试卷组装这一类的在线自主评测系统的发展现状,本次通过利用python技术来开发一款在线自主评测系统,通过该系统能够让教师实现在线的题库管理、试卷生成以及考试管理,并且学生用户也能够实现在线的考试以及考试成绩的查看工作。

电气设备行业周报年新型储能新增装机同比增长中国出口马来西亚全球首列氢能源智轨正式试跑-4页.pdf.zip

行业报告 文件类型:PDF格式 打开方式:直接解压,无需密码

浙大数模.zip

数学建模资源 欢迎下载

企业数字化转型数据治理之数据质量主数据元数据数据安全治理数据指标体现PPT资料(29份).zip

企业数字化转型数据治理之数据质量主数据元数据数据安全治理数据指标体现PPT资料(29份) ERP主数据与业务数据关系.pptx Informatica主数据管理建设方案74.ppt MDM+ESB解决方案V1.0.pptx Oracle-MDM主数据管理方案(28页).pptx Oracle_MDM基础架构解决方案.pptx XX药业主数据管理平台项目建议.pptx 中国移动NG2-BASS 3.5元数据管理v1.0.0.ppt 主数据管理系统建设方案.pptx 主数据项目业务方案(27页).pptx 企业主数据建设思路(15页).pptx 企业主数据管理系统建设方案51.ppt 元数据及数据质量介绍(1).pptx 元数据管理与数据质量监控概要 .ppt 地产主数据解决方案77.pptx 大型集团主数据管理系统建设规划方案.pptx 大数据安全规划总体方案.pptx 工信安全-数据质量评估体系构建与评估治理实践.pptx 数据安全治理方案.pptx 数据安全治理解决方案V4.1.pptx 数据治理之主数据管理技术方案详解.pptx 数据治理之数据指标体系(1).pptx 数据质量管控.pptx 数据质量管理(DQC).pptx 数据质量管理.ppt 物质分类与编码主数据管理.ppt 用友主数据管理解决方案.ppt 示例-SAP物料主数据详解.pptx 药业主数据管理平台建议书.pptx 财务主数据管理资产管理管理系-财务域(22页).ppt

安全文明监理实施细则_工程施工土建监理资料建筑监理工作规划方案报告_监理实施细则.ppt

安全文明监理实施细则_工程施工土建监理资料建筑监理工作规划方案报告_监理实施细则.ppt

"REGISTOR:SSD内部非结构化数据处理平台"

REGISTOR:SSD存储裴舒怡,杨静,杨青,罗德岛大学,深圳市大普微电子有限公司。公司本文介绍了一个用于在存储器内部进行规则表达的平台REGISTOR。Registor的主要思想是在存储大型数据集的存储中加速正则表达式(regex)搜索,消除I/O瓶颈问题。在闪存SSD内部设计并增强了一个用于regex搜索的特殊硬件引擎,该引擎在从NAND闪存到主机的数据传输期间动态处理数据为了使regex搜索的速度与现代SSD的内部总线速度相匹配,在Registor硬件中设计了一种深度流水线结构,该结构由文件语义提取器、匹配候选查找器、regex匹配单元(REMU)和结果组织器组成。此外,流水线的每个阶段使得可能使用最大等位性。为了使Registor易于被高级应用程序使用,我们在Linux中开发了一组API和库,允许Registor通过有效地将单独的数据块重组为文件来处理SSD中的文件Registor的工作原

typeerror: invalid argument(s) 'encoding' sent to create_engine(), using con

这个错误通常是由于使用了错误的参数或参数格式引起的。create_engine() 方法需要连接数据库时使用的参数,例如数据库类型、用户名、密码、主机等。 请检查你的代码,确保传递给 create_engine() 方法的参数是正确的,并且符合参数的格式要求。例如,如果你正在使用 MySQL 数据库,你需要传递正确的数据库类型、主机名、端口号、用户名、密码和数据库名称。以下是一个示例: ``` from sqlalchemy import create_engine engine = create_engine('mysql+pymysql://username:password@hos

数据库课程设计食品销售统计系统.doc

数据库课程设计食品销售统计系统.doc

海量3D模型的自适应传输

为了获得的目的图卢兹大学博士学位发布人:图卢兹国立理工学院(图卢兹INP)学科或专业:计算机与电信提交人和支持人:M. 托马斯·福吉奥尼2019年11月29日星期五标题:海量3D模型的自适应传输博士学校:图卢兹数学、计算机科学、电信(MITT)研究单位:图卢兹计算机科学研究所(IRIT)论文主任:M. 文森特·查维拉特M.阿克塞尔·卡里尔报告员:M. GWendal Simon,大西洋IMTSIDONIE CHRISTOPHE女士,国家地理研究所评审团成员:M. MAARTEN WIJNANTS,哈塞尔大学,校长M. AXEL CARLIER,图卢兹INP,成员M. GILLES GESQUIERE,里昂第二大学,成员Géraldine Morin女士,图卢兹INP,成员M. VINCENT CHARVILLAT,图卢兹INP,成员M. Wei Tsang Ooi,新加坡国立大学,研究员基于HTTP的动态自适应3D流媒体2019年11月29日星期五,图卢兹INP授予图卢兹大学博士学位,由ThomasForgione发表并答辩Gilles Gesquière�