Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
763e1e2
feat: add px4 and external sensor dependencies
Embers-of-the-Fire Mar 13, 2026
1029c9b
feat!: add flight control code
Embers-of-the-Fire Mar 13, 2026
f5e77d7
docs: update uxrce dds client docs
Embers-of-the-Fire Mar 13, 2026
34963fa
feat!: update bringup to support booting xrce agent
Embers-of-the-Fire Mar 13, 2026
25c9aab
feat!: add flight gimbal control
Embers-of-the-Fire Mar 13, 2026
3b84e63
fix: fix gimbal control
Embers-of-the-Fire Mar 14, 2026
7bcd7db
feat: update uxrcedds compile infra
Embers-of-the-Fire Mar 15, 2026
7d32933
feat: update flight external hardware configuration
Embers-of-the-Fire Mar 15, 2026
00e9d0e
feat: use group fork instead of upstream
Embers-of-the-Fire Mar 15, 2026
f4801f1
feat: update fire control
Embers-of-the-Fire Mar 15, 2026
dd72b1b
feat: update odin driver version
Embers-of-the-Fire Mar 15, 2026
5e5451a
feat: @zlq04222 note
Embers-of-the-Fire Mar 16, 2026
455961e
feat: update flight hardware control code
Embers-of-the-Fire Mar 16, 2026
e7f2d60
feat: lock micro-xrce-dds-agent version
Embers-of-the-Fire Mar 17, 2026
bb32a0a
feat: edit position design
Embers-of-the-Fire Mar 17, 2026
490a0a4
fix: fix ENU of odom to NED
Embers-of-the-Fire Mar 18, 2026
127ecbb
feat: migrate to mavros on ros2
Embers-of-the-Fire Apr 7, 2026
32a01c5
feat: add local position estimator
Embers-of-the-Fire Apr 13, 2026
d11d3f4
feat: remove px4 dependencies and add mavros fix
Embers-of-the-Fire Apr 16, 2026
cbecb5c
feat: update odin compatibility
Embers-of-the-Fire Apr 18, 2026
5fe76ac
fix: restore dlss
Embers-of-the-Fire Apr 18, 2026
e5a789e
feat: add flight gimbal hold support
noskillzheng May 2, 2026
c338b95
docs: add flight self-stabilization dependencies
noskillzheng May 2, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@
[submodule "rmcs_ws/src/hikcamera"]
path = rmcs_ws/src/hikcamera
url = https://github.com/Alliance-Algorithm/ros2-hikcamera.git
branch =2.0
[submodule "rmcs_ws/src/serial"]
path = rmcs_ws/src/serial
url = https://github.com/Alliance-Algorithm/ros2-serial.git
[submodule "rmcs_ws/src/odin_ros_driver"]
path = rmcs_ws/src/odin_ros_driver
url = https://github.com/Alliance-Algorithm/odin_ros_driver.git
[submodule "rmcs_ws/src/rmcs_auto_aim_v2"]
path = rmcs_ws/src/rmcs_auto_aim_v2
url = https://github.com/Alliance-Algorithm/rmcs_auto_aim_v2.git
6 changes: 6 additions & 0 deletions .script/build-rmcs
Original file line number Diff line number Diff line change
Expand Up @@ -56,5 +56,11 @@ cmake_args=(
"${cmake_toolchain_args[@]}"
)

if [[ "${ROS_VERSION}" == "2" ]]; then
cmake_args+=("-DBUILD_SYSTEM=ROS2")
elif [[ "${ROS_VERSION}" == "1" ]]; then
cmake_args+=("-DBUILD_SYSTEM=ROS1")
fi

CLICOLOR_FORCE=1 NINJA_STATUS="" \
colcon build "${colcon_args[@]}" "$@" --cmake-args "${cmake_args[@]}"
67 changes: 67 additions & 0 deletions .script/rclcpp-log
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#!/bin/bash

set -euo pipefail

: "${RMCS_PATH:=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"

header="${RMCS_PATH}/rmcs_ws/src/rmcs_core/src/debug/rclcpp_diagnostic_log.hpp"

usage() {
cat <<'EOF'
Usage: rclcpp-log <insert|cancel>

Commands:
insert Enable RMCS diagnostic RCLCPP logs
cancel Disable RMCS diagnostic RCLCPP logs
EOF
}

