Initial commit: extract M20 sim2real into ROS1 invicta project

Source: DeepRoboticsLab/sdk_deploy (BSD-3-Clause), M20 sim2real part only.

Packages:
- invicta_msgs: JointCommandArray, MotionCommand, MotionState; standard messages
  (sensor_msgs/JointState, sensor_msgs/Imu) elsewhere; shared motion value defs.
- invicta_deploy: state machine (idle/standup/rl/joint-damping/lie-down), ONNX
  policy with per-gait models, auto RL entry after standup with readiness checks,
  safety loop, gait->model table; no protocol/network code.
- invicta_remote: vendor basic_server protocol (UDP + JSON, proto.md V1.2.0),
  header/MsgId, 0xE0xx error codes, motion/usage-mode/gait translation, telemetry
  1002/3,4,5,6 (2/10/2/2 Hz); publishes /motion_command, subscribes /motion_state.
- invicta_hardware: joint/IMU bridge skeleton (SocketCAN I/O is TODO), publishes
  sensor_msgs/JointState + sensor_msgs/Imu, consumes /joint_commands.

Verified on ROS Noetic (Ubuntu 20.04) in docker: clean catkin_make, 200 Hz joint
state / 50 Hz RL commands / 20 Hz state report, protocol conformance (MotionParam,
gait preconditions, error codes), telemetry push, and end-to-end switching of two
policy models with a real remote controller.
This commit is contained in:
2026-10-21 00:46:29 +08:00
commit cf70b1a1d7
2016 changed files with 489092 additions and 0 deletions
@@ -0,0 +1,14 @@
<launch>
<!-- RL 部署节点:状态机 + 策略推理。参数在节点的私有命名空间下。
无硬件台架自测时(invicta_hardware 只发零位状态)关掉两个自检,
否则站立完成后永远不会自动进入 RL:
roslaunch invicta_deploy invicta_deploy.launch rl_require_pose:=false rl_require_imu:=false
-->
<arg name="rl_require_pose" default="true"/>
<arg name="rl_require_imu" default="true"/>
<node pkg="invicta_deploy" type="invicta_deploy" name="invicta_deploy" output="screen">
<rosparam command="load" file="$(find invicta_deploy)/config/invicta_deploy.yaml"/>
<param name="rl/require_pose" value="$(arg rl_require_pose)"/>
<param name="rl/require_imu" value="$(arg rl_require_imu)"/>
</node>
</launch>