虽然索尼toio Q宝机器人主要是为儿童教育娱乐开发的,但我认为它在工业等领域也有一定应用潜力。例如,工业领域经常会有某些平面在实际作业中持续震动,导致零件过疲劳、平台失去稳定等问题。而这样的平台往往位于机器内部,从外部很难直接观察。为此,我们可以使用Q宝机器人来持续监测平台的震动情况,当震动导致机器人位移过多,就让机器人移动到预定位置报警,提前避免潜在的风险。
具体操作中,我们需要为机器人预置一个周期间隔,每一个间隔结束后机器人检测自身位置是否发生变化,如果发生变化就移动到预定位置闪灯报警。代码如下:
import asyncio
from toio import *
green_cube_location = None
red_cube_location = None
red_cube_arrived = True
def id_notification_handler(payload: bytearray):
global green_cube_location
id_info = IdInformation.is_my_data(payload)
if isinstance(id_info, PositionId):
green_cube_location = id_info.center
def id_notification_handler_red(payload: bytearray):
global red_cube_location
id_info = IdInformation.is_my_data(payload)
if isinstance(id_info, PositionId):
red_cube_location = id_info.center
def motor_notification_handler(payload: bytearray):
global red_cube_arrived
motor_response = Motor.is_my_data(payload)
if isinstance(motor_response, ResponseMotorControlTarget):
print(motor_response)
red_cube_arrived = True
init_green_cube_location = green_cube_location.point
dev_list = await BLEScanner.scan(2)
assert len(dev_list) == 2
cube_1 = ToioCoreCube(dev_list[0].interface)
cube_2 = ToioCoreCube(dev_list[1].interface)
print("connect cube_1")
await cube_1.connect()
print("connect cube_2")
await cube_2.connect()
red = IndicatorParam(
duration_ms=0,
color=Color(r=255, g=0, b=0)
)
green = IndicatorParam(
duration_ms=0,
color=Color(r=0, g=255, b=0)
)
await cube_1.api.indicator.turn_on(green)
await cube_2.api.indicator.turn_on(green)
print("start")
await cube_1.api.id_information.register_notification_handler(id_notification_handler)
await cube_2.api.id_information.register_notification_handler(id_notification_handler_red)
await cube_2.api.motor.register_notification_handler(motor_notification_handler)
target1 = CubeLocation(point=Point(x=384, y=331), angle=95)
target2 = CubeLocation(point=Point(x=344, y=337), angle=94)
# 记录初始位置
init_green_cube_location = green_cube_location.point
init_red_cube_location = red_cube_location.point
print(init_green_cube_location)
print(red_cube_location)
# 检测坐标是否改变
while True:
if init_green_cube_location != green_cube_location.point or init_red_cube_location != red_cube_location.point:
tmp_green_cube_location = green_cube_location
print(green_cube_location)
print("位置变了")
# 变红
await cube_1.api.indicator.turn_on(red)
await cube_2.api.motor.motor_control_target(
timeout=5,
movement_type=MovementType.Linear,
speed=Speed(
max=100, speed_change_type=SpeedChangeType.AccelerationAndDeceleration
),
target=TargetPosition(
cube_location=target2,
rotation_option=RotationOption.AbsoluteOptimal,
),
)
await cube_1.api.motor.motor_control_target(
timeout=5,
movement_type=MovementType.Linear,
speed=Speed(
max=100, speed_change_type=SpeedChangeType.AccelerationAndDeceleration
),
target=TargetPosition(
cube_location=target1,
rotation_option=RotationOption.AbsoluteOptimal,
),
)
break
await asyncio.sleep(1)
await cube_1.api.indicator.turn_on(red)
await cube_2.api.indicator.turn_on(red)
await asyncio.sleep(10)
print("check end ")
await cube_2.api.motor.unregister_notification_handler(
motor_notification_handler
)
await cube_1.api.id_information.unregister_notification_handler(
id_notification_handler
)
await cube_2.api.id_information.unregister_notification_handler(
id_notification_handler_red
)
print("end")
await cube_1.disconnect()
await cube_2.disconnect()
我们可以在平台不同位置安放两个机器人,从而提高检测精度,同时避免单个机器人故障带来的检测失效问题。实际的检测效果示意如下:
检测工业平台震动1
检测工业平台震动2
可以看到,无论哪个机器人的位置发生移动,都会向另一个机器人发出通知,之后两个机器人一同移动到预定位置闪红灯报警。我们还可以增加更多机器人,即使在更大的平面上也能实现较为可靠的检测效果。
从本案例可以看出,Q宝机器人并非只能用于Q12教学用途,在其他领域也有待挖掘的应用潜力。未来,随着Q宝机器人的能力不断迭代,我们或许可以发现更多可以利用Q宝低成本实现的工业等场景的生产力用途。即便无法直接投入实际生产场景,Q宝机器人也可以用来快速搭建设备原型,为更成熟的产品设计提供参考。未来,希望更多开发者加入Q宝生态,将Q宝的潜能发挥到最大水平。