Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@wwj718
Created January 16, 2019 08:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wwj718/57d162c181f69a6e0b16a485d0e9595b to your computer and use it in GitHub Desktop.
Save wwj718/57d162c181f69a6e0b16a485d0e9595b to your computer and use it in GitHub Desktop.
'''
Vector:
https://developer.anki.com/vector/docs/getstarted.html
https://github.com/anki/vector-python-sdk/blob/master/examples/tutorials/02_drive_square.py
todo:
内置 anki_vector, 是否可行?
'''
import time
import threading
from scratch3_adapter import settings
from scratch3_adapter.core_extension import Extension
import sys
# pip3 install anki_vector --user
# python3 -m site --user-site -> user_site_path
user_site_path = "/Users/wuwenjie/Library/Python/3.6/lib/python/site-packages" # macOS
sys.path.append(user_site_path) # 根据系统不同,去寻找pip3的路径
import anki_vector
from anki_vector.util import degrees, distance_mm, speed_mmps
# todo 这里只是一个解释器,单一入口,传递源码
class VectorProxy:
def __init__(self, data, robot):
self.method = data.get("method")
self.params = data.get("params")
self.robot = robot
self.result = {}
def run(self):
'''
payload = {
"method": "echo",
"params": {"a":1,"b":2},
# "jsonrpc": "2.0",
# "id": 0,
}
'''
robot_match = {
# "vector/sensor": self.handle_sensor,
"vector/say": self.say_text,
"vector/play": self.play_anim,
"vector/drive_straight": self.drive_straight,
"vector/turn": self.turn,
}
# go on
handle = robot_match.get(self.method, None)
if handle:
handle()
self.result["state"] = "success"
else:
self.result["state"] = self.no_match_handle()
return self.result
def say_text(self):
# ? 按位置会不会更简单
self.robot.say_text(self.params.get("content"))
def play_anim(self):
# data : anim_name
self.robot.play_anim(name=self.params.get("name"))
def drive_straight(self):
# Drive forwards for 150 millimeters at 50 millimeters-per-second.
distance = int(self.params.get("distance_mm", 50))
speed = int(self.params.get("speed_mmps", 25))
self.robot.behavior.drive_straight(
distance_mm(distance), speed_mmps(speed))
def turn(self):
# Turn 90 degrees to the left.
# Note: To turn to the right, just use a negative number.
angle = int(self.params.get("angle", 90))
speed = int(self.params.get("speed", 45))
self.robot.behavior.turn_in_place(degrees(angle), speed=degrees(speed))
def handle_sensor(self):
result = {}
result["accelerometer"] = [
self.robot.accelerometer.x, self.robot.accelerometer.y,
self.robot.accelerometer.z
]
return result
def no_match_handle(self):
# 404
return "404 on match"
class VectorExtension(Extension):
def __init__(self):
name = type(self).__name__ # class name
super().__init__(name)
def run(self):
# 先启动vector
with anki_vector.Robot() as robot:
while self._running:
message = self.read() # json
self.logger.info("message:%s", str(message))
topic = message.get("topic")
data = message.get("data")
if data.get("method"):
vector_proxy = VectorProxy(data, robot)
result = vector_proxy.run()
self.logger.info(result)
export = VectorExtension
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment