Radial roller cam synthesis and kinematic analysis in MoonBit

git clone https://github.com/huahai29/mooncam.git
cd mooncam
npm run build
npm run servenode bin/mooncam.mjs examples/workshop.json --out artifacts/workshopmoon add huahai29/mooncam@0.4.1import {
"huahai29/mooncam" @cam,
"moonbitlang/core/math",
}let p = @cam.example_program(@cam.Polynomial4567)
let g : @cam.Geometry = {
base_radius: 40.0,
roller_radius: 4.0,
offset: 0.0,
}
match @cam.analyze(p, g, 720, @math.PI / 6.0, 2.0 * @math.PI) {
Ok(a) => println(a.max_pressure * 180.0 / @math.PI)
Err(message) => println(message)
}pub(all) struct Analysis {
points : Array[CamPoint]
pressure_sample_index : Int
offset_factor_sample_index : Int
max_pressure : Double
pressure_angle : Double
min_offset_factor : Double
min_offset_factor_angle : Double
max_velocity : Double
max_acceleration : Double
max_jerk : Double
jerk_jumps : Int
sampled_local_feasible : Bool
crossings : CrossingCheck
crossing_witnesses : Array[CrossingWitness]
crossing_witnesses_truncated : Bool
sampled_feasible : Bool
nominal_resolution : Int
}pub(all) struct CamPoint {
theta : Double
motion : Motion
pitch_x : Double
pitch_y : Double
x : Double
y : Double
normal_x : Double
normal_y : Double
pressure : Double
curvature : Double
offset_factor : Double
}pub(all) struct ConstraintDiagnostic {
code : String
value : Double
limit : Double
margin : Double
passed : Bool
location : Location
}pub(all) enum CrossingCheck {
NotChecked
Checked(Int)
Indeterminate(Int, Int)
Failed(String)
}pub(all) struct CrossingReport {
crossings : Int
pair_visits : Int
uncertain_pairs : Int
witnesses : Array[CrossingWitness]
witnesses_truncated : Bool
}pub(all) struct CrossingWitness {
kind : String
edge_a : Int
edge_b : Int
}pub(all) enum ErrorCode {
InvalidJson
InvalidRequest
InputTooLarge
CalculationFailed
CheckIndeterminate
NoCandidateFound
InternalError
NoResult
}pub(all) struct Geometry {
base_radius : Double
roller_radius : Double
offset : Double
}pub(all) enum Law {
Cycloidal
Polynomial345
Polynomial4567
}pub(all) struct Location {
sample_index : Int?
segment_index : Int
theta_rad : Double
segment_start_rad : Double
segment_end_rad : Double
law : String
periodic_endpoint : Bool
}pub(all) struct Metrics {
pressure_sample_index : Int
offset_factor_sample_index : Int
max_pressure : Double
pressure_angle : Double
min_offset_factor : Double
min_offset_factor_angle : Double
max_velocity : Double
max_acceleration : Double
max_jerk : Double
jerk_jumps : Int
sampled_local_feasible : Bool
sample_count : Int
nominal_resolution : Int
}pub(all) struct Motion {
s : Double
v : Double
a : Double
j : Double
}pub(all) struct SamplingComparison {
levels : Array[SamplingLevel]
pressure_change : Double
offset_factor_change : Double
state_consistent : Bool
}pub(all) struct SamplingLevel {
nominal_resolution : Int
sample_count : Int
pressure : ConstraintDiagnostic
offset_factor : ConstraintDiagnostic
crossings : CrossingCheck
state : String
}pub(all) enum SearchError {
InvalidInput(String)
NumericalFailure(String)
IndeterminateGeometry(String)
NoCandidate(Int)
}fn compare_sampling(p : Program, g : Geometry, resolutions : Array[Int], pressure_limit : Double, omega : Double) -> Result[SamplingComparison, String]fn contract_json() -> Stringfn error_exit_code(code : String) -> Intfn input_limit_bytes() -> Intfn run_json(input : String) -> Stringfn search_base(p : Program, roller_radius : Double, offset : Double, lower : Double, upper : Double, intervals : Int, resolution : Int, pressure_limit : Double, omega : Double) -> Result[SearchResult, SearchError]fn validate_segments_json(input : String) -> StringInstall
Download zipRadial roller cam synthesis and kinematic analysis in MoonBit