Skip to content

Commit d9d1fb8

Browse files
authored
feat: Sentry support (#60)
* style: update clang-format config and fix missing newline * feat(device): add make_pid_calculator() and last_raw_angle() interface - pid_calculator: add make_pid_calculator() factory function with parameter loading - dji_motor: add int last_raw_angle() public getter - lk_motor: add int64_t last_raw_angle() public getter * feat(description): add sentry TF link tree with dual-yaw gimbal joints * feat(sentry): add sentry hardware driver with build dependencies - Add sentry hardware component (GimbalBoard, Topboard, BottomBoard) - Support dual-yaw gimbal, chassis steering, supercap, DR16 remote, referee serial - Update CMakeLists.txt: bump librmcs to v3.1.0 for RmcsBoardLite support - Add std_srvs dependency for robot status service * feat(sentry): add EccentricDualYaw manual gimbal controller and launch config - Add eccentric dual-yaw gimbal controller with manual joystick/mouse input - Cascaded angle-velocity PID with friction and gravity feedforward - Top-bottom yaw coupling compensation via k_top_to_bottom - Launch config with tuned PID/Ff parameters for sentry robot * build(docker): add navigation2 and lua deps for rmcs-navigation, remove dotnet * refactor(sentry): streamline command component and can packet assembly * feat: tool script for status checking * chore: update sentry config
1 parent da2b440 commit d9d1fb8

14 files changed

Lines changed: 1291 additions & 18 deletions

File tree

.clang-format

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,27 +13,25 @@ MaxEmptyLinesToKeep: 1
1313

1414
AlignAfterOpenBracket: AlwaysBreak
1515

16-
AlignArrayOfStructures: Right
17-
1816
AlignConsecutiveAssignments:
19-
Enabled: false
17+
Enabled: false
2018
AlignConsecutiveBitFields:
21-
Enabled: true
22-
AcrossEmptyLines: false
23-
AcrossComments: false
19+
Enabled: true
20+
AcrossEmptyLines: false
21+
AcrossComments: false
2422
AlignConsecutiveDeclarations:
25-
Enabled: false
23+
Enabled: false
2624
AlignConsecutiveMacros:
27-
Enabled: true
28-
AcrossEmptyLines: false
29-
AcrossComments: false
25+
Enabled: true
26+
AcrossEmptyLines: false
27+
AcrossComments: false
3028
# AlignConsecutiveShortCaseStatements:
3129
# Enabled: false
3230
AlignEscapedNewlines: Left
3331
AlignOperands: AlignAfterOperator
3432
AlignTrailingComments:
35-
Kind: Always
36-
OverEmptyLines: 64
33+
Kind: Always
34+
OverEmptyLines: 64
3735
PointerAlignment: Left
3836

3937
AllowAllArgumentsOnNextLine: true

.script/remote-status

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
#!/bin/env bash
2+
3+
set -euo pipefail
4+
5+
# 定义需要查询的服务列表
6+
services=(
7+
"/rmcs/service/robot_status"
8+
)
9+
10+
# 使用 bash 远程执行,并传递服务列表作为参数
11+
ssh remote bash -s -- "${services[@]}" <<'EOF'
12+
set -euo pipefail
13+
14+
# 1. 环境准备
15+
set +u
16+
if [ -f ~/env_setup.bash ]; then
17+
source ~/env_setup.bash
18+
fi
19+
set -u
20+
21+
# 获取所有可用服务列表
22+
all_services="$(ros2 service list 2>/dev/null || true)"
23+
input_services=("${@}")
24+
25+
# 2. 定义单个服务查询函数
26+
call_status_service() {
27+
local service="$1"
28+
29+
if ! printf "%s\n" "$all_services" | grep -Fxq "$service"; then
30+
printf "[warn] service not found: %s\n\n" "$service"
31+
return
32+
fi
33+
34+
printf "=== %s ===\n" "$service"
35+
local raw
36+
raw="$(ros2 service call "$service" std_srvs/srv/Trigger "{}" 2>&1 || true)"
37+
38+
local msg
39+
msg="$(printf "%s\n" "$raw" | sed -n "s/.*message='\(.*\)'.*/\1/p")"
40+
41+
if [[ -z "$msg" ]]; then
42+
printf "[warn] failed to parse message: %s\n%s\n" "$service" "$raw"
43+
else
44+
printf "%b\n" "$msg"
45+
fi
46+
printf "\n"
47+
}
48+
49+
# 3. 并发执行逻辑
50+
tmp_dir=$(mktemp -d)
51+
trap 'rm -rf "${tmp_dir}"' EXIT
52+
53+
for i in "${!input_services[@]}"; do
54+
call_status_service "${input_services[$i]}" > "${tmp_dir}/${i}" 2>&1 &
55+
done
56+
57+
wait
58+
59+
# 4. 按原始顺序汇总输出
60+
for i in "${!input_services[@]}"; do
61+
if [ -f "${tmp_dir}/${i}" ]; then
62+
cat "${tmp_dir}/${i}"
63+
fi
64+
done
65+
EOF

Dockerfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
3030
libceres-dev \
3131
ros-$ROS_DISTRO-rviz2 \
3232
ros-$ROS_DISTRO-foxglove-bridge \
33-
dotnet-sdk-8.0 \
3433
ros-$ROS_DISTRO-pcl-ros ros-$ROS_DISTRO-pcl-conversions ros-$ROS_DISTRO-pcl-msgs && \
34+
ros-$ROS_DISTRO-navigation2 ros-$ROS_DISTRO-nav2-msgs \
35+
lua5.4 liblua5.4-0 liblua5.4-dev && \
3536
apt-get autoremove -y && apt-get clean && \
3637
rm -rf /var/lib/apt/lists/* /tmp/*
3738

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
rmcs_executor:
2+
ros__parameters:
3+
update_rate: 1000.0
4+
components:
5+
- rmcs_core::hardware::Sentry -> sentry_hardware
6+
7+
- rmcs_core::referee::Status -> referee_status
8+
- rmcs_core::referee::Command -> referee_command
9+
10+
- rmcs_core::referee::command::Interaction -> referee_interaction
11+
- rmcs_core::referee::command::interaction::Ui -> referee_ui
12+
13+
- rmcs_core::controller::gimbal::EccentricDualYaw -> gimbal_controller
14+
15+
# - rmcs_core::broadcaster::TfBroadcaster -> tf_broadcaster
16+
17+
- rmcs_core::controller::shooting::FrictionWheelController -> friction_wheel_controller
18+
- rmcs_core::controller::shooting::HeatController -> heat_controller
19+
- rmcs_core::controller::shooting::BulletFeederController17mm -> bullet_feeder_controller
20+
- rmcs_core::controller::pid::PidController -> left_friction_velocity_pid_controller
21+
- rmcs_core::controller::pid::PidController -> right_friction_velocity_pid_controller
22+
- rmcs_core::controller::pid::PidController -> bullet_feeder_velocity_pid_controller
23+
24+
- rmcs_core::controller::chassis::ChassisController -> chassis_controller
25+
- rmcs_core::controller::chassis::ChassisPowerController -> chassis_power_controller
26+
- rmcs_core::controller::chassis::SteeringWheelController -> steering_wheel_controller
27+
28+
# - rmcs::navigation::Navigation -> rmcs_navigation
29+
30+
# The positive direction is the one that battery exists
31+
sentry_hardware:
32+
ros__parameters:
33+
board_serial_top_board: "af-da30"
34+
board_serial_bottom_board: "d4-2184"
35+
board_serial_gimbal_board: "d4-1d2b"
36+
bottom_yaw_motor_zero_point: 26163
37+
top_yaw_motor_zero_point: 4540
38+
pitch_motor_zero_point: 1446
39+
left_front_zero_point: 7131
40+
left_back_zero_point: 3740
41+
right_back_zero_point: 1327
42+
right_front_zero_point: 5147
43+
44+
rmcs_navigation:
45+
ros__parameters:
46+
# 策略名称:
47+
# - fast-push-output "速推前哨站"
48+
# - kill-robots "杀伤优先"
49+
decision: "fast-push-output"
50+
command_vel_name: "/cmd_vel"
51+
mock_context: false
52+
endpoint: "test"
53+
enable_goal_topic_forward: true
54+
55+
gimbal_controller:
56+
ros__parameters:
57+
upper_limit: -0.39518
58+
lower_limit: 0.36
59+
60+
top_yaw_angle_kp: 30.0
61+
top_yaw_angle_ki: 0.0
62+
top_yaw_angle_kd: 0.0
63+
top_yaw_velocity_kp: 2.160
64+
top_yaw_velocity_ki: 0.0
65+
top_yaw_velocity_kd: 0.0
66+
67+
bottom_yaw_angle_kp: 8.8
68+
bottom_yaw_angle_ki: 0.0
69+
bottom_yaw_angle_kd: 0.0
70+
bottom_yaw_velocity_kp: 22.49
71+
bottom_yaw_velocity_ki: 0.0
72+
bottom_yaw_velocity_kd: 0.0
73+
74+
pitch_angle_kp: 40.0
75+
pitch_angle_ki: 0.0
76+
pitch_angle_kd: 0.01
77+
pitch_velocity_kp: 2.5
78+
pitch_velocity_ki: 0.0
79+
pitch_velocity_kd: 0.0
80+
81+
k_top_to_bottom: -1.0
82+
83+
bottom_yaw_viscous_ff_gain: 0.002495
84+
# bottom_yaw_coulomb_ff_gain: 0.457343
85+
# bottom_yaw_coulomb_ff_tanh_gain: 100.0
86+
top_yaw_viscous_ff_gain: 0.231
87+
# top_yaw_coulomb_ff_gain: 1.12
88+
# top_yaw_coulomb_ff_tanh_gain: 100.0
89+
pitch_viscous_ff_gain: 0.33
90+
# pitch_coulomb_ff_gain: 0.95
91+
# pitch_coulomb_ff_tanh_gain: 100.0
92+
pitch_gravity_ff_gain: 2.128
93+
pitch_gravity_ff_phase: 1.438
94+
95+
chassis_controller:
96+
ros__parameters:
97+
navigation_velocity_scale: 1.0
98+
99+
friction_wheel_controller:
100+
ros__parameters:
101+
friction_wheels:
102+
- /gimbal/left_friction
103+
- /gimbal/right_friction
104+
friction_velocities:
105+
- 630.0
106+
- 630.0
107+
friction_soft_start_stop_time: 1.0
108+
109+
heat_controller:
110+
ros__parameters:
111+
heat_per_shot: 10000
112+
reserved_heat: 10000
113+
114+
bullet_feeder_controller:
115+
ros__parameters:
116+
bullets_per_feeder_turn: 9.0
117+
shot_frequency: 28.0
118+
safe_shot_frequency: 10.0
119+
eject_frequency: 15.0
120+
eject_time: 0.15
121+
deep_eject_frequency: 15.0
122+
deep_eject_time: 0.20
123+
single_shot_max_stop_delay: 2.0
124+
125+
left_friction_velocity_pid_controller:
126+
ros__parameters:
127+
measurement: /gimbal/left_friction/velocity
128+
setpoint: /gimbal/left_friction/control_velocity
129+
control: /gimbal/left_friction/control_torque
130+
kp: 0.003436926
131+
ki: 0.00
132+
kd: 0.009373434
133+
134+
right_friction_velocity_pid_controller:
135+
ros__parameters:
136+
measurement: /gimbal/right_friction/velocity
137+
setpoint: /gimbal/right_friction/control_velocity
138+
control: /gimbal/right_friction/control_torque
139+
kp: 0.003436926
140+
ki: 0.00
141+
kd: 0.009373434
142+
143+
bullet_feeder_velocity_pid_controller:
144+
ros__parameters:
145+
measurement: /gimbal/bullet_feeder/velocity
146+
setpoint: /gimbal/bullet_feeder/control_velocity
147+
control: /gimbal/bullet_feeder/control_torque
148+
kp: 0.283
149+
ki: 0.0
150+
kd: 0.0
151+
152+
steering_wheel_controller:
153+
ros__parameters:
154+
mess: 22.0
155+
moment_of_inertia: 0.77852676
156+
vehicle_radius: 0.26870058
157+
wheel_radius: 0.055
158+
friction_coefficient: 0.666
159+
k1: 2.958580e+00
160+
k2: 3.082190e-03
161+
no_load_power: 11.37
162+
chassis_translation_kp: 8.0
163+
chassis_translation_ki: 0.0
164+
chassis_translation_kd: 0.0

rmcs_ws/src/rmcs_core/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ include(FetchContent)
1717
set(BUILD_STATIC_LIBRMCS ON CACHE BOOL "Build static librmcs SDK" FORCE)
1818
FetchContent_Declare(
1919
librmcs
20-
URL https://github.com/Alliance-Algorithm/librmcs/releases/download/v3.0.0/librmcs-sdk-src-3.0.0.zip
21-
URL_HASH SHA256=b39f51c21baacdcbf3f0176119b8850137a108b88a67e12395d37d89e5ef53e8
20+
URL https://github.com/Alliance-Algorithm/librmcs/releases/download/v3.1.0/librmcs-sdk-src-3.1.0.zip
21+
URL_HASH SHA256=07107e251745ddb23f7b3e39edec5d6910be1a197025d167ec9849c5c80dd954
2222
DOWNLOAD_EXTRACT_TIMESTAMP TRUE
2323
)
2424
FetchContent_MakeAvailable(librmcs)

rmcs_ws/src/rmcs_core/package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
<depend>rclcpp</depend>
1313
<depend>std_msgs</depend>
14+
<depend>std_srvs</depend>
1415
<depend>pluginlib</depend>
1516
<depend>tf2</depend>
1617
<depend>tf2_ros</depend>

rmcs_ws/src/rmcs_core/plugins.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
<class type="rmcs_core::hardware::MecanumHero" base_class_type="rmcs_executor::Component" />
33
<class type="rmcs_core::hardware::SteeringHero" base_class_type="rmcs_executor::Component" />
44
<class type="rmcs_core::hardware::OmniInfantry" base_class_type="rmcs_executor::Component" />
5+
<class type="rmcs_core::hardware::Sentry" base_class_type="rmcs_executor::Component" />
56
<class type="rmcs_core::hardware::SteeringInfantry" base_class_type="rmcs_executor::Component" />
67
<class type="rmcs_core::controller::chassis::ChassisController" base_class_type="rmcs_executor::Component" />
78
<class type="rmcs_core::controller::chassis::ChassisPowerController" base_class_type="rmcs_executor::Component" />
@@ -10,6 +11,7 @@
1011
<class type="rmcs_core::controller::gimbal::SimpleGimbalController" base_class_type="rmcs_executor::Component" />
1112
<class type="rmcs_core::controller::gimbal::HeroGimbalController" base_class_type="rmcs_executor::Component" />
1213
<class type="rmcs_core::controller::gimbal::DualYawController" base_class_type="rmcs_executor::Component" />
14+
<class type="rmcs_core::controller::gimbal::EccentricDualYaw" base_class_type="rmcs_executor::Component" />
1315
<class type="rmcs_core::controller::gimbal::PlayerViewer" base_class_type="rmcs_executor::Component" />
1416
<class type="rmcs_core::controller::shooting::FrictionWheelController" base_class_type="rmcs_executor::Component" />
1517
<class type="rmcs_core::controller::shooting::HeatController" base_class_type="rmcs_executor::Component" />

rmcs_ws/src/rmcs_core/src/controller/gimbal/dual_yaw_controller.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,4 +145,4 @@ class DualYawController
145145

146146
#include <pluginlib/class_list_macros.hpp>
147147

148-
PLUGINLIB_EXPORT_CLASS(rmcs_core::controller::gimbal::DualYawController, rmcs_executor::Component)
148+
PLUGINLIB_EXPORT_CLASS(rmcs_core::controller::gimbal::DualYawController, rmcs_executor::Component)

0 commit comments

Comments
 (0)