Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
104 commits
Select commit Hold shift + click to select a range
4ebc692
moved arm controller to navigation
nevenjohnson Nov 2, 2024
39e4ab4
added arm motor timeouts to sim
nevenjohnson Nov 2, 2024
c0d8d95
motor timeouts
nevenjohnson Nov 4, 2024
f5ba467
added motor velocity controls to sim (UNTESTED)
nevenjohnson Nov 4, 2024
5aa54d4
updated sim arm velocity controls
nevenjohnson Nov 5, 2024
3c05d70
motor timeout constexpr
nevenjohnson Nov 4, 2024
dc6dc49
velocity control skeleton code
nevenjohnson Nov 7, 2024
c63eb3a
small tweaks
nevenjohnson Nov 21, 2024
e06337c
velocity control initial implementation
nevenjohnson Nov 24, 2024
a97c2fb
fixed some cases in which arm would sag
nevenjohnson Nov 24, 2024
b0e9cb2
updated to latest IK code from ROS1 (that was tested on rover)
nevenjohnson Feb 9, 2025
9d4e636
refactored joint limits
nevenjohnson Feb 9, 2025
e0fd6d3
no more carrots
nevenjohnson Feb 12, 2025
5c74d0f
arm ik testing 2/12
Feb 13, 2025
e937aba
merged in main
nevenjohnson Feb 23, 2025
4309427
removed no longer needed constant
nevenjohnson Feb 23, 2025
c8b10b9
added max speed for arm to scale velocity
nevenjohnson Feb 26, 2025
4d45d2c
added script for drawing circle and M
nevenjohnson Feb 26, 2025
c7f0a5e
gripper working in sim
nevenjohnson Mar 26, 2025
88fbc2f
forgot gripper fbx
nevenjohnson Mar 26, 2025
62e3da6
initial scuffed gripper/joint a typing ik
nevenjohnson Mar 26, 2025
cfe4903
merged in main
nevenjohnson Mar 28, 2025
a930f63
flip gripper direction
nevenjohnson Mar 28, 2025
0b29d39
Merge branch 'main' into nlj/arm-controller
alisonryckman Oct 21, 2025
ea738b6
initial clickIk work
AlexBarba24 Oct 22, 2025
a31c9aa
fix action build + start portin
alisonryckman Oct 23, 2025
ccfaef6
more changes
alisonryckman Oct 24, 2025
2d6a968
Merge branch 'main' into avb/click-ik
Oct 26, 2025
b49bb6d
click ik compiles
alisonryckman Oct 26, 2025
d56d72c
clang + bind -> lambdas
alisonryckman Oct 27, 2025
b8eec61
Merge remote-tracking branch 'origin/ajr/click-ik' into avb/click-ik
Nov 6, 2025
7893e41
Added camera angles, working on costmap for rover_three.js
KellM65536 Nov 20, 2025
52308a6
changed rover3d stuff
KellM65536 Dec 4, 2025
a016937
ansible fix
kevinjin0420 Dec 5, 2025
be0fe07
icd compliance final
kevinjin0420 Dec 8, 2025
e4603c1
removed api tools, modified sim and teleop for controllerdatatable ch…
kevinjin0420 Dec 24, 2025
476d7b8
removed api tools, modified sim and teleop for controllerdatatable ch…
kevinjin0420 Dec 24, 2025
19869c9
icd script
kevinjin0420 Dec 25, 2025
2239f38
updated script to check for exact spec, ability to --fix one single t…
kevinjin0420 Dec 26, 2025
ac0f185
icd compliance using script and linter
kevinjin0420 Dec 26, 2025
f734ef6
correct icd and modified cpp for successful build
kevinjin0420 Dec 29, 2025
8dd3cfb
styling to add contrast and uniformity, sensor data mock script
kevinjin0420 Jan 6, 2026
7a8434f
gamepad-display update, draggable grid layout impl, optimizations for…
kevinjin0420 Jan 7, 2026
1d69f0e
Merge remote-tracking branch 'origin/main' into teleop-merge-main
kevinjin0420 Jan 8, 2026
e1e767f
added logic for teleop's new led logic
kevinjin0420 Jan 9, 2026
90e20c6
Merge branch 'teleop-merge-main' into teleop-grid
kevinjin0420 Jan 9, 2026
fcce102
lock map pan when grid unlocked
kevinjin0420 Jan 9, 2026
04340d7
split nav state into its own component
kevinjin0420 Jan 9, 2026
232ee86
remove npm lockfile
kevinjin0420 Jan 9, 2026
455bfbd
Merge remote-tracking branch 'origin/main' into teleop-merge-main
kevinjin0420 Jan 11, 2026
1504eec
Working sim ik
Jan 11, 2026
5dc9da0
Merged main fixed conflicts
Jan 11, 2026
e096108
consolidate repeated code to composable and components, bun update
kevinjin0420 Jan 11, 2026
2f4cad4
Merge remote-tracking branch 'origin/main' into teleop-merge-main
kevinjin0420 Jan 11, 2026
2b4d886
added request overriding
Jan 11, 2026
4791977
http wrapper for error handling and notification update, notification…
kevinjin0420 Jan 13, 2026
8507816
fix lint error, simplify notif center logic
kevinjin0420 Jan 13, 2026
64a46b1
camera_client: refactor
Jan 14, 2026
081273a
added theming
kevinjin0420 Jan 13, 2026
afd5da3
camera_client: allow drag and drop videobox movement
Jan 14, 2026
b00c23d
camera_client: resize based on column width
Jan 14, 2026
1c3766d
camera_client: fix overlapping text by adding grey background
Jan 14, 2026
6930114
cameras: prefer h265 over h264
Jan 15, 2026
0827455
bun update
kevinjin0420 Jan 16, 2026
386f7a4
cameras: improve gst_camera_server structure
Jan 16, 2026
1c0a348
add drive initialization for science
kevinjin0420 Jan 18, 2026
38e43da
removed compile_commands and restored to plural
kevinjin0420 Jan 21, 2026
81942aa
restore imagetargets
kevinjin0420 Jan 21, 2026
b607f6d
deprecate jointstate from sim
kevinjin0420 Jan 21, 2026
1a09e95
change grid detection method, latency benchmark styling
kevinjin0420 Jan 21, 2026
7321e3c
removed buggy rate limiter on drive
kevinjin0420 Jan 21, 2026
a13db2e
backend cleanup, patches for robustness, clarity, thread safety, and …
kevinjin0420 Jan 21, 2026
61b886b
update icd script
kevinjin0420 Jan 21, 2026
029bcf6
style
kevinjin0420 Jan 21, 2026
25f4167
fix old controls bug, update sim to subscribe to new icd topics
kevinjin0420 Jan 21, 2026
b1401ac
arm and drive publishers to asyncio, limit 30hz
kevinjin0420 Jan 23, 2026
e6cce4e
added limit for incoming ros messages
kevinjin0420 Jan 23, 2026
4094c30
style
kevinjin0420 Jan 23, 2026
fc12415
data monitor on frontend
kevinjin0420 Jan 23, 2026
acd1cfd
added drive to ES, switch to singlethreadedexecutor, update lockfile
kevinjin0420 Jan 24, 2026
9c4b05e
Merge remote-tracking branch 'origin/main' into teleop-merge-main
kevinjin0420 Jan 24, 2026
faeb5f4
Merge remote-tracking branch 'origin/cameras26' into skj/camera-client
kevinjin0420 Jan 25, 2026
da0d9c6
Merge remote-tracking branch 'origin/main' into skj/camera-client
kevinjin0420 Jan 28, 2026
b04c293
stream worky, use mode:=sim to spin up gst server
kevinjin0420 Jan 28, 2026
c1e09ff
clickik impl'd, tested with mock server
kevinjin0420 Jan 28, 2026
95e6222
Added point and image sampling
Jan 30, 2026
7242be8
Removed service includes
Feb 5, 2026
d77407f
Merged Camera Client
Feb 6, 2026
1eb347a
icd changes
ejhon1116 Mar 16, 2026
e9c54f4
fixed initial arm position
ejhon1116 Mar 17, 2026
9190fdf
Merged camera client testing branch -avb
AlexBarba24 Mar 17, 2026
c85e12c
Merge branch 'main' into avb/click-ik
AlexBarba24 Mar 17, 2026
f197cf8
Merge remote-tracking branch 'origin/nav/icd-changes' into avb/click-ik
AlexBarba24 Mar 17, 2026
113c758
Fixed merge conflicts from avb/click-ik-testing
AlexBarba24 Mar 24, 2026
363c8af
Refactored to meet style check
AlexBarba24 Mar 24, 2026
1c39b9a
Updated ik_sample interface to match IK message
AlexBarba24 Mar 24, 2026
91deefc
Updated ArmStatus to report velocity command failures
AlexBarba24 Mar 24, 2026
2bf7a03
Removed ArmStatus publisher
AlexBarba24 Mar 25, 2026
a32b3c1
merge
jbrhm Mar 26, 2026
cb5477b
Merge remote-tracking branch 'origin/main' into avb/click-ik
AlexBarba24 Mar 31, 2026
4558d3d
Fixed image scaling bug
AlexBarba24 Mar 31, 2026
017b982
Merged main
AlexBarba24 Mar 31, 2026
7e09b83
Fixed style
AlexBarba24 Apr 9, 2026
a41a27c
Merged main
AlexBarba24 Apr 9, 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
Empty file added �A@@-�@8
Empty file.
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,7 @@ state_machine/state_log.txt

