Система визуализации в реальном времени для мобильной робототехники: потоковая передача H.264 с низкой задержкой
RAiV был разработан таким образом, чтобы быть удобным для разработчиков. Вероятно, самая простая в использовании функция RAiV - потоковая передача по стандарту H.264. RAiV включает в себя аппаратный кодировщик H.264. Кроме того, для обеспечения низкой задержки и гибкости при передаче данных используется протокол WebSocket. Здесь мы покажем, как вы можете управлять потоком H.264.
Потоковая передача H264 в 22 строках
Существует только одна функция для вызова setEncoderStatus() для управления потоком H264 RAiV. Остальная часть процесса выполняется незаметно.
Вы можете найти этот пример в нашем репозитории на Github со всеми необходимыми модулями. Пожалуйста, скачайте пример кода из репозитория github и загрузите его в RAiV через веб-интерфейс.
# For command listener
import qCU_Net
# For H.264 streamer
import qCU_Stream
def main():
# Start TCP server for listening on streaming commands
qCU_Net.start_tcp_server(host='192.168.10.55', port=12345, json_handler=enc_json_handler)
# Incomming message payload parser
def enc_json_handler(client_socket, json_payload, client_address):
# Check live streaming request
if isinstance(json_payload, dict):
if 'live_isStart' in json_payload and 'live_isStereo' in json_payload:
isStart = json_payload['live_isStart']
isStereo = json_payload['live_isStereo']
print(f"Live setting start: {isStart} stereo: {isStereo}")
qCU_Stream.setEncoderStatus(isStart, isStereo)
if __name__ == "__main__":
main()
Живое действие
Теперь на ПК запустите код из нашего репозитория на Github, чтобы удаленно управлять потоковой передачей H.264
Потоковая передача в формате H264 с автоматическим увеличением экспозиции
Автоматическая регулировка экспозиции и усиления немного сложнее, чем потоковая передача в формате H.264. Поскольку RAiV можно использовать в самых разных ситуациях, мы оставили алгоритм регулировки усиления экспозиции на усмотрение пользователей. Таким образом, пользователи могут выбрать или реализовать наиболее подходящий алгоритм для своих вариантов использования.
Вы можете найти этот пример в нашем репозитории на Github со всеми необходимыми модулями. Пожалуйста, скачайте пример кода из репозитория github и загрузите его в RAiV через веб-интерфейс.
# For command listener
import qCU_Net
# For H.264 streamer
import qCU_Stream
# For camera control
from qCU_CCtrl import qCU_CCtrl
# For accessing data pipeline
from qCU_Data import qCUData
# For calculating exposure and gain values
from autoExpoGain import AutoExposureGain
# For image colorspace and scale modification
import cv2
def get_latest_frame():
if gQCUData is None:
raise RuntimeError("Data interface was not initialized")
# Get current frame
frame = gQCUData.getDataFrame()
if frame is None:
return None
# Convert right image from RGB to Grayscale
gray_frame = cv2.cvtColor(frame[1], cv2.COLOR_RGB2GRAY)
# Resize the grayscale image to FRAME_WIDTH and FRAME_HEIGHT//2
[monoWidth, monoHeight] = gray_frame.shape
resized_gray_frame = cv2.resize(gray_frame, (monoWidth, monoHeight//2))
return resized_gray_frame
def enc_json_handler(client_socket, json_payload, client_address):
# Check live streaming request
if isinstance(json_payload, dict):
if 'live_isStart' in json_payload and 'live_isStereo' in json_payload:
isStart = json_payload['live_isStart']
isStereo = json_payload['live_isStereo']
print(f"Live setting start: {isStart} stereo: {isStereo}")
qCU_Stream.setEncoderStatus(isStart, isStereo)
# Check camera control parameter request
if isinstance(json_payload, dict):
if 'get_camCtrl' in json_payload:
# Initialize the camera control object
cameraCtrl = qCU_CCtrl()
# Get camera control parameters
expo, gain, ret_code = cameraCtrl.get_expo_gain()
print(f"{expo} {gain} {ret_code}")
payload = {
"getCCtrl_expo": expo,
"getCCtrl_gain": gain
}
# Send camera control parameters to client
qCU_Net.send_response_to_client(client_socket, payload)
# Delete the camera control object
del cameraCtrl
# Check camera control parameter request
if isinstance(json_payload, dict):
if 'set_camCtrl' in json_payload:
curExpo = json_payload['expo']
curGain = json_payload['gain']
# Initialize the camera control object
cameraCtrl = qCU_CCtrl()
# Get camera control parameters
ret_code = cameraCtrl.set_expo_gain(curExpo, curGain)
print(f"{curExpo} {curGain} {ret_code}")
payload = {
"set_camCtrl_status": ret_code
}
# Send camera control parameters to client
qCU_Net.send_response_to_client(client_socket, payload)
# Delete the camera control object
del cameraCtrl
# Check camera control parameter request
if isinstance(json_payload, dict):
if 'auto_camCtrl' in json_payload:
isAutoCamCtrl = json_payload['auto_camCtrl']
autoPeriodMs = json_payload.get('auto_period_ms')
if isAutoCamCtrl == 1:
# Start
gAutoEG.start(data_func=get_latest_frame, interval_ms=autoPeriodMs)
else:
# Stop
gAutoEG.stop()
def main():
# Declara global variables
global gQCUData
global gAutoEG
# Create the data interface
gQCUData = qCUData()
if not gQCUData.init():
print("Failed to initialize shared memory")
return
# Initialize auto exposure gain with camera control parameters
tmpCCtrl = qCU_CCtrl()
camCtrlRanges = tmpCCtrl.get_cam_ctrl_ranges()
print(f"Camera control ranges: {camCtrlRanges}")
del tmpCCtrl
#
gAutoEG = AutoExposureGain(cctrl_ranges=camCtrlRanges, target_brightness=128, tolerance=10, adjustment_factor=0.5)
qCU_Net.start_tcp_server(host='192.168.10.55', port=12345, json_handler=enc_json_handler)
if __name__ == "__main__":
main()
Живое действие
Теперь на ПК запустите код из нашего репозитория на Github, чтобы управлять потоком H.264 с автоматической экспозицией и усилением
Что дальше?
Проверьте наш Python SDK
RAiV Python SDKПроверьте наш Репозиторий На Github Для Получения Примеров Кодов
Наш Репозиторий на Github