
EyeNexus
Machine-to-Machine Urban Management & Security Solution
___________
Interactive Infrastructure & Autonomous Monitoring System
Solo project | 2023
Tools: TouchDesigner, QGIS, Houdini, Python, Visual Studio Code, Anaconda, Adobe Photoshop, Adobe After Effects, Eyeball Model and Device Crafting
Welcome to EyeNexus, my reimagination of urban systems for the future. The 3D map of Los Angeles from EyeNexus creates a new way for urban planning and traffic management. Then, I also make this real-time data from New York's Bike system into EyeNexus, showcasing a dynamic approach to urban mobility.
EyeNexus isn't just about managing traffic—it's a system designed to enhance efficiency, ensure safety, and promote sustainability within our cities. Join me in exploring a future where technology is seamlessly integrated into the urban fabric, empowering us to live in more intelligent, responsive environments.
欢迎来到 EyeNexus,这是我对未来城市系统的重新构想。 EyeNexus 的洛杉矶 3D 地图为城市规划和交通管理创造了一种新方式。 然后,我还将纽约自行车系统的实时数据放入 EyeNexus,展示了城市交通的动态方法。
EyeNexus 不仅仅用于管理交通,它还是一个旨在提高效率、确保安全并促进城市可持续发展的系统。 让我们一起探索未来,技术将无缝融入城市结构,使我们能够生活在更加智能、反应灵敏的环境中。
Los Angeles Transit Flow - interactive City Model for Optimized Daily Routing
洛杉矶交通流程 - 用于优化每日路线的交互式城市模型
New York City Commute Patterns - Real-Time Transportation Tracker - Bicycle Edition
纽约市通勤模式 - 实时交通跟踪 - 自行车版
EyeNexus: Streamlining City Life with Smart Devices
This is EyeNexus, my two-part invention designed to make city living better. The large Public EyeNexus device is like the city’s brain, helping manage traffic and keeping an eye on the environment. For people on the go, I've made a smaller EyeNexus that you can carry around to stay updated with traffic news, find the quickest routes, and get alerts about your surroundings. Together, these devices work to simplify your daily routine and connect you to the city in a smarter way.
EyeNexus:利用智能设备简化城市生活
这是 EyeNexus,我的发明分为两部分,旨在让城市生活更美好。 大型 Public EyeNexus 设备就像城市的大脑,帮助管理交通并关注环境。 对于忙碌的人们,我制作了一个较小的 EyeNexus,您可以随身携带它,以随时了解最新的交通新闻、找到最快的路线并获取有关周围环境的警报。 这些设备共同简化您的日常生活,并以更智能的方式将您与城市连接起来。
Public EyeNexus Device
Personal EyeNexus Device
It begins with…
We live in an era, where autonomous vehicles and advanced urban systems are not just concepts, but emerging realities. However, this advancement brings its own set of challenges, especially in urban transportation. The inspiration for EyeNexus struck when pondering the future of our city streets — a future teeming with driverless cars, flying vehicles, and multi-dimensional transit systems encompassing land, air, and sea.
Traditional traffic management methods, reliant on human interpretation and interaction, become inadequate in this rapidly evolving landscape. It became clear that the solution wasn't just in redesigning vehicles but in revolutionizing the way we manage and coordinate these autonomous entities. This realization gave birth to EyeNexus — a system that transcends the traditional, shifting from human-centric traffic signals to a more universal, machine-integrated network.
EyeNexus is a response to the need for an intelligent, efficient, and seamless traffic coordination system. A system where machines communicate with machines, creating a harmonious flow devoid of congestion and inefficiencies. The idea of using a cybereye, a simulated organ, emerged from the increasing possibilities in machine-to-machine interaction, aligning with a vision where technology assists not just in transport but in broader aspects like urban planning, environmental monitoring, and even social dynamics.
This project is a step towards a future where technology doesn’t just serve us; it understands and anticipates our needs, creating a smarter, safer, and more sustainable world.
它始于……
我们生活在这样一个时代,自动驾驶汽车和先进的城市系统不仅仅是概念,而是新兴的现实。 然而,这种进步也带来了一系列挑战,特别是在城市交通方面。 EyeNexus 的灵感来自于思考我们城市街道的未来——一个充满无人驾驶汽车、飞行车辆以及涵盖陆地、空中和海上的多维交通系统的未来。
传统的交通管理方法依赖于人类的解释和互动,在这个快速发展的环境中已经不够用了。 很明显,解决方案不仅在于重新设计车辆,还在于彻底改变我们管理和协调这些自主实体的方式。 这种认识催生了 EyeNexus,这是一个超越传统的系统,从以人为中心的交通信号转变为更通用的机器集成网络。
EyeNexus 是对智能、高效、无缝交通协调系统需求的回应。 机器与机器通信的系统,创造和谐的流程,避免拥塞和低效率。 使用网络眼(一种模拟器官)的想法源于机器与机器交互日益增加的可能性,符合这样一种愿景:技术不仅有助于交通,还有助于城市规划、环境监测甚至社会动态等更广泛的方面 。
这个项目是迈向一个更智能、更安全、更可持续世界的未来的一步,一个技术不仅仅是服务我们;它理解并预测我们的需求的未来。
The Necessity of Integration in Modern Urban Management
In today's world, where urban spaces are becoming increasingly complex and interconnected, the need for comprehensive management systems like EyeNexus is more pronounced than ever. Traditional methods of urban management are often siloed and reactive, leading to inefficiencies and missed opportunities for optimization. EyeNexus is necessary because it offers an integrated, proactive approach that leverages data and technology to enhance urban living. By facilitating machine-to-machine communication, it lays the groundwork for a smarter, data-driven approach to city management that is more in tune with the dynamic needs of modern society.EyeNexus represents a shift towards integrated, smart technology solutions.
现代城市管理一体化的必要性
在当今世界,城市空间变得越来越复杂和相互关联,对 EyeNexus 这样的综合管理系统的需求比以往任何时候都更加明显。 传统的城市管理方法往往是孤立的和被动的,导致效率低下并错失优化机会。 EyeNexus 是必要的,因为它提供了一种集成的、主动的方法,利用数据和技术来改善城市生活。 通过促进机器对机器的通信,它为更智能、数据驱动的城市管理方法奠定了基础,这种方法更符合现代社会的动态需求。EyeNexus 代表了向集成、智能技术解决方案的转变。
A Personal Vision for Tomorrow's Urban Ecosystem
In developing EyeNexus, I've envisioned a new urban system that not only differs from traditional models but also enhances the way we live and interact with our cities. It's a system born from the belief that technology should be an intuitive extension of our daily lives, not just a tool, but a part of us.
对未来城市生态系统的个人愿景
在开发 EyeNexus 的过程中,我设想了一个新的城市系统,它不仅不同于传统模型,而且还能改善我们的生活方式以及与城市互动的方式。 这个系统诞生于这样的信念:技术应该是我们日常生活的直观延伸,而不仅仅是一种工具,而是我们的一部分。
-
I see EyeNexus as an intimate extension of our own faculties, same to an artificial organ. My devices are crafted to work with you, enhancing your capabilities and providing a natural, intuitive interface with the mechanized world around us.
人机共生
我将EyeNexus视作我们自身能力的亲密延伸,它犹如一种人造器官。我的设备旨在与您协同工作,增强您的能力,并为我们与周遭机械化世界的互动提供一种自然而直观的接口。
-
Unlike traditional systems that respond passively, my design for EyeNexus is proactive. It doesn't wait for cues; it anticipates them, actively managing and adapting to the ever-changing urban environment in real-time.
主动交互
与被动响应的传统系统不同,我对 EyeNexus 的设计是主动的。 它不会等待提示; 它预见到了这些变化,实时主动管理和适应不断变化的城市环境。
-
Where big data solutions end with analysis, EyeNexus begins with action. I've built it to do more than just inform—it interacts, it decides, it guides, fully integrating decision-making into the urban experience.
超越数据分析
大数据解决方案以分析结束,而 EyeNexus 以行动开始。 我构建它的目的不仅仅是提供信息,它还可以交互、决策、指导,将决策完全融入城市体验中。
-
My approach with EyeNexus breaks down silos, offering a multidimensional system that spans various aspects of city life. It's not just about traffic; it's about creating a harmonious urban ecosystem that resonates with every facet of our daily routines.
多维应用
EyeNexus 方法打破了孤岛,提供了一个涵盖城市生活各个方面的多维系统。 这不仅仅是交通问题; 这是为了创建一个和谐的城市生态系统,与我们日常生活的各个方面产生共鸣。
-
I believe in a future where technology is an integral part of us—helping us live, breathe, and make decisions. EyeNexus is my step towards that future, where machines are as much a part of us as any artificial organ, perfectly in sync with our needs and actions.
机器作为自我的延伸
在未来,技术将成为我们不可或缺的一部分——帮助我们生活、呼吸和做出决定。 EyeNexus 迈向未来的一步,机器就像任何人造器官一样成为我们的一部分,与我们的需求和行动完美同步。
LA 3D Map
LA 3D Map
Design Choice: LA 3D Map
In crafting the 3D Map of Los Angeles for EyeNexus, I've transformed urban complexity into a navigable digital framework. This model serves a dual purpose: it's a detailed visualization tool for city planners and a functional representation for the EyeNexus system, demonstrating our philosophy of integrating sophisticated technology into the urban fabric. It epitomizes the project's core thesis: harmonizing the mechanical and the organic within our cities.
LA 3D map设计选择
在创造洛杉矶的3D地图时,我将城市的复杂性转化为一个可导航的数字框架。该模型具有双重用途:它不仅是一个详细的城市规划可视化工具,也是EyeNexus系统的一个功能性展现,体现了我们将先进技术整合入城市结构的理念。它象征了项目的核心论点:在我们的城市中,将机械性与有机性和谐地统一起来。
Working Flow
Houdini Node Tree
More working processes
NY Real-Time Transportation Tracker
NY Real-Time Transportation Tracker
Design Choice: NY Real-Time Data Monitor Introduction
The NY Real-Time Data Monitor is a direct application of EyeNexus, designed to enhance urban mobility by tracking CitiBikes in real time (here i choose bike data as a example) . It provides a dynamic view of CitiBike usage, illustrating how real-time data and smart interfaces can enhance the efficiency of city transportation systems.This system embodies my project’s thesis – leveraging live data and interactive technology to streamline urban transportation into a synchronized and efficient network.
设计选择:纽约实时数据检测
NY Real-Time Data Monitor是EyeNexus的直接应用,旨在通过实时跟踪CitiBikes来增强城市流动性(这里我选择自行车数据作为示例)。 它提供了 CitiBike 使用情况的动态视图,说明实时数据和智能界面如何提高城市交通系统的效率。该系统体现了我的项目论点——利用实时数据和交互技术将城市交通简化为同步高效的网络 。
Working Flow
Python Script
Main Python Script: Real-Time Bike Station Monitor
Retrieve and process real-time data from the CitiBike API.
Analyze station status and calculate the availability of bikes and docks.
Identify changes in bike numbers to track usage patterns.
Communicate updates to TouchDesigner for live visualization.
Operate continuously, refreshing data every five seconds to ensure accuracy.
主要 Python 脚本:实时自行车站监控
从 CitiBike API 检索并处理实时数据。
分析站点状态并计算自行车和码头的可用性。
识别自行车数量的变化以跟踪使用模式。
将更新传达给 TouchDesigner 以实现实时可视化。
连续运行,每五秒刷新一次数据,以确保准确性。
-
import pandas as pd
import requests
import time
import uuid
from pythonosc import udp_client
# Utility functions
def clamp(x, a, b):
return max(a, min(x, b))
def map(x, a, b, c=0, d=1):
y = c + (x-a) / (b-a) * (d-c)
return clamp(y, c, d)
def get_station_data():
"""Fetch data from a URL and save it in a pandas DataFrame."""
response = requests.get("https://gbfs.lyft.com/gbfs/2.3/bkn/en/station_information.json")
response.raise_for_status()
json_data = response.json()
if "data" in json_data and "stations" in json_data["data"]:
stations = json_data["data"]["stations"]
else:
print("Expected data structure not found in the API response.")
return None
df = pd.DataFrame(stations)
df = df[['station_id', 'name', 'lat', 'lon', 'capacity']]
minlat, maxlat, minlon, maxlon = min(df['lat']), max(df['lat']), min(df['lon']), max(df['lon'])
df['x'] = df['lat'].apply(lambda row: map(row, minlat, maxlat))
df['y'] = df['lon'].apply(lambda row: map(row, minlon, maxlon))
return df.set_index('station_id')
def get_station_status(process_data=True):
response = requests.get("https://gbfs.lyft.com/gbfs/2.3/bkn/en/station_status.json")
response.raise_for_status()
json_data = response.json()
if "data" in json_data and "stations" in json_data["data"]:
stations = json_data["data"]["stations"]
else:
print("Expected data structure not found in the API response.")
return None
df = pd.DataFrame(stations)
if process_data:
df['station_status'] = df['is_installed'].apply(lambda x: "Installed" if x == 1 else "Not Installed")
df['legacy_id'] = df['station_id']
df = df[['station_id', 'num_bikes_available', 'num_ebikes_available', 'num_docks_available', 'station_status', 'legacy_id']]
return df.set_index('station_id')
def get_bike_changes(station_info_df, old_data=None):
changes = []
updated_data = get_station_status()
if old_data is None:
return updated_data, changes
udf = updated_data
odf = old_data
for station_id in odf.index:
if station_id not in udf.index:
continue
if udf.loc[station_id, 'num_bikes_available'] != odf.loc[station_id, 'num_bikes_available']:
changes.append(station_id)
changes_df = pd.DataFrame(index=changes)
changes_df = changes_df.join(station_info_df, how='left')
if changes:
changes_df['gain_loss'] = udf.loc[changes, 'num_bikes_available'] - odf.loc[changes, 'num_bikes_available']
else:
changes_df['gain_loss'] = []
return updated_data, changes_df[['name', 'x', 'y', 'gain_loss']]
# Main program
station_data = get_station_data()
if station_data is not None:
print(station_data.head())
station_status = get_station_status()
if station_status is not None:
print(station_status.head())
old_data = station_status # Assuming you want to use the first fetched data as the old data
updated_data, changes = get_bike_changes(station_data, old_data)
if len(changes) > 0:
print(changes)
else:
print("No changes detected.")
### main programe ###
# initialize data
# save station location to csv
# then, every 5 seconds
# call api for updated station status and record changes
# send all changes to touchdesigner via OSC
#initalize
delay = 5 #five seconds is the refresh thime of the API
station_locs_file_path = '../data/all_station_normalized_locations.csv'
osc_address = '127.0.0.1' #localhost
osc_port = 9999 #whatever port you want
#create a UDP client
client = udp_client.SimpleUDPClient(osc_address, osc_port)
#get station data and export all stations to csv
station_data = get_station_data()
station_data_export = station_data[['x' , 'y']]
station_data_export.to_csv(station_locs_file_path)
#setup realtime comparison
old_data, _ = get_bike_changes(station_data)
print('successfully initialized')
starttime = time.time()
iteration = 0
while True: #infinite loop
update_data, changes = get_bike_changes(station_data, old_data)
old_data = updated_data #override old data for next time step
for chg in changes.values:
client.send_message(f"/event_{uuid.uuid4()}", chg)
print(f'running: {iteration} elapsed, change count: {changes.shape[0]}')
iteration += 1
time.sleep(delay - ((time.time() - starttime) % delay))
Jupyter Notebook: Data Analysis Sandbox
A step-by-step approach to fetching and understanding CitiBike system data.
Interactive manipulation and mapping of geospatial information.
The extraction of key data points for further analysis.
Quick iteration and prototyping of data processing functions.
Jupyter Notebook:数据分析
获取和理解 CitiBike 系统数据的分步方法。
地理空间信息的交互式操作和绘图。
提取关键数据点以进行进一步分析。
数据处理功能的快速迭代和原型设计。
-
import pandas as pd
import requests
# Utility functions
def clamp(x, a, b):
return max(a, min(x, b))
def map(x, a, b, c=0, d=1):
y = c + (x-a) / (b-a) * (d-c)
return clamp(y, c, d)
# functions to grap all station data
def clamp(x, a, b):
return max(a, min(x, b))
def map(x, a, b, c=0, d=1):
y = c + (x-a) / (b-a) * (d-c)
return clamp(y, c, d)
def get_station_data():
"""Fetch data from a URL and save it in a pandas DataFrame."""
# Send a GET request to the URL
response = requests.get("https://gbfs.lyft.com/gbfs/2.3/bkn/en/station_information.json")
# Raise an exception for HTTP errors
response.raise_for_status()
# Parse the JSON data from the response
json_data = response.json()
# Check if "data" and "stations" keys exist in the response
if "data" in json_data and "stations" in json_data["data"]:
stations = json_data["data"]["stations"]
else:
print("Expected data structure not found in the API response.")
return None
# Convert the list of stations into a pandas DataFrame
df = pd.DataFrame(stations)
# Print the columns to inspect what's available
print("Available columns:", df.columns)
# Select relevant columns
df = df[['station_id','name', 'lat', 'lon', 'capacity']]
minlat = min(df['lat'])
maxlat = max(df['lat'])
minlon = min(df['lon'])
maxlon = max(df['lon'])
df = df.assign(x=df.apply(lambda row: map(row['lat'], minlat, maxlat), axis=1))
df = df.assign(y=df.apply(lambda row: map(row['lon'], minlon, maxlon), axis=1))
return df.set_index('station_id')
df = get_station_data()
if df is not None:
print(df.head()) # Displaying the first few rows for clarity
df = get_station_data()
df
export_xy = df[['x', 'y']]
export_xy.to_csv('../data/all_station_normalized_locations.csv')
# Get real-time update data for ride starts and stops
def get_station_status(process_data=True):
"""Fetch data from a URL and save it in a pandas DataFrame."""
# Send a GET request to the URL
response = requests.get("https://gbfs.lyft.com/gbfs/2.3/bkn/en/station_status.json")
# Raise an exception for HTTP errors
response.raise_for_status()
# Parse the JSON data from the response
json_data = response.json()
# Check if "data" and "stations" keys exist in the response
if "data" in json_data and "stations" in json_data["data"]:
stations = json_data["data"]["stations"]
else:
print("Expected data structure not found in the API response.")
return None
# Convert the list of stations into a pandas DataFrame
df = pd.DataFrame(stations)
if process_data:
# Print the columns to inspect what's available
print("Available columns:", df.columns)
# Adjusting the columns based on availability and processing
df['station_status'] = df['is_installed'].apply(lambda x: "Installed" if x == 1 else "Not Installed")
df['legacy_id'] = df['station_id']
# Keeping only the columns you want to view
df = df[['station_id', 'num_bikes_available', 'num_ebikes_available', 'num_docks_available', 'station_status', 'legacy_id']]
return df.set_index('station_id')
# By default, data processing is turned on
df = get_station_status()
if df is not None:
print(df.head()) # Displaying the first few rows for clarity
def get_bike_changes(station_info_df, old_data=None):
changes = []
updated_data = get_station_status()
# Safety check
if 'station_id' not in updated_data.columns:
print("Error: station_id column not found in updated_data")
return updated_data, pd.DataFrame()
if old_data is None or 'station_id' not in old_data.columns:
return updated_data, changes
udf = updated_data.set_index('station_id')
odf = old_data.set_index('station_id')
for station_id in odf.index:
if station_id not in udf.index:
continue # This station wasn't in the updated data; skip it.
if udf.loc[station_id, 'num_bikes_available'] != odf.loc[station_id, 'num_bikes_available']:
changes.append(station_id)
changes_df = pd.DataFrame(index=changes)
changes_df = changes_df.join(station_info_df, how='left')
# Assuming gain_loss is the difference in num_bikes_available between old and updated
if changes: # Only compute if there are changes
changes_df['gain_loss'] = udf.loc[changes, 'num_bikes_available'] - odf.loc[changes, 'num_bikes_available']
else:
changes_df['gain_loss'] = []
return updated_data, changes_df[['name', 'x', 'y', 'gain_loss']]
station_data = get_station_data()
old, _ = get_bike_changes(station_data)
old.head()
updated, changes = get_bike_changes(station_data, old)
changes
from pythonosc import udp_client
#create a UDP client
client = udp_client.SimpleUDPClient("127.0.0.1", 9999)
client.send_message("/event", [3,5])
More working processes
EyeNexus Device
EyeNexus Device
Artificial organ
Design Choice: Eyeball Structure
The design choice to use an eyeball structure for the EyeNexus devices is deeply rooted in the philosophy of creating a harmonious blend between humans and the increasingly mechanized world around us. The eye, a complex organ capable of interpreting vast amounts of information instantaneously, serves as an ideal metaphor for the capabilities we wish to embed within our urban environments. By emulating the form and function of an eye, these devices offer a natural extension of human control into the realm of machine-to-machine interactions, where the wearer can connect with and guide the surrounding technological ecosystem.
设计选择:眼球结构
眼球结构 EyeNexus 设备选择使用眼球结构的设计理念在于人类与我们周围日益机械化的世界之间创造和谐融合的理念。 眼睛是一种能够即时解读大量信息的复杂器官,它是我们希望嵌入城市环境的能力的理想隐喻。 通过模拟眼睛的形式和功能,这些设备将人类控制自然延伸到机器对机器交互领域,佩戴者可以连接并引导周围的技术生态系统。
Working processes
Future Vision for EyeNexus
-
I aim to transcend the boundaries of urban transit. EyeNexus has the potential to revolutionize fields such as environmental monitoring, where it could track pollution levels, and public health, where it could provide real-time updates on health hazards or resources. These applications could dramatically improve not just convenience but also the well-being of city dwellers.
-
EyeNexus is at the forefront of transforming urban traffic management. Designed for a world where driverless and flying vehicles are the norm, this system moves beyond conventional signaling to a network that coordinates multidimensional transportation. It's about smarter traffic flow, where my devices work in unison to reduce congestion and adapt traffic patterns in real time.
-
The potential of human-machine interaction through EyeNexus is immense. Inspired by the concept of artificial organs, I envision a future where my devices act as extensions of human capabilities, processing environmental data to aid decision-making in real-time. This could range from guiding visually impaired individuals through busy streets to providing instantaneous translations for tourists exploring the city.
-
Future developments will focus on expanding machine-to-machine communication networks. EyeNexus could be the core of a city-wide system where various devices, from streetlights to autonomous vehicles, communicate to create a self-regulating urban environment. This level of interconnectivity could revolutionize city management, energy consumption, and even emergency response protocols.
More areas to use EyeNexus
-
The scope of EyeNexus extends to public safety and emergency response. In critical situations, rapid and reliable communication is key. My system can direct emergency vehicles through the quickest routes, manage crowd control during events, and ensure that first responders are synced with the latest urban conditions, potentially saving lives.
-
In the realm of environmental stewardship, EyeNexus serves as a vigilant guardian. By deploying these devices in forest and farmland areas, we can monitor ecological health and respond to changes with precision, ensuring the protection and sustainability of our natural resources.
-
EyeNexus also steps into the domain of public safety and information security. By facilitating secure, machine-to-machine communications, it's equipped to safeguard sensitive data, providing a new layer of integrity in areas ranging from financial transactions to personal data protection.
-
Furthermore, EyeNexus can revolutionize the way we interact with social media and public communication networks. It offers a platform for gathering unbiased, real-time public sentiment and behavior, crucial for shaping social media strategies and public policies.