data/*.png
data/raw-pano-images

# Dynamixel Ignores
.catkin_tools/
.dynamixel_sdk/
28 changes: 21 additions & 7 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ endif ()

find_package(rclpy REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_action REQUIRED)
find_package(rclcpp_components REQUIRED)
find_package(ament_cmake REQUIRED)
find_package(ament_cmake_python REQUIRED)
Expand All @@ -66,6 +67,7 @@ find_package(urdf REQUIRED)
find_package(std_srvs REQUIRED)
find_package(magic_enum REQUIRED)
find_package(yaml_cpp_vendor REQUIRED)
find_package(dynamixel_sdk REQUIRED)

find_package(Assimp NAMES Assimp assimp REQUIRED)
find_package(Bullet REQUIRED)
Expand Down Expand Up @@ -118,7 +120,7 @@ endif()
find_package(PkgConfig REQUIRED)
pkg_search_module(NetLink libnl-3.0 IMPORTED_TARGET QUIET)
pkg_search_module(NetLinkRoute libnl-route-3.0 IMPORTED_TARGET QUIET)
pkg_search_module(Gst gstreamer-1.0 IMPORTED_TARGET QUIET)
pkg_search_module(Gst gstreamer-1.0 IMPORTED_TARGET QUIET) # if this is failing try: `sudo apt install libunwind-dev`
pkg_search_module(GstApp gstreamer-app-1.0 IMPORTED_TARGET QUIET)
pkg_search_module(LibUdev libudev IMPORTED_TARGET QUIET)

Expand Down Expand Up @@ -237,7 +239,7 @@ target_link_libraries(rover_gps_driver parameter_utils)

mrover_add_node(heading_filter localization/heading_filter.cpp)
ament_target_dependencies(heading_filter rclcpp rcutils sensor_msgs builtin_interfaces message_filters)
target_link_libraries(heading_filter lie)
target_link_libraries(heading_filter lie parameter_utils)

mrover_add_node(pose_filter localization/pose_filter/*.cpp)
ament_target_dependencies(pose_filter rclcpp tf2 tf2_ros geometry_msgs sensor_msgs)
Expand Down Expand Up @@ -323,18 +325,23 @@ if (EXISTS ${MROVER_EMBEDDED_ROOT_DIR} AND NOT APPLE)
mrover_add_header_only_library(motor esw/motor)
target_link_libraries(motor INTERFACE can_device units parameter_utils)

mrover_add_header_only_library(servo esw/servo)
target_link_libraries(servo INTERFACE units parameter_utils)

mrover_add_header_only_library(science esw/science)
target_link_libraries(science INTERFACE can_device units)

macro(mrover_add_esw_bridge_node name sources)
mrover_add_node(${name} ${sources})
ament_target_dependencies(${name} rclcpp std_srvs)
target_link_libraries(${name} can_device units motor science)
ament_target_dependencies(${name} rclcpp std_srvs dynamixel_sdk)
target_link_libraries(${name} can_device units motor science servo)
endmacro()

# esw hardware bridge nodes
mrover_add_esw_bridge_node(drive_hw_bridge esw/drive_hw_bridge.cpp)
mrover_add_esw_bridge_node(arm_hw_bridge esw/arm_hw_bridge.cpp)
mrover_add_esw_bridge_node(science_hw_bridge esw/science_hw_bridge.cpp)
mrover_add_esw_bridge_node(mast_gimbal_hw_bridge esw/mast_gimbal_hw_bridge.cpp)
endif()

mrover_add_node(differential_drive_controller esw/differential_drive_controller.cpp)
Expand All @@ -345,6 +352,13 @@ mrover_add_node(arm_controller navigation/arm_controller/arm_controller.cpp navi
target_link_libraries(arm_controller lie)
ament_target_dependencies(arm_controller rclcpp)

# Click IK
mrover_add_component(click_ik navigation/click_ik/*.cpp navigation/click_ik/pch.hpp ClickIK)
mrover_ament_component(click_ik rclcpp rclcpp_components tf2 tf2_ros)
mrover_link_component(click_ik lie parameter_utils)

mrover_executable_from_component(click_ik navigation/click_ik/main.cpp click_ik_component)

if (Gst_FOUND AND GstApp_FOUND)
mrover_add_node(usb_camera esw/usb_camera/*.cpp esw/usb_camera/pch.hpp)
target_link_libraries(usb_camera PkgConfig::Gst PkgConfig::GstApp opencv_core opencv_imgcodecs parameter_utils)
Expand All @@ -366,12 +380,12 @@ if (NetLink_FOUND AND NetLinkRoute_FOUND)
endif ()

# Teleop Qt5 Camera Client
find_package(Qt5 5.15 REQUIRED COMPONENTS Widgets Multimedia MultimediaWidgets)
find_package(Qt5 5.15 REQUIRED COMPONENTS Widgets)

mrover_add_node(camera_client teleoperation/camera_client/*.*pp teleoperation/camera_client/include/pch.hpp)
target_include_directories(camera_client PRIVATE teleoperation/camera_client/include)
target_link_libraries(camera_client gst_utils Qt::Widgets Qt::Multimedia Qt::MultimediaWidgets opencv_core opencv_imgcodecs)
ament_target_dependencies(camera_client rclcpp std_srvs sensor_msgs)
target_link_libraries(camera_client gst_utils Qt::Widgets PkgConfig::Gst X11 opencv_core opencv_imgcodecs)
ament_target_dependencies(camera_client rclcpp rclcpp_action std_srvs sensor_msgs)
set_target_properties(camera_client PROPERTIES
AUTOMOC ON
AUTORCC ON
Expand Down
6 changes: 3 additions & 3 deletions action/ClickIk.action
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
uint32 point_in_image_x
uint32 point_in_image_y
float32 point_in_image_x
float32 point_in_image_y
---
bool success
---
float32 distance
float32 distance
8 changes: 8 additions & 0 deletions action/IkImageSample.action
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
uint32 w
uint32 h
float32 scale
---
bool[] success
---
uint32 completed
uint32 total
1 change: 1 addition & 0 deletions ansible/roles/build/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@
- ros-humble-xacro
- ros-humble-magic-enum
- ros-humble-rtcm-msgs
- ros-humble-dynamixel-sdk
# TODO (ali): why does this need to be installed manually
- libboost-dev
- qtbase5-dev
Expand Down
1 change: 1 addition & 0 deletions ansible/roles/ci/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@
- ros-humble-xacro
- ros-humble-rtcm-msgs
- ros-humble-magic-enum
- ros-humble-dynamixel-sdk
# TODO (ali): why does this need to be installed manually
- libboost-dev
- qtmultimedia5-dev
Expand Down
1 change: 1 addition & 0 deletions ansible/roles/esw/files/rules/99-u2d2.rules
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", SYMLINK+="u2d2", GROUP="mrover"
37 changes: 17 additions & 20 deletions config/cameras.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,18 @@
static_cam:
address: 10.1.0.2 # if using RTP, should be set to IP of basestation
port: 8081
# camera source can be one of three options: dev_node, dev_path, or image_topic
# if no camera source is specified, defaults to videotestsrc
dev_node: "/dev/static_cam"
dev_path: ""
# crop_left: PIXELS
# crop_right: PIXELS
# crop_top: PIXELS
# crop_bottom: PIXELS
stream:
pixel_format: MJPG # from v4l2-ctl -d DEV_NODE --list-formats-ext
pixel_format: YUYV # from v4l2-ctl -d DEV_NODE --list-formats-ext
width: 640
height: 480
framerate: 15
framerate: 30
codec: H265
bitrate: 1000000
image_capture:
Expand All @@ -18,15 +23,14 @@
height: 720
framerate: 5
boom_cam:
address: 10.1.0.2 # if using RTP, should be set to IP of basestation
address: 10.1.0.2
port: 8082
dev_node: "/dev/boomcam"
dev_path: ""
stream:
pixel_format: MJPG # from v4l2-ctl -d DEV_NODE --list-formats-ext
pixel_format: YUYV
width: 640
height: 480
framerate: 15
framerate: 30
codec: H265
bitrate: 1000000
image_capture:
Expand All @@ -37,13 +41,12 @@
mob_cam_left:
address: 10.1.0.2
port: 8083
dev_node: "/dev/mobcam_left"
dev_path: ""
dev_node: "/dev/mob_cam_left"
stream:
pixel_format: MJPG # from v4l2-ctl -d DEV_NODE --list-formats-ext
pixel_format: YUYV
width: 640
height: 480
framerate: 15
framerate: 30
codec: H265
bitrate: 1000000
image_capture:
Expand All @@ -54,10 +57,9 @@
mob_cam_right:
address: 10.1.0.2
port: 8084
dev_node: "/dev/mobcam_right"
dev_path: ""
dev_node: "/dev/mob_cam_right"
stream:
pixel_format: MJPG # from v4l2-ctl -d DEV_NODE --list-formats-ext
pixel_format: MJPG
width: 640
height: 480
framerate: 15
Expand All @@ -72,8 +74,6 @@
address: 10.1.0.2
port: 8085
image_topic: "/long_range_cam/image"
dev_node: ""
dev_path: ""
stream:
pixel_format: ABGR32
width: 640
Expand All @@ -90,10 +90,9 @@
address: 10.1.0.2
port: 8086
dev_node: "/dev/zed_mini"
dev_path: ""
crop_right: 672
stream:
pixel_format: YUYV # from v4l2-ctl -d DEV_NODE --list-formats-ext
pixel_format: YUYV
width: 1344
height: 376
framerate: 15
Expand All @@ -108,8 +107,6 @@
address: 10.1.0.2
port: 8087
image_topic: "/zed/left/image"
dev_node: ""
dev_path: ""
stream:
pixel_format: ABGR32 # https://www.kernel.org/doc/html/v4.9/media/uapi/v4l/pixfmt-packed-rgb.html
width: 1280
Expand Down
6 changes: 5 additions & 1 deletion config/localization.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,12 @@ heading_filter:
ros__parameters:
imu_watchdog_timeout: 1.0
mag_heading_noise: 10.0
rtk_heading_noise: 0.01
rtk_heading_noise: 0.00001
drive_forward_heading_noise: 0.0001
process_noise: 0.000001
minimum_linear_speed: 0.4
rover_heading_change_threshold: 0.05
use_mag: false

pose_filter:
ros__parameters:
Expand Down
55 changes: 27 additions & 28 deletions config/mast_gimbal.yaml
Original file line number Diff line number Diff line change
@@ -1,30 +1,29 @@
mast_gimbal_hw_bridge:
ros__parameters:
mast_gimbal_pitch:
gear_ratio: 1.0
is_inverted: false
driver_voltage: 10.5
motor_max_voltage: 12.0
quad_present: false
abs_present: false
mast_gimbal_yaw:
gear_ratio: 1.0
is_inverted: true
driver_voltage: 10.5
motor_max_voltage: 12.0
quad_present: true
quad_ratio: 0.001013780932 # approx. 1000:1 per https://www.pololu.com/file/0J1487/pololu-micro-metal-gearmotors-rev-6-1.pdf
abs_present: false
calibration_throttle: 0.5
limit_switch_0_present: true
limit_switch_0_enabled: true
limit_switch_0_limits_forward: false
limit_switch_0_active_high: false
limit_switch_0_used_for_readjustment: true
limit_switch_0_readjust_position: 0.0
limit_switch_1_present: true
limit_switch_1_enabled: true
limit_switch_1_limits_forward: true
limit_switch_1_active_high: false
limit_switch_1_used_for_readjustment: true
limit_switch_1_readjust_position: 0.0
u2d2_device: "/dev/u2d2"
gimbal_pitch:
id: 3
position_multiplier: 1.0
forward_limit: 0.0
reverse_limit: 1.57
position_p: 5000.0
position_i: 0.0
position_d: 0.0
velocity_p: 0.0
velocity_i: 0.0
current_limit: 1750.0
profile_acceleration: 10.0
profile_velocity: 60.0
gimbal_yaw:
id: 4
position_multiplier: 6.25
forward_limit: 6.108
reverse_limit: 0.174
position_p: 4000.0
position_i: 0.0
position_d: 0.0
velocity_p: 0.0
velocity_i: 0.0
current_limit: 1000.0
profile_acceleration: 100.0
profile_velocity: 300.0
16 changes: 16 additions & 0 deletions config/science.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
science_hw_bridge:
ros__parameters:
u2d2_device: "/dev/u2d2"
funnel: # TODO(eric) validate
id: 5
position_multiplier: 5.859375
forward_limit: 6.28
reverse_limit: 0.0
position_p: 5000.0
position_i: 0.0
position_d: 0.0
velocity_p: 0.0
velocity_i: 0.0
current_limit: 1750.0
profile_acceleration: 60.0
profile_velocity: 500.0
6 changes: 3 additions & 3 deletions esw/drive_hw_bridge.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ namespace mrover {

using namespace std::chrono_literals;

class MotorTestBridge final : public rclcpp::Node {
class DriveHWBridge final : public rclcpp::Node {
public:
MotorTestBridge() : Node{"drive_hw_bridge"} {
DriveHWBridge() : Node{"drive_hw_bridge"} {
// all initialization is done in the init() function to allow for the usage of shared_from_this()
}

Expand Down Expand Up @@ -147,7 +147,7 @@ namespace mrover {

auto main(int const argc, char** argv) -> int {
rclcpp::init(argc, argv);
auto const drive_bridge = std::make_shared<mrover::MotorTestBridge>();
auto const drive_bridge = std::make_shared<mrover::DriveHWBridge>();
drive_bridge->init();
rclcpp::spin(drive_bridge);
rclcpp::shutdown();
Expand Down
Loading