set_state() {
local value="$1"

if [[ ! -f "${header}" ]]; then
echo "> ERROR: Cannot find ${header}"
exit 1
fi

python3 - "$header" "$value" <<'PY'
from pathlib import Path
import re
import sys

path = Path(sys.argv[1])
value = sys.argv[2]
text = path.read_text(encoding="utf-8")
updated, count = re.subn(
r"^#define RMCS_RCLCPP_DIAGNOSTIC_LOGS [01]$",
f"#define RMCS_RCLCPP_DIAGNOSTIC_LOGS {value}",
text,
count=1,
flags=re.MULTILINE,
)

if count != 1:
raise SystemExit(f"> ERROR: Cannot update {path}")

path.write_text(updated, encoding="utf-8")
PY
}

case "${1:-}" in
insert)
set_state 1
echo "> RMCS diagnostic RCLCPP logs enabled. Rebuild rmcs_core to apply."
;;
cancel)
set_state 0
echo "> RMCS diagnostic RCLCPP logs disabled. Rebuild rmcs_core to apply."
;;
-h|--help|help|"")
usage
;;
*)
echo "> ERROR: Unknown command '${1}'"
usage
exit 1
;;
esac
24 changes: 19 additions & 5 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -30,19 +30,31 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
libceres-dev \
ros-$ROS_DISTRO-rviz2 \
ros-$ROS_DISTRO-foxglove-bridge \
ros-$ROS_DISTRO-cv-bridge \
ros-$ROS_DISTRO-mavros ros-$ROS_DISTRO-mavros-extras \
dotnet-sdk-8.0 \
ros-$ROS_DISTRO-pcl-ros ros-$ROS_DISTRO-pcl-conversions ros-$ROS_DISTRO-pcl-msgs && \
apt-get autoremove -y && apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/*


# Install openvino runtime
RUN wget https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB && \
apt-key add ./GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB && \
rm ./GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB && \
echo "deb https://apt.repos.intel.com/openvino ubuntu24 main" > /etc/apt/sources.list.d/intel-openvino.list && \
RUN apt-get update && apt-get install -y --no-install-recommends gnupg ca-certificates && \
mkdir -p /etc/apt/keyrings && \
wget -qO- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB | \
gpg --dearmor -o /etc/apt/keyrings/intel-openvino.gpg && \
printf 'Acquire::https::apt.repos.intel.com::Verify-Peer "false";\n' > /etc/apt/apt.conf.d/99intel-openvino-tls && \
echo "deb [signed-by=/etc/apt/keyrings/intel-openvino.gpg] https://apt.repos.intel.com/openvino ubuntu24 main" > /etc/apt/sources.list.d/intel-openvino.list && \
apt-get update && \
apt-get install -y --no-install-recommends openvino-2025.2.0 && \
apt-get install -y --no-install-recommends \
openvino-2025.2.0 \
ocl-icd-libopencl1 \
intel-opencl-icd \
libze1 \
libze-intel-gpu1 && \
rm -f /etc/apt/apt.conf.d/99intel-openvino-tls \
/etc/apt/sources.list.d/intel-openvino.list \
/etc/apt/keyrings/intel-openvino.gpg && \
apt-get autoremove -y && apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/*

Expand Down Expand Up @@ -92,6 +104,7 @@ ARG LLVM_VERSION=22
RUN mkdir -p /etc/apt/keyrings && \
wget -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | gpg --dearmor -o /etc/apt/keyrings/apt.llvm.org.gpg && \
chmod 644 /etc/apt/keyrings/apt.llvm.org.gpg && \
printf 'Acquire::https::apt.llvm.org::Verify-Peer "false";\n' > /etc/apt/apt.conf.d/99llvm-tls && \
echo "deb [signed-by=/etc/apt/keyrings/apt.llvm.org.gpg] https://apt.llvm.org/noble/ llvm-toolchain-noble-${LLVM_VERSION} main" \
> /etc/apt/sources.list.d/llvm.list && \
apt-get update && \
Expand All @@ -107,6 +120,7 @@ RUN mkdir -p /etc/apt/keyrings && \
update-alternatives --install /usr/bin/llvm-ar llvm-ar /usr/bin/llvm-ar-${LLVM_VERSION} 50 && \
update-alternatives --install /usr/bin/llvm-ranlib llvm-ranlib /usr/bin/llvm-ranlib-${LLVM_VERSION} 50 && \
update-alternatives --install /usr/bin/ld.lld ld.lld /usr/bin/ld.lld-${LLVM_VERSION} 50 && \
rm -f /etc/apt/apt.conf.d/99llvm-tls /etc/apt/sources.list.d/llvm.list /etc/apt/keyrings/apt.llvm.org.gpg && \
apt-get autoremove -y && apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/*

# Generate/load ssh key and setup unison
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -277,3 +277,5 @@ build-rmcs && wait-sync && attach-remote -r
```

可以触发 RMCS 构建,`wait-sync` 等待文件同步完成,接下来重启 RMCS 守护进程后,显示实时输出。

ps: 无人机自稳需要 `ros-jazzy-mavros` 和 `ros-jazzy-cv-bridge` 这两个包。
2 changes: 1 addition & 1 deletion rmcs_ws/src/hikcamera
Submodule hikcamera updated 52 files
+15 −19 CMakeLists.txt
+99 −2 README.md
+64 −0 include/hikcamera/capturer.hpp
+0 −62 include/hikcamera/image_capturer.hpp
+3 −5 package.xml
+23 −0 src/capturer.cpp
+259 −0 src/capturer.impl.hpp
+74 −0 src/errors.hpp
+0 −364 src/image_capturer.cpp
+ src/sdk/lib/MvFGProducerCML.cti
+ src/sdk/lib/MvFGProducerCXP.cti
+ src/sdk/lib/MvFGProducerGEV.cti
+ src/sdk/lib/MvFGProducerXoF.cti
+ src/sdk/lib/MvProducerGEV.cti
+ src/sdk/lib/MvProducerU3V.cti
+ src/sdk/lib/libCLAllSerial_gcc447_v3_0.so
+ src/sdk/lib/libCLAllSerial_gcc485_v3_0.so
+ src/sdk/lib/libCLProtocol_gcc447_v3_0.so
+ src/sdk/lib/libCLProtocol_gcc485_v3_0.so
+ src/sdk/lib/libCLSerCOM.so
+ src/sdk/lib/libCLSerHvc.so
+ src/sdk/lib/libFormatConversion.so
+ src/sdk/lib/libGCBase_gcc447_v3_0.so
+ src/sdk/lib/libGCBase_gcc485_v3_0.so
+ src/sdk/lib/libGenCP_gcc447_v3_0.so
+ src/sdk/lib/libGenCP_gcc485_v3_0.so
+ src/sdk/lib/libLog_gcc447_v3_0.so
+ src/sdk/lib/libLog_gcc485_v3_0.so
+ src/sdk/lib/libMVFGControl.so
+ src/sdk/lib/libMVGigEVisionSDK.so
+ src/sdk/lib/libMVGigEVisionSDK.so
+ src/sdk/lib/libMVGigEVisionSDK.so.4.3.0.3
+ src/sdk/lib/libMVGigEVisionSDK.so.4.6.1.2
+ src/sdk/lib/libMVRender.so
+ src/sdk/lib/libMediaProcess.so
+ src/sdk/lib/libMvCamLVision.so
+ src/sdk/lib/libMvCamLVision.so
+ src/sdk/lib/libMvCamLVision.so.4.3.0.3
+ src/sdk/lib/libMvCamLVision.so.4.6.1.2
+ src/sdk/lib/libMvCameraControl.so
+ src/sdk/lib/libMvCameraControl.so
+ src/sdk/lib/libMvCameraControl.so.4.3.0.4
+ src/sdk/lib/libMvCameraControl.so.4.6.1.3
+ src/sdk/lib/libMvCameraControlWrapper.so
+ src/sdk/lib/libMvCameraControlWrapper.so
+ src/sdk/lib/libMvCameraControlWrapper.so.4.3.0.3
+ src/sdk/lib/libMvCameraControlWrapper.so.4.5.0.1
+ src/sdk/lib/libMvUsb3vTL.so
+ src/sdk/lib/libMvUsb3vTL.so
+ src/sdk/lib/libMvUsb3vTL.so.4.3.0.3
+ src/sdk/lib/libMvUsb3vTL.so.4.6.0.3
+ src/sdk/lib/libavutil.so
+ src/sdk/lib/liblog4cpp_gcc447_v3_0.so
+ src/sdk/lib/liblog4cpp_gcc485_v3_0.so
+ src/sdk/lib/libswscale.so
+81 −0 src/sdk/update.sh
+191 −0 src/utility.hpp
1 change: 1 addition & 0 deletions rmcs_ws/src/odin_ros_driver
Submodule odin_ros_driver added at dbcb02
1 change: 1 addition & 0 deletions rmcs_ws/src/rmcs_auto_aim_v2
Submodule rmcs_auto_aim_v2 added at bccd90
233 changes: 233 additions & 0 deletions rmcs_ws/src/rmcs_bringup/config/flight.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,233 @@
rmcs_executor:
ros__parameters:
update_rate: 1000.0
components:
- rmcs_core::hardware::Flight -> flight_hardware
- rmcs_core::hardware::FlightMavros -> flight_mavros_hardware
- rmcs_core::referee::Status -> referee_status

- rmcs_core::controller::gimbal::HoldController -> hold_controller
- rmcs_core::controller::gimbal::FlightGimbalController -> gimbal_controller
- rmcs::AutoAimComponent -> auto_aim_component
- rmcs_core::controller::pid::ErrorPidController -> yaw_angle_pid_controller
- rmcs_core::controller::pid::ErrorPidController -> pitch_angle_pid_controller

- rmcs_core::controller::shooting::FrictionWheelController -> friction_wheel_controller
- rmcs_core::controller::shooting::HeatController -> heat_controller
- rmcs_core::controller::shooting::BulletFeederController17mm -> bullet_feeder_controller
- rmcs_core::controller::pid::PidController -> left_friction_velocity_pid_controller
- rmcs_core::controller::pid::PidController -> right_friction_velocity_pid_controller
- rmcs_core::controller::pid::PidController -> bullet_feeder_velocity_pid_controller

- rmcs_core::referee::command::Interaction -> referee_interaction
#- rmcs_core::referee::command::interaction::Ui -> referee_ui
#- rmcs_core::referee::app::ui::Flight -> referee_ui_flight

- rmcs_core::referee::Command -> referee_command


- rmcs_core::broadcaster::ValueBroadcaster -> value_broadcaster
- rmcs_core::broadcaster::TfBroadcaster -> tf_broadcaster

mavros:
ros__parameters:
enabled: false
fcu_url: serial:///dev/ttyACM0:921600
gcs_url: ""
target_system_id: 1
target_component_id: 1
fcu_protocol: v2.0
respawn: true
respawn_delay: 1.0

odin_ros_driver:
ros__parameters:
# FlightMavros reads odom -> odin1_base_link TF and forwards it to MAVROS vision pose.
enabled: true
config_file: "/rmcs_install/share/odin_ros_driver/config/control_command.yaml" # Empty uses odin_ros_driver/config/control_command.yaml
node_name: host_sdk_sample
respawn: true
respawn_delay: 1.0

auto_aim_runtime:
ros__parameters:
enabled: true
package: rmcs_auto_aim_v2
executable: rmcs_auto_aim_v2_runtime
node_name: auto_aim_runtime
respawn: true
respawn_delay: 1.0

value_broadcaster:
ros__parameters:
forward_list:
- /gimbal/pitch/angle
- /gimbal/pitch/velocity
- /gimbal/pitch/torque
# - /gimbal/pitch/control_torque
- /gimbal/pitch/control_angle_error
- /gimbal/pitch/control_velocity
- /gimbal/pitch/velocity_imu

- /gimbal/yaw/angle
- /gimbal/yaw/velocity
- /gimbal/yaw/torque
- /gimbal/yaw/control_torque
- /gimbal/yaw/control_angle_error
- /gimbal/yaw/control_velocity

tf_broadcaster:
ros__parameters:
tf: /tf

flight_hardware:
ros__parameters:
board_serial: "d4-9d44"
yaw_motor_zero_point: 38745
pitch_motor_zero_point: 51586

flight_mavros_hardware:
ros__parameters:
target_frame_id: odom
source_frame_id: odin1_base_link
output_rate: 30.0
sensor_roll_offset_rad: 3.141592653589793
sensor_pitch_offset_rad: 1.5707963267948966
sensor_yaw_offset_rad: 0.0
mavros_pose_topic: /mavros/vision_pose/pose
mavros_pose_frame_id: odom

referee_status:
ros__parameters:
path: /dev/tty0

hold_controller:
ros__parameters:
joystick_deadband: 0.03
mouse_deadband: 0.5

gimbal_controller:
ros__parameters:
upper_limit: -0.15
lower_limit: 0.50
yaw_upper_limit: -0.349
yaw_lower_limit: 3.14
hold_level_threshold: 0.01
hold_yaw_kd: 8.0
hold_pitch_kd: 0.5

yaw_angle_pid_controller:
ros__parameters:
measurement: /gimbal/yaw/control_angle_error
feedforward: /gimbal/yaw/hold_feedforward
control: /gimbal/yaw/control_torque
kp: 70.8943
ki: 0.0
kd: 1440.0

pitch_angle_pid_controller:
ros__parameters:
measurement: /gimbal/pitch/control_angle_error
feedforward: /gimbal/pitch/hold_feedforward
control: /gimbal/pitch/control_velocity
kp: 10.0
ki: 0.0
kd: 400.0

friction_wheel_controller:
ros__parameters:
friction_wheels:
- /gimbal/left_friction
- /gimbal/right_friction
friction_velocities:
- 740.0
- 740.0
friction_soft_start_stop_time: 1.0

heat_controller:
ros__parameters:
heat_per_shot: 10
reserved_heat: 0

bullet_feeder_controller:
ros__parameters:
bullets_per_feeder_turn: 8.0
shot_frequency: 20.0
safe_shot_frequency: 10.0
eject_frequency: 10.0
eject_time: 0.05
deep_eject_frequency: 5.0
deep_eject_time: 0.2
single_shot_max_stop_delay: 2.0

shooting_recorder:
ros__parameters:
friction_wheel_count: 2
# 1: trigger, 2: timing
log_mode: 1

left_friction_velocity_pid_controller:
ros__parameters:
measurement: /gimbal/left_friction/velocity
setpoint: /gimbal/left_friction/control_velocity
control: /gimbal/left_friction/control_torque
kp: 0.003436926
ki: 0.00
kd: 0.009373434

right_friction_velocity_pid_controller:
ros__parameters:
measurement: /gimbal/right_friction/velocity
setpoint: /gimbal/right_friction/control_velocity
control: /gimbal/right_friction/control_torque
kp: 0.003436926
ki: 0.00
kd: 0.009373434

bullet_feeder_velocity_pid_controller:
ros__parameters:
measurement: /gimbal/bullet_feeder/velocity
setpoint: /gimbal/bullet_feeder/control_velocity
control: /gimbal/bullet_feeder/control_torque
kp: 0.583
ki: 0.0
kd: 0.0

auto_aim_controller:
ros__parameters:
# capture
use_video: false # If true, use video stream instead of camera.
video_path: "/workspaces/RMCS/rmcs_ws/resources/1.avi"
exposure_time: 3
invert_image: false
# identifier
armor_model_path: "/models/mlp.onnx"
# pnp
fx: 1.722231837421459e+03
fy: 1.724876404292754e+03
cx: 7.013056440882832e+02
cy: 5.645821718351237e+02
k1: -0.064232403853946
k2: -0.087667493884102
k3: 0.792381808294582

# tracker
armor_predict_duration: 500
# controller
gimbal_predict_duration: 100
yaw_error: 0.02
pitch_error: -0.01
shoot_velocity: 28.0
predict_sec: 0.095
# etc
buff_predict_duration: 200
buff_model_path: "/models/buff_nocolor_v6.onnx"
omni_exposure: 1000.0
record_fps: 120
debug: false # Setup in actual using.Debug mode is used when referee is not ready
debug_color: 0 # 0 For blue while 1 for red. mine
debug_robot_id: 4
debug_buff_mode: false
record: true
raw_img_pub: false # Set false in actual use
image_viewer_type: 2
Loading