feat : add touch ui

This commit is contained in:
lgv 2026-06-17 09:36:26 +08:00
parent cf033e421b
commit 1a674188ee
277 changed files with 6808 additions and 1141 deletions

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/generated" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/.venv" />
</content>
<orderEntry type="jdk" jdkName="cmvr-base" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.8 (grpc_client)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="cmvr-base" project-jdk-type="Python SDK" />
</project>

View File

@ -0,0 +1,103 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="1eaf2261-98f5-4c90-86fc-e43e40e92567" name="Changes" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="EmbeddingIndexingInfo">
<option name="cachedIndexableFilesCount" value="164" />
<option name="fileBasedEmbeddingIndicesEnabled" value="true" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="McpProjectServerCommands">
<commands />
<urls />
</component>
<component name="ProjectColorInfo"><![CDATA[{
"customColor": "",
"associatedIndex": 3
}]]></component>
<component name="ProjectId" id="3B34aWKp18Cb5vqYU1D23d1hPn9" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"Python.generate_apriltags_border.executor": "Run",
"RunOnceActivity.MCP Project settings loaded": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
"RunOnceActivity.git.unshallow": "true",
"com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true",
"git-widget-placeholder": "master",
"junie.onboarding.icon.badge.shown": "true",
"settings.editor.selected.configurable": "com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable",
"to.speed.mode.migration.done": "true"
}
}]]></component>
<component name="RunManager">
<configuration name="generate_apriltags_border" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="grpc_client" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="SDK_NAME" value="cmvr-base" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/scripts" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="RUN_TOOL" value="" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/scripts/generate_apriltags_border.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="Python.generate_apriltags_border" />
</list>
</recent_temporary>
</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-python-sdk-4762d8aabb82-6d6dccd035ac-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-253.30387.173" />
</set>
</attachedChunks>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="1eaf2261-98f5-4c90-86fc-e43e40e92567" name="Changes" comment="" />
<created>1773704484327</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1773704484327</updated>
</task>
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
</project>

View File

@ -0,0 +1,247 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="14e52ab9-de95-493e-8d51-2bc74f57bef2" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/clients/base_client.py" beforeDir="false" afterPath="$PROJECT_DIR$/clients/base_client.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/clients/gui_camera_client..py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/clients/joint_states.csv" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/clients/press_client.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/biohead_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/biohead_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/biohead_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/biohead_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/biohead_service_pb2_grpc.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/biohead_service_pb2_grpc.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/camera_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/camera_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/camera_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/camera_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/common_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/common_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/dexhand_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/dexhand_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/dexhand_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/dexhand_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/hlc_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/hlc_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/hlc_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/hlc_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/humanoid_robot_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/humanoid_robot_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/humanoid_robot_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/humanoid_robot_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/humanoid_robot_service_pb2_grpc.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/humanoid_robot_service_pb2_grpc.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/microphone_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/microphone_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/microphone_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/microphone_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/speaker_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/speaker_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/speaker_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/speaker_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/system_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/system_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/system_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/system_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/system_service_pb2_grpc.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/system_service_pb2_grpc.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/test_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/test_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/msgs/can_card_parameter_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/msgs/can_card_parameter_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/msgs/canopen_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/msgs/canopen_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/msgs/error_code_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/msgs/error_code_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/msgs/geometry_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/msgs/geometry_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/msgs/motor_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/msgs/motor_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/msgs/robot_detail_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/msgs/robot_detail_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/biohead_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/biohead_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/camera_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/camera_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/common.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/dexhand_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/dexhand_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/hlc_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/hlc_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/humanoid_robot_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/humanoid_robot_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/microphone_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/microphone_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/speaker_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/speaker_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/system_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/system_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/test_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/msgs/can_card_parameter.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/msgs/canopen.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/msgs/error_code.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/msgs/geometry.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/msgs/motor.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/msgs/robot_detail.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/requirements.txt" beforeDir="false" afterPath="$PROJECT_DIR$/requirements.txt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/scripts/apriltags_border_20x15cm_A4.pdf" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/scripts/generate_apriltag_single.py" beforeDir="false" afterPath="$PROJECT_DIR$/scripts/generate_apriltag_single.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/scripts/generate_apriltags_border.py" beforeDir="false" afterPath="$PROJECT_DIR$/scripts/generate_apriltags_border.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ui/app.py" beforeDir="false" afterPath="$PROJECT_DIR$/ui/app.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="EmbeddingIndexingInfo">
<option name="cachedIndexableFilesCount" value="390" />
<option name="fileBasedEmbeddingIndicesEnabled" value="true" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="McpProjectServerCommands">
<commands />
<urls />
</component>
<component name="ProjectColorInfo">{
&quot;customColor&quot;: &quot;&quot;,
&quot;associatedIndex&quot;: 3
}</component>
<component name="ProjectId" id="3B49fOihNkRbSSSqQJdMjIqYFFv" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"Python.app.executor": "Run",
"Python.generate_apriltag_batch.executor": "Run",
"Python.generate_apriltags_border.executor": "Run",
"Python.gui_camera_client..executor": "Run",
"RunOnceActivity.MCP Project settings loaded": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
"RunOnceActivity.git.unshallow": "true",
"com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true",
"git-widget-placeholder": "master",
"junie.onboarding.icon.badge.shown": "true",
"last_opened_file_path": "D:/cmvr/0-worksapce/grpc_client",
"settings.editor.selected.configurable": "http.proxy",
"to.speed.mode.migration.done": "true"
}
}]]></component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\cmvr\0-worksapce\grpc_client" />
</key>
</component>
<component name="RunManager" selected="Python.app">
<configuration name="app" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="grpc_client" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/ui" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="RUN_TOOL" value="" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/ui/app.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="generate_apriltag_batch" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="grpc_client" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/scripts" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="RUN_TOOL" value="" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/scripts/generate_apriltag_batch.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="generate_apriltags_border" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="grpc_client" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/scripts" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="RUN_TOOL" value="" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/scripts/generate_apriltags_border.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="gui_camera_client." type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="grpc_client" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/clients" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="RUN_TOOL" value="" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/clients/gui_camera_client..py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="Python.app" />
<item itemvalue="Python.generate_apriltags_border" />
<item itemvalue="Python.generate_apriltag_batch" />
<item itemvalue="Python.gui_camera_client." />
</list>
</recent_temporary>
</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-python-sdk-4762d8aabb82-6d6dccd035ac-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-253.30387.173" />
</set>
</attachedChunks>
</component>
<component name="SvnConfiguration">
<configuration>C:\Users\lgv\AppData\Roaming\Subversion</configuration>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="14e52ab9-de95-493e-8d51-2bc74f57bef2" name="Changes" comment="" />
<created>1773737578904</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1773737578904</updated>
</task>
<servers />
</component>
</project>

View File

@ -0,0 +1,272 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="14e52ab9-de95-493e-8d51-2bc74f57bef2" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/clients/base_client.py" beforeDir="false" afterPath="$PROJECT_DIR$/clients/base_client.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/clients/gui_camera_client..py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/clients/hand_client.py" beforeDir="false" afterPath="$PROJECT_DIR$/clients/hand_client.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/clients/joint_states.csv" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/clients/press_client.py" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/biohead_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/biohead_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/biohead_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/biohead_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/biohead_service_pb2_grpc.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/biohead_service_pb2_grpc.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/camera_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/camera_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/camera_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/camera_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/common_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/common_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/dexhand_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/dexhand_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/dexhand_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/dexhand_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/hlc_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/hlc_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/hlc_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/hlc_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/humanoid_robot_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/humanoid_robot_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/humanoid_robot_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/humanoid_robot_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/humanoid_robot_service_pb2_grpc.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/humanoid_robot_service_pb2_grpc.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/microphone_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/microphone_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/microphone_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/microphone_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/speaker_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/speaker_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/speaker_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/speaker_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/system_command_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/system_command_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/system_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/system_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/system_service_pb2_grpc.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/system_service_pb2_grpc.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/api/test_service_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/api/test_service_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/msgs/can_card_parameter_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/msgs/can_card_parameter_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/msgs/canopen_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/msgs/canopen_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/msgs/error_code_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/msgs/error_code_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/msgs/geometry_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/msgs/geometry_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/msgs/motor_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/msgs/motor_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/generated/cmvr/msgs/robot_detail_pb2.py" beforeDir="false" afterPath="$PROJECT_DIR$/generated/cmvr/msgs/robot_detail_pb2.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/biohead_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/biohead_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/camera_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/camera_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/common.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/dexhand_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/dexhand_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/hlc_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/hlc_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/humanoid_robot_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/humanoid_robot_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/microphone_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/microphone_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/speaker_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/speaker_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/system_command.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/system_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/api/test_service.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/msgs/can_card_parameter.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/msgs/canopen.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/msgs/error_code.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/msgs/geometry.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/msgs/motor.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/protos/cmvr/msgs/robot_detail.proto" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/requirements.txt" beforeDir="false" afterPath="$PROJECT_DIR$/requirements.txt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/scripts/apriltags_border_20x15cm_A4.pdf" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/scripts/generate_apriltag_single.py" beforeDir="false" afterPath="$PROJECT_DIR$/scripts/generate_apriltag_single.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/scripts/generate_apriltags_border.py" beforeDir="false" afterPath="$PROJECT_DIR$/scripts/generate_apriltags_border.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/ui/app.py" beforeDir="false" afterPath="$PROJECT_DIR$/ui/app.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="EmbeddingIndexingInfo">
<option name="cachedIndexableFilesCount" value="391" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="McpProjectServerCommands">
<commands />
<urls />
</component>
<component name="ProjectColorInfo">{
&quot;customColor&quot;: &quot;&quot;,
&quot;associatedIndex&quot;: 3
}</component>
<component name="ProjectId" id="3B49fOihNkRbSSSqQJdMjIqYFFv" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"Python.app.executor": "Run",
"Python.generate_apriltag_batch.executor": "Run",
"Python.generate_apriltags_border.executor": "Run",
"Python.gui_camera_client..executor": "Run",
"Python.hand_client.executor": "Run",
"RunOnceActivity.MCP Project settings loaded": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"RunOnceActivity.TerminalTabsStorage.copyFrom.TerminalArrangementManager.252": "true",
"RunOnceActivity.git.unshallow": "true",
"com.intellij.ml.llm.matterhorn.ej.ui.settings.DefaultModelSelectionForGA.v1": "true",
"git-widget-placeholder": "master",
"junie.onboarding.icon.badge.shown": "true",
"last_opened_file_path": "D:/cmvr/0-worksapce/grpc_client",
"settings.editor.selected.configurable": "http.proxy",
"to.speed.mode.migration.done": "true"
}
}]]></component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\cmvr\0-worksapce\grpc_client" />
</key>
</component>
<component name="RunManager" selected="Python.app">
<configuration name="app" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="grpc_client" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/ui" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="RUN_TOOL" value="" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/ui/app.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="generate_apriltag_batch" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="grpc_client" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/scripts" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="RUN_TOOL" value="" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/scripts/generate_apriltag_batch.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="generate_apriltags_border" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="grpc_client" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/scripts" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="RUN_TOOL" value="" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/scripts/generate_apriltags_border.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="gui_camera_client." type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="grpc_client" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/clients" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="RUN_TOOL" value="" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/clients/gui_camera_client..py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="hand_client" type="PythonConfigurationType" factoryName="Python" temporary="true" nameIsGenerated="true">
<module name="grpc_client" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/clients" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="RUN_TOOL" value="" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/clients/hand_client.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<recent_temporary>
<list>
<item itemvalue="Python.app" />
<item itemvalue="Python.hand_client" />
<item itemvalue="Python.generate_apriltags_border" />
<item itemvalue="Python.generate_apriltag_batch" />
<item itemvalue="Python.gui_camera_client." />
</list>
</recent_temporary>
</component>
<component name="SharedIndexes">
<attachedChunks>
<set>
<option value="bundled-python-sdk-4762d8aabb82-6d6dccd035ac-com.jetbrains.pycharm.pro.sharedIndexes.bundled-PY-253.30387.173" />
</set>
</attachedChunks>
</component>
<component name="SvnConfiguration">
<configuration>C:\Users\lgv\AppData\Roaming\Subversion</configuration>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="14e52ab9-de95-493e-8d51-2bc74f57bef2" name="Changes" comment="" />
<created>1773737578904</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1773737578904</updated>
</task>
<servers />
</component>
</project>

View File

@ -7,7 +7,13 @@
## Setup
```bash
pip install -r requirements.txt
python -m pip install -r requirements.txt
```
Use the same Python interpreter you run the clients with. For example:
```bash
C:\Users\lgv\miniconda3\envs\grpc_client\python.exe -m pip install -r requirements.txt
```
## Generate gRPC code
@ -29,9 +35,9 @@ python -m clients.get_pose_client
python -m clients.torque_on_client
python -m clients.torque_off_client
python -m clients.torque_key_client
python -m clients.press_client
python -m clients.save_joint_to_csv
python -m clients.http_server
python -m clients.hlc_client
```
## UI (PyQt)

Binary file not shown.

Binary file not shown.

View File

@ -17,9 +17,14 @@ class RobotClientBase:
self.retries = retries
self.channel = None
self.stub = None
self.stub_hand = None
print(f"Attempting to connect to gRPC server: {self.address}")
self._connect_with_retry()
def _init_stubs(self, channel):
self.stub = humanoid_robot_service_pb2_grpc.HumanoidRobotServiceStub(channel)
self.stub_hand = dexhand_service_pb2_grpc.DexHandServiceStub(channel)
def _connect_with_retry(self):
attempt = 0
while attempt <= self.retries:
@ -27,8 +32,7 @@ class RobotClientBase:
try:
self.channel = grpc.insecure_channel(self.address)
grpc.channel_ready_future(self.channel).result(timeout=self.timeout)
self.stub = humanoid_robot_service_pb2_grpc.HumanoidRobotServiceStub(self.channel)
self.stub_hand = dexhand_service_pb2_grpc.DexHandServiceStub(self.channel)
self._init_stubs(self.channel)
print(f"Successfully connected to gRPC server: {self.address}")
return
except grpc.FutureTimeoutError:

67
clients/camera_client.py Normal file
View File

@ -0,0 +1,67 @@
import time
from typing import Callable, Optional
from google.protobuf.timestamp_pb2 import Timestamp
from clients._path_setup import ensure_paths
ensure_paths()
from clients.base_client import RobotClientBase
from cmvr.api import camera_command_pb2 as pb
from cmvr.api import camera_service_pb2_grpc as rpc
from cmvr.api import common_pb2
class CameraClient(RobotClientBase):
"""Client for CameraService RGB image RPCs."""
def _init_stubs(self, channel):
self.stub = rpc.CameraServiceStub(channel)
@staticmethod
def _make_header(device_id: str):
header = common_pb2.CommandHeader.Request()
header.device_id = device_id
timestamp = Timestamp()
timestamp.GetCurrentTime()
header.timestamp.CopyFrom(timestamp)
return header
def start_camera(self, device_id: str):
request = pb.StartCameraCommand.Request(header=self._make_header(device_id))
return self.stub.StartCamera(request, timeout=self.timeout)
def stop_camera(self, device_id: str):
request = pb.StopCameraCommand.Request(header=self._make_header(device_id))
return self.stub.StopCamera(request, timeout=self.timeout)
def get_rgb_image(self, device_id: str):
request = pb.GetRGBImageCommand.Request(header=self._make_header(device_id))
return self.stub.GetRGBImage(request, timeout=self.timeout)
def get_rgb_image_stream(
self,
device_id: str,
stop_requested: Optional[Callable[[], bool]] = None,
request_interval: float = 0.001,
):
should_stop = stop_requested or (lambda: False)
def request_gen():
while not should_stop():
yield pb.GetRGBImageStreamCommand.Request(
header=self._make_header(device_id),
eof=False,
)
time.sleep(request_interval)
yield pb.GetRGBImageStreamCommand.Request(
header=self._make_header(device_id),
eof=True,
)
return self.stub.GetRGBImageStream(request_gen())
GetRGBImageStreamClient = CameraClient

View File

@ -1,727 +0,0 @@
# camera_player_qt.py
import sys
import cv2
import av
import numpy as np
import grpc
import threading
import time
from datetime import datetime
from pathlib import Path
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout,
QHBoxLayout, QLabel, QPushButton, QLineEdit,
QFileDialog, QMessageBox, QStatusBar, QGroupBox,
QGridLayout, QComboBox, QSpinBox, QCheckBox, QFrame)
from PyQt5.QtCore import Qt, QThread, pyqtSignal, QTimer
from PyQt5.QtGui import QImage, QPixmap
# 导入生成的protobuf模块
from cmvr.api import camera_service_pb2_grpc
from cmvr.api import camera_command_pb2
from cmvr.api.common_pb2 import CommandHeader
from google.protobuf.timestamp_pb2 import Timestamp
class StreamThread(QThread):
"""流接收线程"""
frame_received = pyqtSignal(object, int, int) # frame, width, height
status_update = pyqtSignal(dict)
error_occurred = pyqtSignal(str)
keyframe_received = pyqtSignal()
# 支持的编码格式
CODECS = {
'H.265 (HEVC)': 'hevc',
'H.264 (AVC)': 'h264'
}
def __init__(self, device_id, server_addr, codec='hevc', wait_for_keyframe=True):
super().__init__()
self.device_id = device_id
self.server_addr = server_addr
self.codec_name = codec
self.wait_for_keyframe = wait_for_keyframe
self.running = False
self.streaming = False
# gRPC
self.channel = None
self.stub = None
# 解码器
self.codec = None
self._init_decoder()
# 统计
self.frame_count = 0
self.fps_counter = 0
self.fps_time = time.time()
self.fps = 0
self.keyframe_count = 0
def _init_decoder(self):
"""初始化解码器"""
try:
# 根据选择的编码创建解码器
self.codec = av.CodecContext.create(self.codec_name, "r")
self.codec.thread_count = 1
# 设置低延迟模式
if hasattr(self.codec, 'flags'):
try:
self.codec.flags |= av.codec.context.AV_CODEC_FLAG_LOW_DELAY
except:
pass
print(f"{self.codec_name.upper()}解码器初始化成功")
except Exception as e:
print(f"✗ 解码器初始化失败: {e}")
self.codec = None
def _create_header(self):
"""创建请求头"""
timestamp = Timestamp()
timestamp.GetCurrentTime()
return CommandHeader.Request(
device_id=self.device_id,
timestamp=timestamp
)
def connect(self):
"""连接服务器"""
try:
self.channel = grpc.insecure_channel(self.server_addr)
grpc.channel_ready_future(self.channel).result(timeout=3)
self.stub = camera_service_pb2_grpc.CameraServiceStub(self.channel)
return True
except Exception as e:
self.error_occurred.emit(f"连接失败: {e}")
return False
def start_camera(self):
"""启动摄像头"""
try:
request = camera_command_pb2.StartCameraCommand.Request(
header=self._create_header()
)
response = self.stub.StartCamera(request, timeout=3)
return response.header.success
except Exception as e:
self.error_occurred.emit(f"启动摄像头失败: {e}")
return False
def stop_camera(self):
"""停止摄像头"""
try:
request = camera_command_pb2.StopCameraCommand.Request(
header=self._create_header()
)
self.stub.StopCamera(request, timeout=3)
except:
pass
def run(self):
"""线程主函数"""
if not self.connect():
return
if not self.start_camera():
return
self.running = True
self.streaming = True
self.frame_count = 0
self.fps_counter = 0
self.fps_time = time.time()
keyframe_received = False
def request_gen():
while self.streaming:
yield camera_command_pb2.GetRGBImageStreamCommand.Request(
header=self._create_header(),
eof=False
)
time.sleep(0.001)
yield camera_command_pb2.GetRGBImageStreamCommand.Request(
header=self._create_header(),
eof=True
)
try:
responses = self.stub.GetRGBImageStream(request_gen())
for response in responses:
if not self.streaming:
break
if response.header.success:
frame_data = response.color_frame.data
is_keyframe = response.color_frame.is_key_frame
# 等待首个关键帧
if self.wait_for_keyframe and not keyframe_received and not is_keyframe:
continue
if is_keyframe and not keyframe_received:
keyframe_received = True
self.keyframe_count += 1
self.keyframe_received.emit()
# 解码
if self.codec and frame_data:
packet = av.Packet(frame_data)
frames = self.codec.decode(packet)
if frames:
# 转换为RGB (已经是RGB格式)
img = frames[0].to_ndarray(format='rgb24')
# 更新统计
self.fps_counter += 1
self.frame_count += 1
# 计算FPS
now = time.time()
if now - self.fps_time >= 1.0:
self.fps = self.fps_counter
self.fps_counter = 0
self.fps_time = now
# 发送状态更新
self.status_update.emit({
'fps': self.fps,
'frames': self.frame_count,
'keyframes': self.keyframe_count
})
# 发送帧到主线程
h, w = img.shape[:2]
self.frame_received.emit(img, w, h)
else:
print(f"流错误: {response.header.error_message}")
except Exception as e:
self.error_occurred.emit(f"流错误: {e}")
finally:
self.stop_camera()
if self.channel:
self.channel.close()
self.running = False
self.streaming = False
def stop(self):
"""停止线程"""
self.streaming = False
self.wait(2000) # 等待最多2秒
class CameraPlayerQt(QMainWindow):
"""基于Qt的摄像头拉流播放器"""
def __init__(self):
super().__init__()
self.setWindowTitle("摄像头拉流播放器 (Qt版)")
self.setMinimumSize(1000, 800)
# 状态变量
self.connected = False
self.streaming = False
self.recording = False
self.stream_thread = None
self.video_writer = None
# 录制目录
self.record_path = Path("./recordings")
self.record_path.mkdir(exist_ok=True)
# 创建UI
self._create_ui()
# 状态栏
self.status_bar = QStatusBar()
self.setStatusBar(self.status_bar)
self.status_bar.showMessage("就绪")
# 定时器用于更新显示
self.display_timer = QTimer()
self.display_timer.timeout.connect(self._update_display)
self.display_timer.start(30) # 约33fps
# 当前帧缓存
self.current_frame = None
self.frame_width = 0
self.frame_height = 0
def _create_ui(self):
"""创建UI"""
central_widget = QWidget()
self.setCentralWidget(central_widget)
main_layout = QVBoxLayout(central_widget)
# ========== 连接设置区域 ==========
conn_group = QGroupBox("连接设置")
conn_layout = QGridLayout()
# 第一行设备ID和编码格式
conn_layout.addWidget(QLabel("设备ID:"), 0, 0)
self.device_id = QLineEdit("right_hand_cam")
conn_layout.addWidget(self.device_id, 0, 1)
conn_layout.addWidget(QLabel("编码格式:"), 0, 2)
self.codec_combo = QComboBox()
self.codec_combo.addItems(['H.265 (HEVC)', 'H.264 (AVC)'])
self.codec_combo.setCurrentIndex(0)
self.codec_combo.setMinimumWidth(120)
conn_layout.addWidget(self.codec_combo, 0, 3)
# 等待关键帧选项
self.wait_keyframe = QCheckBox("等待关键帧")
self.wait_keyframe.setChecked(True)
conn_layout.addWidget(self.wait_keyframe, 0, 4)
# 第二行:服务器地址
conn_layout.addWidget(QLabel("服务器IP:"), 1, 0)
self.server_ip = QLineEdit("192.168.0.222")
conn_layout.addWidget(self.server_ip, 1, 1)
conn_layout.addWidget(QLabel("端口:"), 1, 2)
self.server_port = QLineEdit("50052")
self.server_port.setMaximumWidth(80)
conn_layout.addWidget(self.server_port, 1, 3)
# 超时设置
conn_layout.addWidget(QLabel("超时(秒):"), 1, 4)
self.timeout_spin = QSpinBox()
self.timeout_spin.setRange(1, 10)
self.timeout_spin.setValue(3)
self.timeout_spin.setMaximumWidth(60)
conn_layout.addWidget(self.timeout_spin, 1, 5)
# 第三行:录制目录
conn_layout.addWidget(QLabel("录制目录:"), 2, 0)
self.record_dir = QLineEdit(str(self.record_path))
conn_layout.addWidget(self.record_dir, 2, 1, 1, 4)
self.browse_btn = QPushButton("浏览")
self.browse_btn.clicked.connect(self._browse_dir)
conn_layout.addWidget(self.browse_btn, 2, 5)
# 第四行:控制按钮
btn_layout = QHBoxLayout()
self.connect_btn = QPushButton("连接")
self.connect_btn.clicked.connect(self._connect)
self.connect_btn.setMinimumWidth(80)
btn_layout.addWidget(self.connect_btn)
self.preview_btn = QPushButton("预览")
self.preview_btn.clicked.connect(self._toggle_preview)
self.preview_btn.setEnabled(False)
self.preview_btn.setMinimumWidth(80)
btn_layout.addWidget(self.preview_btn)
self.record_btn = QPushButton("录制")
self.record_btn.clicked.connect(self._toggle_recording)
self.record_btn.setEnabled(False)
self.record_btn.setMinimumWidth(80)
btn_layout.addWidget(self.record_btn)
self.disconnect_btn = QPushButton("断开")
self.disconnect_btn.clicked.connect(self._disconnect)
self.disconnect_btn.setEnabled(False)
self.disconnect_btn.setMinimumWidth(80)
btn_layout.addWidget(self.disconnect_btn)
btn_layout.addStretch()
conn_layout.addLayout(btn_layout, 3, 0, 1, 6)
conn_group.setLayout(conn_layout)
main_layout.addWidget(conn_group)
# ========== 状态显示区域 ==========
status_group = QGroupBox("状态信息")
status_layout = QHBoxLayout()
self.conn_status = QLabel("● 未连接")
self.conn_status.setStyleSheet("color: red;")
status_layout.addWidget(self.conn_status)
status_layout.addWidget(QLabel("|"))
self.codec_status = QLabel("编码: H.265")
status_layout.addWidget(self.codec_status)
status_layout.addWidget(QLabel("|"))
self.fps_status = QLabel("FPS: 0")
status_layout.addWidget(self.fps_status)
status_layout.addWidget(QLabel("|"))
self.frame_status = QLabel("帧数: 0")
status_layout.addWidget(self.frame_status)
status_layout.addWidget(QLabel("|"))
self.resolution_status = QLabel("分辨率: -")
status_layout.addWidget(self.resolution_status)
status_layout.addWidget(QLabel("|"))
self.keyframe_status = QLabel("关键帧: 等待")
self.keyframe_status.setStyleSheet("color: orange;")
status_layout.addWidget(self.keyframe_status)
status_layout.addWidget(QLabel("|"))
self.record_status = QLabel("录制: 未开始")
self.record_status.setStyleSheet("color: gray;")
status_layout.addWidget(self.record_status)
status_layout.addStretch()
status_group.setLayout(status_layout)
main_layout.addWidget(status_group)
# ========== 视频预览区域 ==========
video_group = QGroupBox("视频预览")
video_layout = QVBoxLayout()
self.video_label = QLabel()
self.video_label.setAlignment(Qt.AlignCenter)
self.video_label.setMinimumSize(640, 480)
self.video_label.setStyleSheet("background-color: black; border: 1px solid gray;")
video_layout.addWidget(self.video_label)
video_group.setLayout(video_layout)
main_layout.addWidget(video_group, 1) # 1表示拉伸因子
# ========== 操作说明 ==========
info_frame = QFrame()
info_frame.setFrameStyle(QFrame.StyledPanel | QFrame.Sunken)
info_layout = QHBoxLayout(info_frame)
info_label = QLabel("操作说明: ①选择编码格式 ②连接 ③预览 ④录制 (按'停止预览'结束)")
info_label.setStyleSheet("color: gray; padding: 5px;")
info_layout.addWidget(info_label)
main_layout.addWidget(info_frame)
def _browse_dir(self):
"""浏览目录"""
directory = QFileDialog.getExistingDirectory(self, "选择录制目录",
self.record_dir.text())
if directory:
self.record_dir.setText(directory)
self.record_path = Path(directory)
self.record_path.mkdir(exist_ok=True)
def _get_server_addr(self):
"""获取服务器地址"""
return f"{self.server_ip.text()}:{self.server_port.text()}"
def _get_codec(self):
"""获取编码格式"""
codec_map = {
'H.265 (HEVC)': 'hevc',
'H.264 (AVC)': 'h264'
}
return codec_map[self.codec_combo.currentText()]
def _connect(self):
"""连接服务器"""
codec = self._get_codec()
self.status_bar.showMessage(f"正在连接服务器 (编码: {codec.upper()})...")
# 更新编码状态显示
self.codec_status.setText(f"编码: {self.codec_combo.currentText()}")
# 创建流线程
self.stream_thread = StreamThread(
self.device_id.text(),
self._get_server_addr(),
codec=codec,
wait_for_keyframe=self.wait_keyframe.isChecked()
)
# 连接信号
self.stream_thread.frame_received.connect(self._on_frame_received)
self.stream_thread.status_update.connect(self._on_status_update)
self.stream_thread.error_occurred.connect(self._on_error)
self.stream_thread.keyframe_received.connect(self._on_keyframe_received)
# 连接测试
if self.stream_thread.connect():
self.connected = True
self.conn_status.setText("● 已连接")
self.conn_status.setStyleSheet("color: green;")
self.connect_btn.setEnabled(False)
self.preview_btn.setEnabled(True)
self.disconnect_btn.setEnabled(True)
self.codec_combo.setEnabled(False)
self.wait_keyframe.setEnabled(False)
self.status_bar.showMessage("服务器连接成功", 3000)
else:
self.stream_thread = None
def _disconnect(self):
"""断开连接"""
# 停止预览
if self.streaming:
self._stop_preview()
# 停止录制
if self.recording:
self._stop_recording()
# 清理线程
if self.stream_thread:
self.stream_thread.stop()
self.stream_thread = None
self.connected = False
self.conn_status.setText("● 未连接")
self.conn_status.setStyleSheet("color: red;")
self.connect_btn.setEnabled(True)
self.preview_btn.setEnabled(False)
self.preview_btn.setText("预览")
self.record_btn.setEnabled(False)
self.record_btn.setText("录制")
self.disconnect_btn.setEnabled(False)
self.codec_combo.setEnabled(True)
self.wait_keyframe.setEnabled(True)
# 清空画面
self.video_label.clear()
self.current_frame = None
# 重置状态
self.keyframe_status.setText("关键帧: 等待")
self.keyframe_status.setStyleSheet("color: orange;")
self.fps_status.setText("FPS: 0")
self.frame_status.setText("帧数: 0")
self.resolution_status.setText("分辨率: -")
self.status_bar.showMessage("已断开连接", 3000)
def _toggle_preview(self):
"""切换预览"""
if not self.streaming:
self._start_preview()
else:
self._stop_preview()
def _start_preview(self):
"""开始预览"""
if not self.stream_thread:
return
self.streaming = True
self.stream_thread.streaming = True
self.stream_thread.start()
self.preview_btn.setText("停止")
self.record_btn.setEnabled(True)
if self.wait_keyframe.isChecked():
self.keyframe_status.setText("关键帧: 等待中...")
self.keyframe_status.setStyleSheet("color: orange;")
else:
self.keyframe_status.setText("关键帧: 不等待")
self.keyframe_status.setStyleSheet("color: gray;")
self.status_bar.showMessage("预览已启动...")
def _stop_preview(self):
"""停止预览"""
if self.stream_thread:
self.stream_thread.streaming = False
self.stream_thread.wait(2000)
self.streaming = False
self.preview_btn.setText("预览")
self.record_btn.setEnabled(False)
# 停止录制
if self.recording:
self._stop_recording()
self.keyframe_status.setText("关键帧: 等待")
self.keyframe_status.setStyleSheet("color: orange;")
# 清空画面
self.video_label.clear()
self.current_frame = None
self.status_bar.showMessage("预览已停止", 3000)
def _toggle_recording(self):
"""切换录制"""
if not self.recording:
self._start_recording()
else:
self._stop_recording()
def _start_recording(self):
"""开始录制"""
if not self.streaming:
QMessageBox.warning(self, "警告", "请先启动预览")
return
# 更新录制目录
self.record_path = Path(self.record_dir.text())
self.record_path.mkdir(parents=True, exist_ok=True)
# 生成文件名
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
codec_name = self.codec_combo.currentText().replace(' ', '_')
filename = self.record_path / f"rec_{self.device_id.text()}_{codec_name}_{timestamp}.mp4"
# 获取画面尺寸
if self.current_frame is not None:
height, width = self.current_frame.shape[:2]
else:
width, height = 640, 480
# 创建VideoWriter
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
self.video_writer = cv2.VideoWriter(str(filename), fourcc, 30.0, (width, height))
if self.video_writer.isOpened():
self.recording = True
self.record_btn.setText("停止")
self.record_status.setText("● 录制中")
self.record_status.setStyleSheet("color: red;")
self.status_bar.showMessage(f"开始录制: {filename.name}", 3000)
else:
QMessageBox.critical(self, "错误", "无法创建视频文件")
def _stop_recording(self):
"""停止录制"""
if self.video_writer:
self.video_writer.release()
self.video_writer = None
self.recording = False
self.record_btn.setText("录制")
self.record_status.setText("录制: 未开始")
self.record_status.setStyleSheet("color: gray;")
self.status_bar.showMessage("录制已停止", 3000)
def _on_frame_received(self, frame, width, height):
"""收到新帧"""
self.current_frame = frame
self.frame_width = width
self.frame_height = height
# 录制
if self.recording and self.video_writer:
# 转换为BGR用于录制
frame_bgr = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
self.video_writer.write(frame_bgr)
def _update_display(self):
"""更新显示"""
if self.current_frame is not None:
# 直接使用QImage避免转换
bytes_per_line = 3 * self.frame_width
qimage = QImage(self.current_frame.data, self.frame_width,
self.frame_height, bytes_per_line, QImage.Format_RGB888)
# 缩放以适应标签大小
label_size = self.video_label.size()
pixmap = QPixmap.fromImage(qimage).scaled(
label_size, Qt.KeepAspectRatio, Qt.SmoothTransformation)
self.video_label.setPixmap(pixmap)
# 更新分辨率显示
self.resolution_status.setText(f"分辨率: {self.frame_width}x{self.frame_height}")
def _on_status_update(self, stats):
"""状态更新"""
self.fps_status.setText(f"FPS: {stats['fps']}")
self.frame_status.setText(f"帧数: {stats['frames']}")
def _on_keyframe_received(self):
"""收到关键帧"""
if self.wait_keyframe.isChecked():
self.keyframe_status.setText("关键帧: 已接收")
self.keyframe_status.setStyleSheet("color: green;")
def _on_error(self, msg):
"""错误处理"""
QMessageBox.critical(self, "错误", msg)
self.status_bar.showMessage(f"错误: {msg}")
def closeEvent(self, event):
"""窗口关闭事件"""
# 停止预览
if self.streaming:
self._stop_preview()
# 停止录制
if self.recording:
self._stop_recording()
# 断开连接
if self.connected:
self._disconnect()
event.accept()
def main():
app = QApplication(sys.argv)
# 设置应用样式
app.setStyle('Fusion')
# 设置全局样式表
app.setStyleSheet("""
QGroupBox {
font-weight: bold;
border: 1px solid gray;
border-radius: 5px;
margin-top: 10px;
padding-top: 10px;
}
QGroupBox::title {
subcontrol-origin: margin;
left: 10px;
padding: 0 5px 0 5px;
}
QPushButton {
padding: 5px 10px;
}
QLineEdit {
padding: 3px;
}
QComboBox {
padding: 3px;
}
""")
window = CameraPlayerQt()
window.show()
print("\n" + "=" * 60)
print("摄像头拉流播放器 (Qt版) 启动")
print("=" * 60)
print("支持编码:")
print(" • H.265 (HEVC) - 高压缩率")
print(" • H.264 (AVC) - 兼容性好")
print("\n操作步骤:")
print("1. 选择编码格式")
print("2. 输入设备ID、服务器IP和端口")
print("3. 点击【连接】按钮")
print("4. 点击【预览】按钮开始观看")
print("5. 点击【录制】按钮开始/停止录制")
print("=" * 60 + "\n")
sys.exit(app.exec_())
if __name__ == "__main__":
main()

View File

@ -104,7 +104,7 @@ if __name__ == "__main__":
# ]
# client.set_angles(hand_open, device_id="hand2")
client.set_angles(hand_open, device_id="hand2")
client.set_angles(hand_touch, device_id="hand2")
# client.set_angles(handshake, device_id="hand1")
# Close client

66
clients/hlc_client.py Normal file
View File

@ -0,0 +1,66 @@
from google.protobuf.timestamp_pb2 import Timestamp
from clients._path_setup import ensure_paths
ensure_paths()
from clients.base_client import RobotClientBase
from cmvr.api import common_pb2
from cmvr.api import hlc_command_pb2 as pb
from cmvr.api import hlc_service_pb2_grpc as rpc
class HlcClient(RobotClientBase):
"""Client for calling cmvr.api.HlcService."""
def _init_stubs(self, channel):
self.stub = rpc.HlcServiceStub(channel)
@staticmethod
def _make_header(device_id: str):
header = common_pb2.CommandHeader.Request()
header.device_id = device_id
timestamp = Timestamp()
timestamp.GetCurrentTime()
header.timestamp.CopyFrom(timestamp)
return header
def touch(
self,
u: int,
v: int,
max_force: float,
device_id="hc01",
timeout=None,
):
request = pb.Touch.Request()
request.header.CopyFrom(self._make_header(device_id))
request.u = u
request.v = v
request.max_force = max_force
rpc_timeout = self.timeout if timeout is None else timeout
response = self.stub.touch(request, timeout=rpc_timeout)
return response
def main():
client = HlcClient()
try:
response = client.touch(
u=12,
v=34,
max_force=10.0,
device_id="hc01",
)
print("touch RPC call completed")
print(f"success: {response.header.success}")
print(f"error_message: {response.header.error_message}")
print(f"timestamp: {response.header.timestamp.seconds}")
return response
finally:
client.close()
if __name__ == "__main__":
main()

View File

@ -1,51 +0,0 @@
R_SHOULDER_P,R_SHOULDER_R,R_SHOULDER_Y,R_ELBOW_R,R_WRIST_P,R_WRIST_Y,R_WRIST_R
42.3871312049,94.4262521308,-69.8990748368,-35.2088867644,-16.7676098745,-5.0042133827,1.9505775177
38.4358423623,74.7161029078,-69.9082421615,-35.1792075506,-16.7656045222,16.3947289414,-3.6198327581
74.883406584,73.4828685496,-69.8867562442,-5.0052447067,-15.4131949426,15.065925223,14.4940560476
61.7429060315,50.3894035464,-69.9068670628,-20.3281415008,-15.3997877302,35.9769366887,1.1899187489
59.4242031304,67.0953058663,-69.8938609209,-21.9081872124,-15.423221704,19.7719713691,4.0812929663
90.7017399835,66.3198647864,-69.8943765829,7.3872594442,-15.469745877,18.6678816978,20.4932679373
43.3590395128,62.9293297379,-73.6622043394,-35.8108362239,-15.1957001636,20.2325721406,0
40.5923409116,88.5308028978,-73.6077160531,-31.2608064855,-11.9376329573,-4.7227192179,-12.7598273933
23.8609419698,84.6395600321,-73.65269324,-33.7536312605,-15.2801541426,-3.2523949241,-33.0631025258
17.1967552631,63.8605007466,-76.6419286488,-33.6005942334,-26.570975045,1.7080444831,-40.4801557753
112.3846401909,69.7356099778,-80.6124115775,39.6581332267,-8.4428768859,-0.4859828018,9.1025231955
-5.7770761525,76.506481426,-80.5607307844,-61.0971825964,0.409550232,5.9197426435,-25.0002685454
-8.8597036819,77.9207131517,-80.5670906159,-33.145436561,0.2532473454,5.9258159961,-61.5692425238
-36.6110290806,76.1685509185,-80.3678158947,-72.2165745265,11.1447166646,-0.0391903132,-52.2577616205
-35.3651323551,36.5073237197,-79.0065827651,-73.8037822106,52.7478124227,12.1613156805,-32.3100640957
-5.3251270437,44.1961881472,-81.8030751716,-71.2213468364,52.7241492657,10.7124200082,-8.0924558984
2.8886240199,76.6163747311,-84.1251585237,-69.7672372481,74.4535163503,7.928589969,-1.7550270223
10.4090961515,84.9616196088,-84.1484779059,-60.456730373,-18.5233817419,-21.8610327859,0
54.5989244672,82.6571833568,-84.1363312007,-15.5816445344,-18.5294550945,-10.4057729963,-7.731091417
81.1793533158,80.2358637145,-84.1327788623,11.5328382751,-18.4099360985,-10.3396536667,-3.3667000042
38.2612048264,74.9317069261,-84.1652082735,-34.3789573981,-32.3599687196,0,0
45.9865093697,73.6787628197,-42.7689502796,-25.1068959911,21.0002209945,17.5849341693,12.4229855056
22.7002440684,64.4069878916,-62.7950857265,-31.455039178,7.9418825899,33.6965073683,-22.0264457013
-7.8064353671,69.4039247102,-64.5624886372,-46.9387079294,5.7706590252,20.9282574954,-42.2467565451
-2.1254442368,74.2813998286,-71.1825002979,-13.416838097,-4.5865844458,22.1780503339,-61.8393921242
5.4559906041,77.0098821448,-71.1713849167,-48.8421310206,0.1305770815,11.0492046002,-28.0768227221
8.1414437899,69.7912441798,-109.3110080989,-62.2787361616,26.0631052554,-26.4386790901,-18.1101072843
8.1236820983,39.0906758264,-91.0631617607,-54.527763109,26.2233042549,12.5954458019,-19.292806765
11.0263435842,28.5577634954,-91.6200194418,-56.0312616592,24.2097586755,5.6390506197,0
36.628332406,62.8089513052,-98.8949218623,-43.4181687572,24.2570276936,2.887306217,-1.8566697351
24.7188316764,87.9824822878,-99.1789943371,-41.2523309958,-8.5307113159,-24.3634832519,-10.7646737591
72.4000929083,79.991210736,-99.1548155182,0.9364995161,-8.3708560911,-10.9260186742,-2.1646918458
23.3924916765,86.2120999966,-73.4446522646,-46.4581109308,6.0181194969,8.9699407617,-2.1167925741
30.0970719078,53.0039818529,-97.8485290411,-46.4597152127,5.9310872079,8.2670934344,-8.9634663386
29.1964395496,32.4169207245,-113.7501132082,-48.2284359262,0.5494665255,3.410932346,-18.0847825497
47.142795496,53.1601701478,-116.6299136781,-33.5294328753,-21.6354593019,-0.8102196181,-14.3094490461
52.5930565222,86.0146587404,-67.4882403222,-27.2043225917,-5.4967279034,-0.6699022541,-2.348095636
5.689127131,79.3010830718,-87.5470343635,-64.8126993063,-6.6456228742,-13.3742673328,-10.9887575528
-36.490879831,85.2079914607,-76.8147327198,-59.0912000599,3.7261737249,-13.9641273829,-40.7579257144
-43.7821688445,66.2628554858,-75.3971778389,-55.7114939138,2.5531572309,-13.9655024816,-48.4137304772
-18.0355654751,62.0254315203,-77.0001418623,-56.2921293434,-15.9961794991,-23.3165747686,-20.1152876799
-25.9848392206,67.5677668642,-69.5084322121,-71.3935206538,20.9554156949,11.0399799797,-15.5277865016
-34.3248128865,59.3506353495,-64.9300983585,-78.7725868015,26.2126472399,7.4840320158,-12.2919500578
-26.2237053253,93.5622317757,-72.0755123174,-77.1128999564,26.2140796344,12.1362201291,-17.8720433204
43.6226573943,57.1218295265,-87.7357093655,-23.230974874,23.3228773044,17.0774654501,-0.0433729051
20.543000674,69.8960954563,-85.5268997694,-25.9198658066,77.8772256551,22.5696096911,-8.9078321367
-0.940166446,22.5041779109,-94.648101389,-58.6892701666,70.7468231905,20.9154232408,-8.9639247048
0.1180293058,33.0162345782,-92.8632805614,-67.671758704,61.8440903782,13.0295759233,0
41.6477291703,62.5570217627,-96.0662292278,-22.0864916783,52.5155926283,11.0115039773,-3.3080864217
-9.3205909323,58.9835412902,-86.0922372259,-65.5880830905,52.532036517,11.5678459964,-14.0276111066
1 R_SHOULDER_P R_SHOULDER_R R_SHOULDER_Y R_ELBOW_R R_WRIST_P R_WRIST_Y R_WRIST_R
2 42.3871312049 94.4262521308 -69.8990748368 -35.2088867644 -16.7676098745 -5.0042133827 1.9505775177
3 38.4358423623 74.7161029078 -69.9082421615 -35.1792075506 -16.7656045222 16.3947289414 -3.6198327581
4 74.883406584 73.4828685496 -69.8867562442 -5.0052447067 -15.4131949426 15.065925223 14.4940560476
5 61.7429060315 50.3894035464 -69.9068670628 -20.3281415008 -15.3997877302 35.9769366887 1.1899187489
6 59.4242031304 67.0953058663 -69.8938609209 -21.9081872124 -15.423221704 19.7719713691 4.0812929663
7 90.7017399835 66.3198647864 -69.8943765829 7.3872594442 -15.469745877 18.6678816978 20.4932679373
8 43.3590395128 62.9293297379 -73.6622043394 -35.8108362239 -15.1957001636 20.2325721406 0
9 40.5923409116 88.5308028978 -73.6077160531 -31.2608064855 -11.9376329573 -4.7227192179 -12.7598273933
10 23.8609419698 84.6395600321 -73.65269324 -33.7536312605 -15.2801541426 -3.2523949241 -33.0631025258
11 17.1967552631 63.8605007466 -76.6419286488 -33.6005942334 -26.570975045 1.7080444831 -40.4801557753
12 112.3846401909 69.7356099778 -80.6124115775 39.6581332267 -8.4428768859 -0.4859828018 9.1025231955
13 -5.7770761525 76.506481426 -80.5607307844 -61.0971825964 0.409550232 5.9197426435 -25.0002685454
14 -8.8597036819 77.9207131517 -80.5670906159 -33.145436561 0.2532473454 5.9258159961 -61.5692425238
15 -36.6110290806 76.1685509185 -80.3678158947 -72.2165745265 11.1447166646 -0.0391903132 -52.2577616205
16 -35.3651323551 36.5073237197 -79.0065827651 -73.8037822106 52.7478124227 12.1613156805 -32.3100640957
17 -5.3251270437 44.1961881472 -81.8030751716 -71.2213468364 52.7241492657 10.7124200082 -8.0924558984
18 2.8886240199 76.6163747311 -84.1251585237 -69.7672372481 74.4535163503 7.928589969 -1.7550270223
19 10.4090961515 84.9616196088 -84.1484779059 -60.456730373 -18.5233817419 -21.8610327859 0
20 54.5989244672 82.6571833568 -84.1363312007 -15.5816445344 -18.5294550945 -10.4057729963 -7.731091417
21 81.1793533158 80.2358637145 -84.1327788623 11.5328382751 -18.4099360985 -10.3396536667 -3.3667000042
22 38.2612048264 74.9317069261 -84.1652082735 -34.3789573981 -32.3599687196 0 0
23 45.9865093697 73.6787628197 -42.7689502796 -25.1068959911 21.0002209945 17.5849341693 12.4229855056
24 22.7002440684 64.4069878916 -62.7950857265 -31.455039178 7.9418825899 33.6965073683 -22.0264457013
25 -7.8064353671 69.4039247102 -64.5624886372 -46.9387079294 5.7706590252 20.9282574954 -42.2467565451
26 -2.1254442368 74.2813998286 -71.1825002979 -13.416838097 -4.5865844458 22.1780503339 -61.8393921242
27 5.4559906041 77.0098821448 -71.1713849167 -48.8421310206 0.1305770815 11.0492046002 -28.0768227221
28 8.1414437899 69.7912441798 -109.3110080989 -62.2787361616 26.0631052554 -26.4386790901 -18.1101072843
29 8.1236820983 39.0906758264 -91.0631617607 -54.527763109 26.2233042549 12.5954458019 -19.292806765
30 11.0263435842 28.5577634954 -91.6200194418 -56.0312616592 24.2097586755 5.6390506197 0
31 36.628332406 62.8089513052 -98.8949218623 -43.4181687572 24.2570276936 2.887306217 -1.8566697351
32 24.7188316764 87.9824822878 -99.1789943371 -41.2523309958 -8.5307113159 -24.3634832519 -10.7646737591
33 72.4000929083 79.991210736 -99.1548155182 0.9364995161 -8.3708560911 -10.9260186742 -2.1646918458
34 23.3924916765 86.2120999966 -73.4446522646 -46.4581109308 6.0181194969 8.9699407617 -2.1167925741
35 30.0970719078 53.0039818529 -97.8485290411 -46.4597152127 5.9310872079 8.2670934344 -8.9634663386
36 29.1964395496 32.4169207245 -113.7501132082 -48.2284359262 0.5494665255 3.410932346 -18.0847825497
37 47.142795496 53.1601701478 -116.6299136781 -33.5294328753 -21.6354593019 -0.8102196181 -14.3094490461
38 52.5930565222 86.0146587404 -67.4882403222 -27.2043225917 -5.4967279034 -0.6699022541 -2.348095636
39 5.689127131 79.3010830718 -87.5470343635 -64.8126993063 -6.6456228742 -13.3742673328 -10.9887575528
40 -36.490879831 85.2079914607 -76.8147327198 -59.0912000599 3.7261737249 -13.9641273829 -40.7579257144
41 -43.7821688445 66.2628554858 -75.3971778389 -55.7114939138 2.5531572309 -13.9655024816 -48.4137304772
42 -18.0355654751 62.0254315203 -77.0001418623 -56.2921293434 -15.9961794991 -23.3165747686 -20.1152876799
43 -25.9848392206 67.5677668642 -69.5084322121 -71.3935206538 20.9554156949 11.0399799797 -15.5277865016
44 -34.3248128865 59.3506353495 -64.9300983585 -78.7725868015 26.2126472399 7.4840320158 -12.2919500578
45 -26.2237053253 93.5622317757 -72.0755123174 -77.1128999564 26.2140796344 12.1362201291 -17.8720433204
46 43.6226573943 57.1218295265 -87.7357093655 -23.230974874 23.3228773044 17.0774654501 -0.0433729051
47 20.543000674 69.8960954563 -85.5268997694 -25.9198658066 77.8772256551 22.5696096911 -8.9078321367
48 -0.940166446 22.5041779109 -94.648101389 -58.6892701666 70.7468231905 20.9154232408 -8.9639247048
49 0.1180293058 33.0162345782 -92.8632805614 -67.671758704 61.8440903782 13.0295759233 0
50 41.6477291703 62.5570217627 -96.0662292278 -22.0864916783 52.5155926283 11.0115039773 -3.3080864217
51 -9.3205909323 58.9835412902 -86.0922372259 -65.5880830905 52.532036517 11.5678459964 -14.0276111066

View File

@ -1,54 +0,0 @@
from clients._path_setup import ensure_paths
ensure_paths()
from google.protobuf import timestamp_pb2
from clients.base_client import RobotClientBase
from cmvr.api import hlc_command_pb2 as pb
class TouchClient(RobotClientBase):
"""Client to send Touch commands"""
def send(self, u: int, v: int, max_force: int, device_id="hc01"):
"""
u, v: target coordinates
max_force: maximum touch force
device_id: device ID
"""
# Construct request
req = pb.Touch.Request()
req.header.device_id = device_id
ts = timestamp_pb2.Timestamp()
ts.GetCurrentTime()
req.header.timestamp.CopyFrom(ts)
req.u = u
req.v = v
req.max_force = max_force
# Call RPC
try:
resp = self.stub.touch(req, timeout=self.timeout)
success = getattr(resp.header, "success", None)
error_msg = getattr(resp.header, "error_message", "")
timestamp_sec = getattr(resp.header.timestamp, "seconds", 0)
print("Touch RPC call succeeded")
print(f"Success: {success}")
print(f"Error message: {error_msg}")
print(f"Timestamp: {timestamp_sec}")
except Exception as e:
print("Touch RPC call failed:", e)
if __name__ == "__main__":
# Initialize client
client = TouchClient()
# Send Touch command
client.send(u=12, v=13, max_force=1300, device_id="hc01")
# Close client
client.close()

File diff suppressed because one or more lines are too long

View File

@ -25,7 +25,7 @@ _sym_db = _symbol_database.Default()
from cmvr.api import biohead_command_pb2 as cmvr_dot_api_dot_biohead__command__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1e\x63mvr/api/biohead_service.proto\x12\x08\x63mvr.api\x1a\x1e\x63mvr/api/biohead_command.proto2\x85\x03\n\x0e\x42ioHeadService\x12`\n\rSetExpression\x12%.cmvr.api.SetFacialExpression.Request\x1a&.cmvr.api.SetFacialExpression.Feedback\"\x00\x12k\n\x10StreamExpression\x12(.cmvr.api.StreamFacialExpression.Request\x1a).cmvr.api.StreamFacialExpression.Feedback(\x01\x30\x01\x12N\n\x0fGetSystemStatus\x12\x1b.cmvr.api.GetStatus.Request\x1a\x1c.cmvr.api.GetStatus.Feedback\"\x00\x12T\n\rEmergencyStop\x12\x1f.cmvr.api.EmergencyStop.Request\x1a .cmvr.api.EmergencyStop.Feedback\"\x00\x62\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1e\x63mvr/api/biohead_service.proto\x12\x08\x63mvr.api\x1a\x1e\x63mvr/api/biohead_command.proto2\x94\x08\n\x0e\x42ioHeadService\x12`\n\rSetExpression\x12%.cmvr.api.SetFacialExpression.Request\x1a&.cmvr.api.SetFacialExpression.Feedback\"\x00\x12k\n\x10StreamExpression\x12(.cmvr.api.StreamFacialExpression.Request\x1a).cmvr.api.StreamFacialExpression.Feedback(\x01\x30\x01\x12N\n\x0fGetSystemStatus\x12\x1b.cmvr.api.GetStatus.Request\x1a\x1c.cmvr.api.GetStatus.Feedback\"\x00\x12T\n\rEmergencyStop\x12\x1f.cmvr.api.EmergencyStop.Request\x1a .cmvr.api.EmergencyStop.Feedback\"\x00\x12K\n\nSpeakStart\x12\x1c.cmvr.api.SpeakStart.Request\x1a\x1d.cmvr.api.SpeakStart.Feedback\"\x00\x12H\n\tSpeakStop\x12\x1b.cmvr.api.SpeakStop.Request\x1a\x1c.cmvr.api.SpeakStop.Feedback\"\x00\x12<\n\x05Happy\x12\x17.cmvr.api.Happy.Request\x1a\x18.cmvr.api.Happy.Feedback\"\x00\x12\x45\n\x08Surprise\x12\x1a.cmvr.api.Surprise.Request\x1a\x1b.cmvr.api.Surprise.Feedback\"\x00\x12Z\n\x0f\x45xpressionTired\x12!.cmvr.api.ExpressionTired.Request\x1a\".cmvr.api.ExpressionTired.Feedback\"\x00\x12Z\n\x0f\x45xpressionAngry\x12!.cmvr.api.ExpressionAngry.Request\x1a\".cmvr.api.ExpressionAngry.Feedback\"\x00\x12`\n\x11\x45xpressionSadness\x12#.cmvr.api.ExpressionSadness.Request\x1a$.cmvr.api.ExpressionSadness.Feedback\"\x00\x12W\n\x0e\x45xpressionYawn\x12 .cmvr.api.ExpressionYawn.Request\x1a!.cmvr.api.ExpressionYawn.Feedback\"\x00\x62\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@ -33,5 +33,5 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cmvr.api.biohead_service_pb
if not _descriptor._USE_C_DESCRIPTORS:
DESCRIPTOR._loaded_options = None
_globals['_BIOHEADSERVICE']._serialized_start=77
_globals['_BIOHEADSERVICE']._serialized_end=466
_globals['_BIOHEADSERVICE']._serialized_end=1121
# @@protoc_insertion_point(module_scope)

View File

@ -55,6 +55,46 @@ class BioHeadServiceStub(object):
request_serializer=cmvr_dot_api_dot_biohead__command__pb2.EmergencyStop.Request.SerializeToString,
response_deserializer=cmvr_dot_api_dot_biohead__command__pb2.EmergencyStop.Feedback.FromString,
_registered_method=True)
self.SpeakStart = channel.unary_unary(
'/cmvr.api.BioHeadService/SpeakStart',
request_serializer=cmvr_dot_api_dot_biohead__command__pb2.SpeakStart.Request.SerializeToString,
response_deserializer=cmvr_dot_api_dot_biohead__command__pb2.SpeakStart.Feedback.FromString,
_registered_method=True)
self.SpeakStop = channel.unary_unary(
'/cmvr.api.BioHeadService/SpeakStop',
request_serializer=cmvr_dot_api_dot_biohead__command__pb2.SpeakStop.Request.SerializeToString,
response_deserializer=cmvr_dot_api_dot_biohead__command__pb2.SpeakStop.Feedback.FromString,
_registered_method=True)
self.Happy = channel.unary_unary(
'/cmvr.api.BioHeadService/Happy',
request_serializer=cmvr_dot_api_dot_biohead__command__pb2.Happy.Request.SerializeToString,
response_deserializer=cmvr_dot_api_dot_biohead__command__pb2.Happy.Feedback.FromString,
_registered_method=True)
self.Surprise = channel.unary_unary(
'/cmvr.api.BioHeadService/Surprise',
request_serializer=cmvr_dot_api_dot_biohead__command__pb2.Surprise.Request.SerializeToString,
response_deserializer=cmvr_dot_api_dot_biohead__command__pb2.Surprise.Feedback.FromString,
_registered_method=True)
self.ExpressionTired = channel.unary_unary(
'/cmvr.api.BioHeadService/ExpressionTired',
request_serializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionTired.Request.SerializeToString,
response_deserializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionTired.Feedback.FromString,
_registered_method=True)
self.ExpressionAngry = channel.unary_unary(
'/cmvr.api.BioHeadService/ExpressionAngry',
request_serializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionAngry.Request.SerializeToString,
response_deserializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionAngry.Feedback.FromString,
_registered_method=True)
self.ExpressionSadness = channel.unary_unary(
'/cmvr.api.BioHeadService/ExpressionSadness',
request_serializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionSadness.Request.SerializeToString,
response_deserializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionSadness.Feedback.FromString,
_registered_method=True)
self.ExpressionYawn = channel.unary_unary(
'/cmvr.api.BioHeadService/ExpressionYawn',
request_serializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionYawn.Request.SerializeToString,
response_deserializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionYawn.Feedback.FromString,
_registered_method=True)
class BioHeadServiceServicer(object):
@ -91,6 +131,56 @@ class BioHeadServiceServicer(object):
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def SpeakStart(self, request, context):
"""开始说话
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def SpeakStop(self, request, context):
"""停止说话
"""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def Happy(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def Surprise(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def ExpressionTired(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def ExpressionAngry(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def ExpressionSadness(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def ExpressionYawn(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_BioHeadServiceServicer_to_server(servicer, server):
rpc_method_handlers = {
@ -114,6 +204,46 @@ def add_BioHeadServiceServicer_to_server(servicer, server):
request_deserializer=cmvr_dot_api_dot_biohead__command__pb2.EmergencyStop.Request.FromString,
response_serializer=cmvr_dot_api_dot_biohead__command__pb2.EmergencyStop.Feedback.SerializeToString,
),
'SpeakStart': grpc.unary_unary_rpc_method_handler(
servicer.SpeakStart,
request_deserializer=cmvr_dot_api_dot_biohead__command__pb2.SpeakStart.Request.FromString,
response_serializer=cmvr_dot_api_dot_biohead__command__pb2.SpeakStart.Feedback.SerializeToString,
),
'SpeakStop': grpc.unary_unary_rpc_method_handler(
servicer.SpeakStop,
request_deserializer=cmvr_dot_api_dot_biohead__command__pb2.SpeakStop.Request.FromString,
response_serializer=cmvr_dot_api_dot_biohead__command__pb2.SpeakStop.Feedback.SerializeToString,
),
'Happy': grpc.unary_unary_rpc_method_handler(
servicer.Happy,
request_deserializer=cmvr_dot_api_dot_biohead__command__pb2.Happy.Request.FromString,
response_serializer=cmvr_dot_api_dot_biohead__command__pb2.Happy.Feedback.SerializeToString,
),
'Surprise': grpc.unary_unary_rpc_method_handler(
servicer.Surprise,
request_deserializer=cmvr_dot_api_dot_biohead__command__pb2.Surprise.Request.FromString,
response_serializer=cmvr_dot_api_dot_biohead__command__pb2.Surprise.Feedback.SerializeToString,
),
'ExpressionTired': grpc.unary_unary_rpc_method_handler(
servicer.ExpressionTired,
request_deserializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionTired.Request.FromString,
response_serializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionTired.Feedback.SerializeToString,
),
'ExpressionAngry': grpc.unary_unary_rpc_method_handler(
servicer.ExpressionAngry,
request_deserializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionAngry.Request.FromString,
response_serializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionAngry.Feedback.SerializeToString,
),
'ExpressionSadness': grpc.unary_unary_rpc_method_handler(
servicer.ExpressionSadness,
request_deserializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionSadness.Request.FromString,
response_serializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionSadness.Feedback.SerializeToString,
),
'ExpressionYawn': grpc.unary_unary_rpc_method_handler(
servicer.ExpressionYawn,
request_deserializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionYawn.Request.FromString,
response_serializer=cmvr_dot_api_dot_biohead__command__pb2.ExpressionYawn.Feedback.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'cmvr.api.BioHeadService', rpc_method_handlers)
@ -233,3 +363,219 @@ class BioHeadService(object):
timeout,
metadata,
_registered_method=True)
@staticmethod
def SpeakStart(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/cmvr.api.BioHeadService/SpeakStart',
cmvr_dot_api_dot_biohead__command__pb2.SpeakStart.Request.SerializeToString,
cmvr_dot_api_dot_biohead__command__pb2.SpeakStart.Feedback.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)
@staticmethod
def SpeakStop(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/cmvr.api.BioHeadService/SpeakStop',
cmvr_dot_api_dot_biohead__command__pb2.SpeakStop.Request.SerializeToString,
cmvr_dot_api_dot_biohead__command__pb2.SpeakStop.Feedback.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)
@staticmethod
def Happy(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/cmvr.api.BioHeadService/Happy',
cmvr_dot_api_dot_biohead__command__pb2.Happy.Request.SerializeToString,
cmvr_dot_api_dot_biohead__command__pb2.Happy.Feedback.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)
@staticmethod
def Surprise(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/cmvr.api.BioHeadService/Surprise',
cmvr_dot_api_dot_biohead__command__pb2.Surprise.Request.SerializeToString,
cmvr_dot_api_dot_biohead__command__pb2.Surprise.Feedback.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)
@staticmethod
def ExpressionTired(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/cmvr.api.BioHeadService/ExpressionTired',
cmvr_dot_api_dot_biohead__command__pb2.ExpressionTired.Request.SerializeToString,
cmvr_dot_api_dot_biohead__command__pb2.ExpressionTired.Feedback.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)
@staticmethod
def ExpressionAngry(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/cmvr.api.BioHeadService/ExpressionAngry',
cmvr_dot_api_dot_biohead__command__pb2.ExpressionAngry.Request.SerializeToString,
cmvr_dot_api_dot_biohead__command__pb2.ExpressionAngry.Feedback.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)
@staticmethod
def ExpressionSadness(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/cmvr.api.BioHeadService/ExpressionSadness',
cmvr_dot_api_dot_biohead__command__pb2.ExpressionSadness.Request.SerializeToString,
cmvr_dot_api_dot_biohead__command__pb2.ExpressionSadness.Feedback.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)
@staticmethod
def ExpressionYawn(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/cmvr.api.BioHeadService/ExpressionYawn',
cmvr_dot_api_dot_biohead__command__pb2.ExpressionYawn.Request.SerializeToString,
cmvr_dot_api_dot_biohead__command__pb2.ExpressionYawn.Feedback.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)

File diff suppressed because one or more lines are too long

View File

@ -26,7 +26,7 @@ from cmvr.api import common_pb2 as cmvr_dot_api_dot_common__pb2
from cmvr.api import humanoid_robot_command_pb2 as cmvr_dot_api_dot_humanoid__robot__command__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%cmvr/api/humanoid_robot_service.proto\x12\x08\x63mvr.api\x1a\x15\x63mvr/api/common.proto\x1a%cmvr/api/humanoid_robot_command.proto2\xc5\x05\n\x14HumanoidRobotService\x12N\n\ttorqueOff\x12\x1f.cmvr.api.CommandHeader.Request\x1a .cmvr.api.CommandHeader.Feedback\x12M\n\x08torqueOn\x12\x1f.cmvr.api.CommandHeader.Request\x1a .cmvr.api.CommandHeader.Feedback\x12:\n\x05moveJ\x12\x17.cmvr.api.MoveJ.Request\x1a\x18.cmvr.api.MoveJ.Response\x12:\n\x05moveL\x12\x17.cmvr.api.MoveL.Request\x1a\x18.cmvr.api.MoveL.Response\x12=\n\x06speedJ\x12\x18.cmvr.api.SpeedJ.Request\x1a\x19.cmvr.api.SpeedJ.Response\x12=\n\x06speedL\x12\x18.cmvr.api.SpeedL.Request\x1a\x19.cmvr.api.SpeedL.Response\x12@\n\rgetJointState\x12\x16.cmvr.api.JointRequest\x1a\x17.cmvr.api.JointResponse\x12@\n\x07getPose\x12\x19.cmvr.api.GetPose.Request\x1a\x1a.cmvr.api.GetPose.Response\x12U\n\x0e\x63\x61librateZeroQ\x12 .cmvr.api.CalibrateZeroQ.Request\x1a!.cmvr.api.CalibrateZeroQ.Response\x12=\n\x06servoJ\x12\x18.cmvr.api.ServoJ.Request\x1a\x19.cmvr.api.ServoJ.Responseb\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%cmvr/api/humanoid_robot_service.proto\x12\x08\x63mvr.api\x1a\x15\x63mvr/api/common.proto\x1a%cmvr/api/humanoid_robot_command.proto2\x8e\x07\n\x14HumanoidRobotService\x12N\n\ttorqueOff\x12\x1f.cmvr.api.CommandHeader.Request\x1a .cmvr.api.CommandHeader.Feedback\x12M\n\x08torqueOn\x12\x1f.cmvr.api.CommandHeader.Request\x1a .cmvr.api.CommandHeader.Feedback\x12:\n\x05moveJ\x12\x17.cmvr.api.MoveJ.Request\x1a\x18.cmvr.api.MoveJ.Response\x12:\n\x05moveL\x12\x17.cmvr.api.MoveL.Request\x1a\x18.cmvr.api.MoveL.Response\x12=\n\x06speedJ\x12\x18.cmvr.api.SpeedJ.Request\x1a\x19.cmvr.api.SpeedJ.Response\x12=\n\x06speedL\x12\x18.cmvr.api.SpeedL.Request\x1a\x19.cmvr.api.SpeedL.Response\x12@\n\rgetJointState\x12\x16.cmvr.api.JointRequest\x1a\x17.cmvr.api.JointResponse\x12@\n\x07getPose\x12\x19.cmvr.api.GetPose.Request\x1a\x1a.cmvr.api.GetPose.Response\x12U\n\x0e\x63\x61librateZeroQ\x12 .cmvr.api.CalibrateZeroQ.Request\x1a!.cmvr.api.CalibrateZeroQ.Response\x12=\n\x06servoJ\x12\x18.cmvr.api.ServoJ.Request\x1a\x19.cmvr.api.ServoJ.Response\x12R\n\rgetPoseMatrix\x12\x1f.cmvr.api.GetPoseMatrix.Request\x1a .cmvr.api.GetPoseMatrix.Response\x12s\n\x18\x63omputeForwardKinematics\x12*.cmvr.api.ComputeForwardKinematics.Request\x1a+.cmvr.api.ComputeForwardKinematics.Responseb\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@ -34,5 +34,5 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cmvr.api.humanoid_robot_ser
if not _descriptor._USE_C_DESCRIPTORS:
DESCRIPTOR._loaded_options = None
_globals['_HUMANOIDROBOTSERVICE']._serialized_start=114
_globals['_HUMANOIDROBOTSERVICE']._serialized_end=823
_globals['_HUMANOIDROBOTSERVICE']._serialized_end=1024
# @@protoc_insertion_point(module_scope)

View File

@ -85,6 +85,16 @@ class HumanoidRobotServiceStub(object):
request_serializer=cmvr_dot_api_dot_humanoid__robot__command__pb2.ServoJ.Request.SerializeToString,
response_deserializer=cmvr_dot_api_dot_humanoid__robot__command__pb2.ServoJ.Response.FromString,
_registered_method=True)
self.getPoseMatrix = channel.unary_unary(
'/cmvr.api.HumanoidRobotService/getPoseMatrix',
request_serializer=cmvr_dot_api_dot_humanoid__robot__command__pb2.GetPoseMatrix.Request.SerializeToString,
response_deserializer=cmvr_dot_api_dot_humanoid__robot__command__pb2.GetPoseMatrix.Response.FromString,
_registered_method=True)
self.computeForwardKinematics = channel.unary_unary(
'/cmvr.api.HumanoidRobotService/computeForwardKinematics',
request_serializer=cmvr_dot_api_dot_humanoid__robot__command__pb2.ComputeForwardKinematics.Request.SerializeToString,
response_deserializer=cmvr_dot_api_dot_humanoid__robot__command__pb2.ComputeForwardKinematics.Response.FromString,
_registered_method=True)
class HumanoidRobotServiceServicer(object):
@ -150,6 +160,18 @@ class HumanoidRobotServiceServicer(object):
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def getPoseMatrix(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def computeForwardKinematics(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_HumanoidRobotServiceServicer_to_server(servicer, server):
rpc_method_handlers = {
@ -203,6 +225,16 @@ def add_HumanoidRobotServiceServicer_to_server(servicer, server):
request_deserializer=cmvr_dot_api_dot_humanoid__robot__command__pb2.ServoJ.Request.FromString,
response_serializer=cmvr_dot_api_dot_humanoid__robot__command__pb2.ServoJ.Response.SerializeToString,
),
'getPoseMatrix': grpc.unary_unary_rpc_method_handler(
servicer.getPoseMatrix,
request_deserializer=cmvr_dot_api_dot_humanoid__robot__command__pb2.GetPoseMatrix.Request.FromString,
response_serializer=cmvr_dot_api_dot_humanoid__robot__command__pb2.GetPoseMatrix.Response.SerializeToString,
),
'computeForwardKinematics': grpc.unary_unary_rpc_method_handler(
servicer.computeForwardKinematics,
request_deserializer=cmvr_dot_api_dot_humanoid__robot__command__pb2.ComputeForwardKinematics.Request.FromString,
response_serializer=cmvr_dot_api_dot_humanoid__robot__command__pb2.ComputeForwardKinematics.Response.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'cmvr.api.HumanoidRobotService', rpc_method_handlers)
@ -483,3 +515,57 @@ class HumanoidRobotService(object):
timeout,
metadata,
_registered_method=True)
@staticmethod
def getPoseMatrix(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/cmvr.api.HumanoidRobotService/getPoseMatrix',
cmvr_dot_api_dot_humanoid__robot__command__pb2.GetPoseMatrix.Request.SerializeToString,
cmvr_dot_api_dot_humanoid__robot__command__pb2.GetPoseMatrix.Response.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)
@staticmethod
def computeForwardKinematics(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/cmvr.api.HumanoidRobotService/computeForwardKinematics',
cmvr_dot_api_dot_humanoid__robot__command__pb2.ComputeForwardKinematics.Request.SerializeToString,
cmvr_dot_api_dot_humanoid__robot__command__pb2.ComputeForwardKinematics.Response.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)

View File

@ -25,15 +25,15 @@ _sym_db = _symbol_database.Default()
from cmvr.api import common_pb2 as cmvr_dot_api_dot_common__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1d\x63mvr/api/system_command.proto\x12\x08\x63mvr.api\x1a\x15\x63mvr/api/common.proto\"J\n\nDeviceList\x12\x11\n\tdevice_id\x18\x01 \x01(\t\x12)\n\x0b\x64\x65vice_type\x18\x02 \x01(\x0e\x32\x14.cmvr.api.DeviceType\"\xd5\x01\n\x14GetSystemInfoCommand\x1a\t\n\x07Request\x1a\xb1\x01\n\x08\x46\x65\x65\x64\x62\x61\x63k\x12\x30\n\x06header\x18\x01 \x01(\x0b\x32 .cmvr.api.CommandHeader.Feedback\x12\x13\n\x0bsystem_name\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12\n\n\x02os\x18\x05 \x01(\t\x12\x16\n\x0ekernel_version\x18\x06 \x01(\t\x12\x14\n\x0c\x61rchitecture\x18\x07 \x01(\t\"\xf8\x01\n\x16GetSystemStatusCommand\x1a\t\n\x07Request\x1a\xd2\x01\n\x08\x46\x65\x65\x64\x62\x61\x63k\x12\x30\n\x06header\x18\x01 \x01(\x0b\x32 .cmvr.api.CommandHeader.Feedback\x12\x11\n\tcpu_usage\x18\x02 \x01(\x02\x12\x14\n\x0cmem_total_mb\x18\x03 \x01(\x02\x12\x13\n\x0bmem_used_mb\x18\x04 \x01(\x02\x12\x15\n\rdisk_total_gb\x18\x05 \x01(\x02\x12\x14\n\x0c\x64isk_used_gb\x18\x06 \x01(\x02\x12)\n\x0b\x64\x65vice_list\x18\x07 \x03(\x0b\x32\x14.cmvr.api.DeviceList\"\xb6\x01\n\x13UpdateParamsCommand\x1a\x61\n\x07Request\x12/\n\x06header\x18\x01 \x01(\x0b\x32\x1f.cmvr.api.CommandHeader.Request\x12%\n\x06params\x18\x02 \x03(\x0b\x32\x15.cmvr.api.ConfigParam\x1a<\n\x08\x46\x65\x65\x64\x62\x61\x63k\x12\x30\n\x06header\x18\x01 \x01(\x0b\x32 .cmvr.api.CommandHeader.Feedback*}\n\nDeviceType\x12\x07\n\x03\x41GV\x10\x00\x12\x0b\n\x07\x42\x61ttery\x10\x01\x12\n\n\x06\x43\x61mera\x10\x02\x12\x0b\n\x07\x44\x65xHand\x10\x03\x12\x0b\n\x07Gripper\x10\x04\x12\x0e\n\nMicrophone\x10\x05\x12\t\n\x05Robot\x10\x06\x12\x0b\n\x07Speaker\x10\x07\x12\x0b\n\x07Unknown\x10\x14\x62\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1d\x63mvr/api/system_command.proto\x12\x08\x63mvr.api\x1a\x15\x63mvr/api/common.proto\"J\n\nDeviceList\x12\x11\n\tdevice_id\x18\x01 \x01(\t\x12)\n\x0b\x64\x65vice_type\x18\x02 \x01(\x0e\x32\x14.cmvr.api.DeviceType\"\xd5\x01\n\x14GetSystemInfoCommand\x1a\t\n\x07Request\x1a\xb1\x01\n\x08\x46\x65\x65\x64\x62\x61\x63k\x12\x30\n\x06header\x18\x01 \x01(\x0b\x32 .cmvr.api.CommandHeader.Feedback\x12\x13\n\x0bsystem_name\x18\x02 \x01(\t\x12\x0f\n\x07version\x18\x03 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x04 \x01(\t\x12\n\n\x02os\x18\x05 \x01(\t\x12\x16\n\x0ekernel_version\x18\x06 \x01(\t\x12\x14\n\x0c\x61rchitecture\x18\x07 \x01(\t\"\xf8\x01\n\x16GetSystemStatusCommand\x1a\t\n\x07Request\x1a\xd2\x01\n\x08\x46\x65\x65\x64\x62\x61\x63k\x12\x30\n\x06header\x18\x01 \x01(\x0b\x32 .cmvr.api.CommandHeader.Feedback\x12\x11\n\tcpu_usage\x18\x02 \x01(\x02\x12\x14\n\x0cmem_total_mb\x18\x03 \x01(\x02\x12\x13\n\x0bmem_used_mb\x18\x04 \x01(\x02\x12\x15\n\rdisk_total_gb\x18\x05 \x01(\x02\x12\x14\n\x0c\x64isk_used_gb\x18\x06 \x01(\x02\x12)\n\x0b\x64\x65vice_list\x18\x07 \x03(\x0b\x32\x14.cmvr.api.DeviceList\"\xb6\x01\n\x13UpdateParamsCommand\x1a\x61\n\x07Request\x12/\n\x06header\x18\x01 \x01(\x0b\x32\x1f.cmvr.api.CommandHeader.Request\x12%\n\x06params\x18\x02 \x03(\x0b\x32\x15.cmvr.api.ConfigParam\x1a<\n\x08\x46\x65\x65\x64\x62\x61\x63k\x12\x30\n\x06header\x18\x01 \x01(\x0b\x32 .cmvr.api.CommandHeader.Feedback\"\x8a\x01\n\x0eStopAllCommand\x1a:\n\x07Request\x12/\n\x06header\x18\x01 \x01(\x0b\x32\x1f.cmvr.api.CommandHeader.Request\x1a<\n\x08\x46\x65\x65\x64\x62\x61\x63k\x12\x30\n\x06header\x18\x01 \x01(\x0b\x32 .cmvr.api.CommandHeader.Feedback*}\n\nDeviceType\x12\x07\n\x03\x41GV\x10\x00\x12\x0b\n\x07\x42\x61ttery\x10\x01\x12\n\n\x06\x43\x61mera\x10\x02\x12\x0b\n\x07\x44\x65xHand\x10\x03\x12\x0b\n\x07Gripper\x10\x04\x12\x0e\n\nMicrophone\x10\x05\x12\t\n\x05Robot\x10\x06\x12\x0b\n\x07Speaker\x10\x07\x12\x0b\n\x07Unknown\x10\x14\x62\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cmvr.api.system_command_pb2', _globals)
if not _descriptor._USE_C_DESCRIPTORS:
DESCRIPTOR._loaded_options = None
_globals['_DEVICETYPE']._serialized_start=794
_globals['_DEVICETYPE']._serialized_end=919
_globals['_DEVICETYPE']._serialized_start=935
_globals['_DEVICETYPE']._serialized_end=1060
_globals['_DEVICELIST']._serialized_start=66
_globals['_DEVICELIST']._serialized_end=140
_globals['_GETSYSTEMINFOCOMMAND']._serialized_start=143
@ -54,4 +54,10 @@ if not _descriptor._USE_C_DESCRIPTORS:
_globals['_UPDATEPARAMSCOMMAND_REQUEST']._serialized_end=730
_globals['_UPDATEPARAMSCOMMAND_FEEDBACK']._serialized_start=179
_globals['_UPDATEPARAMSCOMMAND_FEEDBACK']._serialized_end=239
_globals['_STOPALLCOMMAND']._serialized_start=795
_globals['_STOPALLCOMMAND']._serialized_end=933
_globals['_STOPALLCOMMAND_REQUEST']._serialized_start=633
_globals['_STOPALLCOMMAND_REQUEST']._serialized_end=691
_globals['_STOPALLCOMMAND_FEEDBACK']._serialized_start=179
_globals['_STOPALLCOMMAND_FEEDBACK']._serialized_end=239
# @@protoc_insertion_point(module_scope)

View File

@ -25,7 +25,7 @@ _sym_db = _symbol_database.Default()
from cmvr.api import system_command_pb2 as cmvr_dot_api_dot_system__command__pb2
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1d\x63mvr/api/system_service.proto\x12\x08\x63mvr.api\x1a\x1d\x63mvr/api/system_command.proto2\xbe\x02\n\rSystemService\x12\x62\n\rGetSystemInfo\x12&.cmvr.api.GetSystemInfoCommand.Request\x1a\'.cmvr.api.GetSystemInfoCommand.Feedback\"\x00\x12h\n\x0fGetSystemStatus\x12(.cmvr.api.GetSystemStatusCommand.Request\x1a).cmvr.api.GetSystemStatusCommand.Feedback\"\x00\x12_\n\x0cUpdateParams\x12%.cmvr.api.UpdateParamsCommand.Request\x1a&.cmvr.api.UpdateParamsCommand.Feedback\"\x00\x62\x06proto3')
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1d\x63mvr/api/system_service.proto\x12\x08\x63mvr.api\x1a\x1d\x63mvr/api/system_command.proto2\x90\x03\n\rSystemService\x12\x62\n\rGetSystemInfo\x12&.cmvr.api.GetSystemInfoCommand.Request\x1a\'.cmvr.api.GetSystemInfoCommand.Feedback\"\x00\x12h\n\x0fGetSystemStatus\x12(.cmvr.api.GetSystemStatusCommand.Request\x1a).cmvr.api.GetSystemStatusCommand.Feedback\"\x00\x12_\n\x0cUpdateParams\x12%.cmvr.api.UpdateParamsCommand.Request\x1a&.cmvr.api.UpdateParamsCommand.Feedback\"\x00\x12P\n\x07StopAll\x12 .cmvr.api.StopAllCommand.Request\x1a!.cmvr.api.StopAllCommand.Feedback\"\x00\x62\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@ -33,5 +33,5 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cmvr.api.system_service_pb2
if not _descriptor._USE_C_DESCRIPTORS:
DESCRIPTOR._loaded_options = None
_globals['_SYSTEMSERVICE']._serialized_start=75
_globals['_SYSTEMSERVICE']._serialized_end=393
_globals['_SYSTEMSERVICE']._serialized_end=475
# @@protoc_insertion_point(module_scope)

View File

@ -49,6 +49,11 @@ class SystemServiceStub(object):
request_serializer=cmvr_dot_api_dot_system__command__pb2.UpdateParamsCommand.Request.SerializeToString,
response_deserializer=cmvr_dot_api_dot_system__command__pb2.UpdateParamsCommand.Feedback.FromString,
_registered_method=True)
self.StopAll = channel.unary_unary(
'/cmvr.api.SystemService/StopAll',
request_serializer=cmvr_dot_api_dot_system__command__pb2.StopAllCommand.Request.SerializeToString,
response_deserializer=cmvr_dot_api_dot_system__command__pb2.StopAllCommand.Feedback.FromString,
_registered_method=True)
class SystemServiceServicer(object):
@ -72,6 +77,12 @@ class SystemServiceServicer(object):
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def StopAll(self, request, context):
"""Missing associated documentation comment in .proto file."""
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
context.set_details('Method not implemented!')
raise NotImplementedError('Method not implemented!')
def add_SystemServiceServicer_to_server(servicer, server):
rpc_method_handlers = {
@ -90,6 +101,11 @@ def add_SystemServiceServicer_to_server(servicer, server):
request_deserializer=cmvr_dot_api_dot_system__command__pb2.UpdateParamsCommand.Request.FromString,
response_serializer=cmvr_dot_api_dot_system__command__pb2.UpdateParamsCommand.Feedback.SerializeToString,
),
'StopAll': grpc.unary_unary_rpc_method_handler(
servicer.StopAll,
request_deserializer=cmvr_dot_api_dot_system__command__pb2.StopAllCommand.Request.FromString,
response_serializer=cmvr_dot_api_dot_system__command__pb2.StopAllCommand.Feedback.SerializeToString,
),
}
generic_handler = grpc.method_handlers_generic_handler(
'cmvr.api.SystemService', rpc_method_handlers)
@ -181,3 +197,30 @@ class SystemService(object):
timeout,
metadata,
_registered_method=True)
@staticmethod
def StopAll(request,
target,
options=(),
channel_credentials=None,
call_credentials=None,
insecure=False,
compression=None,
wait_for_ready=None,
timeout=None,
metadata=None):
return grpc.experimental.unary_unary(
request,
target,
'/cmvr.api.SystemService/StopAll',
cmvr_dot_api_dot_system__command__pb2.StopAllCommand.Request.SerializeToString,
cmvr_dot_api_dot_system__command__pb2.StopAllCommand.Feedback.FromString,
options,
channel_credentials,
insecure,
call_credentials,
compression,
wait_for_ready,
timeout,
metadata,
_registered_method=True)

View File

View File

@ -0,0 +1,46 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# NO CHECKED-IN PROTOBUF GENCODE
# source: cmvr/config/camera_config/camera_config.proto
# Protobuf Python Version: 6.31.1
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import runtime_version as _runtime_version
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
_runtime_version.ValidateProtobufRuntimeVersion(
_runtime_version.Domain.PUBLIC,
6,
31,
1,
'',
'cmvr/config/camera_config/camera_config.proto'
)
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n-cmvr/config/camera_config/camera_config.proto\x12\x0b\x63mvr.config\"\xdc\x02\n\x15RealSenseCameraConfig\x12\n\n\x02id\x18\x01 \x01(\t\x12\x14\n\x0cserialNumber\x18\x02 \x01(\t\x12\r\n\x05width\x18\x03 \x01(\x05\x12\x0e\n\x06height\x18\x04 \x01(\x05\x12\x0b\n\x03\x66ps\x18\x05 \x01(\x05\x12\r\n\x05\x63odec\x18\x06 \x01(\t\x12,\n\x0b\x63\x61mera_mode\x18\x07 \x01(\x0e\x32\x17.cmvr.config.CameraMode\x12,\n\x0bstream_mode\x18\x08 \x01(\x0e\x32\x17.cmvr.config.StreamMode\x12*\n\nalign_mode\x18\t \x01(\x0e\x32\x16.cmvr.config.AlignMode\x12\x13\n\x0b\x62uffer_size\x18\n \x01(\x05\x12\x0c\n\x04sync\x18\x0b \x01(\x08\x12\x0e\n\x06\x65nable\x18\x0c \x01(\x08\x12\x14\n\x0c\x65ncode_width\x18\r \x01(\x05\x12\x15\n\rencode_height\x18\x0e \x01(\x05\"\x93\x02\n\x0fUVCCameraConfig\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0b\n\x03usb\x18\x02 \x01(\t\x12\r\n\x05width\x18\x03 \x01(\x05\x12\x0e\n\x06height\x18\x04 \x01(\x05\x12\x0b\n\x03\x66ps\x18\x05 \x01(\x05\x12\r\n\x05\x63odec\x18\x06 \x01(\t\x12,\n\x0b\x63\x61mera_mode\x18\x07 \x01(\x0e\x32\x17.cmvr.config.CameraMode\x12,\n\x0bstream_mode\x18\x08 \x01(\x0e\x32\x17.cmvr.config.StreamMode\x12\x13\n\x0b\x62uffer_size\x18\t \x01(\x05\x12\x0e\n\x06\x65nable\x18\n \x01(\x08\x12\x14\n\x0c\x65ncode_width\x18\x0b \x01(\x05\x12\x15\n\rencode_height\x18\x0c \x01(\x05\"\x80\x01\n\x0c\x43\x61meraConfig\x12\x31\n\x0buvc_cameras\x18\x01 \x03(\x0b\x32\x1c.cmvr.config.UVCCameraConfig\x12=\n\x11realsense_cameras\x18\x02 \x03(\x0b\x32\".cmvr.config.RealSenseCameraConfig*:\n\nCameraMode\x12\x15\n\x11\x43\x41MERA_MODE_PHOTO\x10\x00\x12\x15\n\x11\x43\x41MERA_MODE_VIDEO\x10\x01*N\n\nStreamMode\x12\x13\n\x0fSTREAM_MODE_RGB\x10\x00\x12\x14\n\x10STREAM_MODE_RGBD\x10\x01\x12\x15\n\x11STREAM_MODE_DEPTH\x10\x02*7\n\tAlignMode\x12\x14\n\x10\x41LIGN_MODE_COLOR\x10\x00\x12\x14\n\x10\x41LIGN_MODE_DEPTH\x10\x01\x62\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cmvr.config.camera_config.camera_config_pb2', _globals)
if not _descriptor._USE_C_DESCRIPTORS:
DESCRIPTOR._loaded_options = None
_globals['_CAMERAMODE']._serialized_start=822
_globals['_CAMERAMODE']._serialized_end=880
_globals['_STREAMMODE']._serialized_start=882
_globals['_STREAMMODE']._serialized_end=960
_globals['_ALIGNMODE']._serialized_start=962
_globals['_ALIGNMODE']._serialized_end=1017
_globals['_REALSENSECAMERACONFIG']._serialized_start=63
_globals['_REALSENSECAMERACONFIG']._serialized_end=411
_globals['_UVCCAMERACONFIG']._serialized_start=414
_globals['_UVCCAMERACONFIG']._serialized_end=689
_globals['_CAMERACONFIG']._serialized_start=692
_globals['_CAMERACONFIG']._serialized_end=820
# @@protoc_insertion_point(module_scope)

View File

@ -0,0 +1,24 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
import warnings
GRPC_GENERATED_VERSION = '1.76.0'
GRPC_VERSION = grpc.__version__
_version_not_supported = False
try:
from grpc._utilities import first_version_is_lower
_version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
except ImportError:
_version_not_supported = True
if _version_not_supported:
raise RuntimeError(
f'The grpc package installed is at version {GRPC_VERSION},'
+ ' but the generated code in cmvr/config/camera_config/camera_config_pb2_grpc.py depends on'
+ f' grpcio>={GRPC_GENERATED_VERSION}.'
+ f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
+ f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
)

View File

@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# NO CHECKED-IN PROTOBUF GENCODE
# source: cmvr/config/dexhand_config/dexhand_config.proto
# Protobuf Python Version: 6.31.1
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import runtime_version as _runtime_version
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
_runtime_version.ValidateProtobufRuntimeVersion(
_runtime_version.Domain.PUBLIC,
6,
31,
1,
'',
'cmvr/config/dexhand_config/dexhand_config.proto'
)
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/cmvr/config/dexhand_config/dexhand_config.proto\x12\x0b\x63mvr.config\"M\n\x15RH56DFTPDexHandConfig\x12\n\n\x02id\x18\x01 \x01(\t\x12\n\n\x02ip\x18\x02 \x01(\t\x12\x0c\n\x04port\x18\x03 \x01(\x05\x12\x0e\n\x06\x65nable\x18\x04 \x01(\x08\"N\n\rDexHandConfig\x12=\n\x11rh56dftp_dexhands\x18\x01 \x03(\x0b\x32\".cmvr.config.RH56DFTPDexHandConfigb\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cmvr.config.dexhand_config.dexhand_config_pb2', _globals)
if not _descriptor._USE_C_DESCRIPTORS:
DESCRIPTOR._loaded_options = None
_globals['_RH56DFTPDEXHANDCONFIG']._serialized_start=64
_globals['_RH56DFTPDEXHANDCONFIG']._serialized_end=141
_globals['_DEXHANDCONFIG']._serialized_start=143
_globals['_DEXHANDCONFIG']._serialized_end=221
# @@protoc_insertion_point(module_scope)

View File

@ -0,0 +1,24 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
import warnings
GRPC_GENERATED_VERSION = '1.76.0'
GRPC_VERSION = grpc.__version__
_version_not_supported = False
try:
from grpc._utilities import first_version_is_lower
_version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
except ImportError:
_version_not_supported = True
if _version_not_supported:
raise RuntimeError(
f'The grpc package installed is at version {GRPC_VERSION},'
+ ' but the generated code in cmvr/config/dexhand_config/dexhand_config_pb2_grpc.py depends on'
+ f' grpcio>={GRPC_GENERATED_VERSION}.'
+ f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
+ f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
)

View File

@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# NO CHECKED-IN PROTOBUF GENCODE
# source: cmvr/config/microphone_config/microphone_config.proto
# Protobuf Python Version: 6.31.1
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import runtime_version as _runtime_version
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
_runtime_version.ValidateProtobufRuntimeVersion(
_runtime_version.Domain.PUBLIC,
6,
31,
1,
'',
'cmvr/config/microphone_config/microphone_config.proto'
)
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n5cmvr/config/microphone_config/microphone_config.proto\x12\x0b\x63mvr.config\"\x80\x01\n\x16\x46\x46MpegMicroPhoneConfig\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08\x63hannels\x18\x02 \x01(\x05\x12\x12\n\nsampleRate\x18\x03 \x01(\x05\x12\x0e\n\x06volume\x18\x04 \x01(\x05\x12\x0e\n\x06\x65nable\x18\x05 \x01(\x08\x12\x14\n\x0cinput_device\x18\x06 \x01(\t\"S\n\x10MicroPhoneConfig\x12?\n\x12\x66\x66mpeg_microphones\x18\x01 \x03(\x0b\x32#.cmvr.config.FFMpegMicroPhoneConfigb\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cmvr.config.microphone_config.microphone_config_pb2', _globals)
if not _descriptor._USE_C_DESCRIPTORS:
DESCRIPTOR._loaded_options = None
_globals['_FFMPEGMICROPHONECONFIG']._serialized_start=71
_globals['_FFMPEGMICROPHONECONFIG']._serialized_end=199
_globals['_MICROPHONECONFIG']._serialized_start=201
_globals['_MICROPHONECONFIG']._serialized_end=284
# @@protoc_insertion_point(module_scope)

View File

@ -0,0 +1,24 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
import warnings
GRPC_GENERATED_VERSION = '1.76.0'
GRPC_VERSION = grpc.__version__
_version_not_supported = False
try:
from grpc._utilities import first_version_is_lower
_version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
except ImportError:
_version_not_supported = True
if _version_not_supported:
raise RuntimeError(
f'The grpc package installed is at version {GRPC_VERSION},'
+ ' but the generated code in cmvr/config/microphone_config/microphone_config_pb2_grpc.py depends on'
+ f' grpcio>={GRPC_GENERATED_VERSION}.'
+ f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
+ f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
)

View File

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# NO CHECKED-IN PROTOBUF GENCODE
# source: cmvr/config/pinocchio_dls_ik_config.proto
# Protobuf Python Version: 6.31.1
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import runtime_version as _runtime_version
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
_runtime_version.ValidateProtobufRuntimeVersion(
_runtime_version.Domain.PUBLIC,
6,
31,
1,
'',
'cmvr/config/pinocchio_dls_ik_config.proto'
)
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n)cmvr/config/pinocchio_dls_ik_config.proto')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cmvr.config.pinocchio_dls_ik_config_pb2', _globals)
if not _descriptor._USE_C_DESCRIPTORS:
DESCRIPTOR._loaded_options = None
# @@protoc_insertion_point(module_scope)

View File

@ -0,0 +1,24 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
import warnings
GRPC_GENERATED_VERSION = '1.76.0'
GRPC_VERSION = grpc.__version__
_version_not_supported = False
try:
from grpc._utilities import first_version_is_lower
_version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
except ImportError:
_version_not_supported = True
if _version_not_supported:
raise RuntimeError(
f'The grpc package installed is at version {GRPC_VERSION},'
+ ' but the generated code in cmvr/config/pinocchio_dls_ik_config_pb2_grpc.py depends on'
+ f' grpcio>={GRPC_GENERATED_VERSION}.'
+ f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
+ f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
)

View File

@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# NO CHECKED-IN PROTOBUF GENCODE
# source: cmvr/config/pinocchio_qp_ik_solver_config.proto
# Protobuf Python Version: 6.31.1
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import runtime_version as _runtime_version
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
_runtime_version.ValidateProtobufRuntimeVersion(
_runtime_version.Domain.PUBLIC,
6,
31,
1,
'',
'cmvr/config/pinocchio_qp_ik_solver_config.proto'
)
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/cmvr/config/pinocchio_qp_ik_solver_config.proto\x12\x0b\x63mvr.config\"\xcd\x01\n\x13PinocchioQpIKConfig\x12\x11\n\turdf_path\x18\x01 \x01(\t\x12\x17\n\x0f\x62\x61se_frame_name\x18\x02 \x01(\t\x12\x19\n\x11\x66lange_frame_name\x18\x03 \x01(\t\x12\x16\n\x0etcp_frame_name\x18\x04 \x01(\t\x12\x0e\n\x06lambda\x18\x05 \x01(\x01\x12\x10\n\x08w_posrot\x18\x06 \x01(\x01\x12\x11\n\tmax_iters\x18\x07 \x01(\x05\x12\x0b\n\x03tol\x18\x08 \x01(\x01\x12\x15\n\rqp_time_limit\x18\t \x01(\x01\x62\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cmvr.config.pinocchio_qp_ik_solver_config_pb2', _globals)
if not _descriptor._USE_C_DESCRIPTORS:
DESCRIPTOR._loaded_options = None
_globals['_PINOCCHIOQPIKCONFIG']._serialized_start=65
_globals['_PINOCCHIOQPIKCONFIG']._serialized_end=270
# @@protoc_insertion_point(module_scope)

View File

@ -0,0 +1,24 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
import warnings
GRPC_GENERATED_VERSION = '1.76.0'
GRPC_VERSION = grpc.__version__
_version_not_supported = False
try:
from grpc._utilities import first_version_is_lower
_version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
except ImportError:
_version_not_supported = True
if _version_not_supported:
raise RuntimeError(
f'The grpc package installed is at version {GRPC_VERSION},'
+ ' but the generated code in cmvr/config/pinocchio_qp_ik_solver_config_pb2_grpc.py depends on'
+ f' grpcio>={GRPC_GENERATED_VERSION}.'
+ f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
+ f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
)

View File

@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
# Generated by the protocol buffer compiler. DO NOT EDIT!
# NO CHECKED-IN PROTOBUF GENCODE
# source: cmvr/config/speaker_config/speaker_conifg.proto
# Protobuf Python Version: 6.31.1
"""Generated protocol buffer code."""
from google.protobuf import descriptor as _descriptor
from google.protobuf import descriptor_pool as _descriptor_pool
from google.protobuf import runtime_version as _runtime_version
from google.protobuf import symbol_database as _symbol_database
from google.protobuf.internal import builder as _builder
_runtime_version.ValidateProtobufRuntimeVersion(
_runtime_version.Domain.PUBLIC,
6,
31,
1,
'',
'cmvr/config/speaker_config/speaker_conifg.proto'
)
# @@protoc_insertion_point(imports)
_sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n/cmvr/config/speaker_config/speaker_conifg.proto\x12\x0b\x63mvr.config\"1\n\x13\x46\x46MpegSpeakerConfig\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0e\n\x06\x65nable\x18\x02 \x01(\x08\"J\n\rSpeakerConfig\x12\x39\n\x0f\x66\x66mpeg_speakers\x18\x01 \x03(\x0b\x32 .cmvr.config.FFMpegSpeakerConfigb\x06proto3')
_globals = globals()
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'cmvr.config.speaker_config.speaker_conifg_pb2', _globals)
if not _descriptor._USE_C_DESCRIPTORS:
DESCRIPTOR._loaded_options = None
_globals['_FFMPEGSPEAKERCONFIG']._serialized_start=64
_globals['_FFMPEGSPEAKERCONFIG']._serialized_end=113
_globals['_SPEAKERCONFIG']._serialized_start=115
_globals['_SPEAKERCONFIG']._serialized_end=189
# @@protoc_insertion_point(module_scope)

View File

@ -0,0 +1,24 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
import warnings
GRPC_GENERATED_VERSION = '1.76.0'
GRPC_VERSION = grpc.__version__
_version_not_supported = False
try:
from grpc._utilities import first_version_is_lower
_version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
except ImportError:
_version_not_supported = True
if _version_not_supported:
raise RuntimeError(
f'The grpc package installed is at version {GRPC_VERSION},'
+ ' but the generated code in cmvr/config/speaker_config/speaker_conifg_pb2_grpc.py depends on'
+ f' grpcio>={GRPC_GENERATED_VERSION}.'
+ f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
+ f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
)

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,24 @@
# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
"""Client and server classes corresponding to protobuf-defined services."""
import grpc
import warnings
GRPC_GENERATED_VERSION = '1.76.0'
GRPC_VERSION = grpc.__version__
_version_not_supported = False
try:
from grpc._utilities import first_version_is_lower
_version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION)
except ImportError:
_version_not_supported = True
if _version_not_supported:
raise RuntimeError(
f'The grpc package installed is at version {GRPC_VERSION},'
+ ' but the generated code in cmvr/config/touch_screen_app_config/touch_screen_app_config_pb2_grpc.py depends on'
+ f' grpcio>={GRPC_GENERATED_VERSION}.'
+ f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}'
+ f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.'
)

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,72 @@
%PDF-1.4
%† Ǽ
1 0 obj
<< /Pages 2 0 R /Type /Catalog >>
endobj
8 0 obj
<< /ExtGState 4 0 R /Font 3 0 R /Pattern 5 0 R
/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /Shading 6 0 R
/XObject 7 0 R >>
endobj
11 0 obj
<< /Annots 10 0 R /Contents 9 0 R
/MediaBox [ 0 0 42.5196850394 42.5196850394 ] /Parent 2 0 R
/Resources 8 0 R /Type /Page >>
endobj
9 0 obj
<< /Filter /FlateDecode /Length 12 0 R >>
stream
xœµ”ËNÃ0E÷óþ×NœØYò<59>º|@UFJðû8 |oZg<5A>ĨjdefŽf:Ý\ï?žwûÛí¥¹º“ n»£xs<78>7ãÊ'tvðÓ˜×Oáäö¾7÷æÕl.¼y<šò(ïÊ÷³|·ó](ÞdÁ§¢®ÜÜ÷óIäAnÌ_܉B¹ÛÍ“é“íÆ},*8ãôÂ4Xç‡Ò,XÔ1¬²øÎÆa˜Ü¸( ÚM6Ž}\ûO?­s1۬ÅدBRA¸د=LPÁ J†çÊÍV<C38D> ¥OÞ/ÆKP§¤×n ¹P¼¼!\–¨/QS
ý¢‡uv„Q<>‰’ ePr„;®Ì”l(ƒccPY<59>ãû¥K…hÍ™¡RI{ËÍú…ìx-CÚF2lÏ”m<E2809D>A˱1¦L Àe‰ÖÍæ9Ôé"+®ô ”l(ƒc£ ü¯Èeq®kCM$¦óŸÈ‚øý± (É <20>akFymž• (žÏ(¯˜TXChÂÄ~ìä ÜÈs*
endstream
endobj
12 0 obj
404
endobj
10 0 obj
[ ]
endobj
3 0 obj
<< >>
endobj
4 0 obj
<< /A1 << /CA 0 /Type /ExtGState /ca 1 >> >>
endobj
5 0 obj
<< >>
endobj
6 0 obj
<< >>
endobj
7 0 obj
<< >>
endobj
2 0 obj
<< /Count 1 /Kids [ 11 0 R ] /Type /Pages >>
endobj
13 0 obj
<< /CreationDate (D:20260318165303+08'00')
/Creator (Matplotlib v3.5.3, https://matplotlib.org)
/Producer (Matplotlib pdf backend v3.5.3) >>
endobj
xref
0 14
0000000000 65535 f
0000000016 00000 n
0000001013 00000 n
0000000869 00000 n
0000000890 00000 n
0000000950 00000 n
0000000971 00000 n
0000000992 00000 n
0000000065 00000 n
0000000350 00000 n
0000000849 00000 n
0000000208 00000 n
0000000829 00000 n
0000001073 00000 n
trailer
<< /Info 13 0 R /Root 1 0 R /Size 14 >>
startxref
1230
%%EOF

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More