5 Commits

Author SHA1 Message Date
d12dda5f86 Added position interface for joint state publisher 2026-02-08 00:56:27 +01:00
31bf071476 Fix scripts 2026-02-06 19:47:33 +01:00
a0f08f7b76 Swapped AMC0 and AMC1 2026-02-05 11:50:57 +01:00
6156657c2e Fixed firmware and toid_bot_description 2026-01-28 17:10:29 +01:00
d9f179bda5 Created script for testing wheels 2026-01-05 17:05:42 +01:00
13 changed files with 102 additions and 23 deletions

View File

@@ -1,5 +1,9 @@
#pragma once #pragma once
// STEP_PIN 26
// DIR_PIN 27
//############## CONFIG STEPPERS ################ //############## CONFIG STEPPERS ################
#define DIR_PIN_A 26 #define DIR_PIN_A 26
#define DIR_PIN_B 16 #define DIR_PIN_B 16
@@ -10,7 +14,7 @@
#define SM_B 1 #define SM_B 1
#define PULSE_PER_REV (1 / 3200.0) #define PULSE_PER_REV (1 / 3200.0)
#define SPEED_SET_TIMEOUT 1000 #define SPEED_SET_TIMEOUT 1000000
//############################################### //###############################################
//================ CONFIG ENCODERS ===================== //================ CONFIG ENCODERS =====================

View File

@@ -213,8 +213,6 @@ void stepper_fifo(char c, uint8_t itf) {
double vr = btod(stepper_instr + 10); double vr = btod(stepper_instr + 10);
set_speeds(vl, vr); set_speeds(vl, vr);
last_speed_change = SPEED_SET_TIMEOUT;
// tud_cdc_n_write(itf, (uint8_t const *) stepper_instr, 18); // tud_cdc_n_write(itf, (uint8_t const *) stepper_instr, 18);
// tud_cdc_n_write_flush(itf); // tud_cdc_n_write_flush(itf);
} }
@@ -265,10 +263,6 @@ int main()
while (true) { while (true) {
if(last_speed_change--) {
set_speeds(0, 0);
last_speed_change = SPEED_SET_TIMEOUT;
}
tud_task(); tud_task();
sleep_ms(1); sleep_ms(1);
} }

View File

@@ -34,7 +34,7 @@ void start_pulse(PIO pio, uint sm, uint offset, uint pin, uint freq) {
void update_sm(PIO pio, uint sm, const uint pin ,double v) { void update_sm(PIO pio, uint sm, const uint pin ,double v) {
double u_v = fabs(v); double u_v = fabs(v);
if(u_v > 0.0005) if(u_v > 0.00005)
pio->txf[sm] = (int)((double)clock_get_hz(clk_sys) * PULSE_PER_REV / u_v) / 2 - 5; pio->txf[sm] = (int)((double)clock_get_hz(clk_sys) * PULSE_PER_REV / u_v) / 2 - 5;
else else
pio->txf[sm] = 0; pio->txf[sm] = 0;

View File

@@ -46,7 +46,7 @@ def generate_launch_description():
condition=UnlessCondition(LaunchConfiguration('local_test')), condition=UnlessCondition(LaunchConfiguration('local_test')),
parameters=[{ parameters=[{
'odom': "odom", 'odom': "odom",
'serial_path': "/dev/ttyACM0", 'serial_path': "/dev/ttyACM1",
}], }],
emulate_tty=True, emulate_tty=True,

View File

@@ -33,7 +33,7 @@ def generate_launch_description():
condition=UnlessCondition(LaunchConfiguration('local_test')), condition=UnlessCondition(LaunchConfiguration('local_test')),
parameters=[{ parameters=[{
'odom': "odom", 'odom': "odom",
'serial_path': "/dev/ttyACM0", 'serial_path': "/dev/ttyACM1",
}], }],
emulate_tty=True, emulate_tty=True,

View File

@@ -48,7 +48,7 @@ def generate_launch_description():
executable='robot_state_publisher', executable='robot_state_publisher',
name='robot_state_publisher', name='robot_state_publisher',
output='screen', output='screen',
parameters=[{'robot_description': Command(['xacro ', default_model_path, ' use_sim:=', use_mock])}] parameters=[{'robot_description': Command(['xacro ', default_model_path, ' use_mock:=', use_mock])}]
) )
controller_manager = Node( controller_manager = Node(
@@ -108,4 +108,4 @@ def generate_launch_description():
joint_state_broadcaster, joint_state_broadcaster,
diffbot_base_controller, diffbot_base_controller,
rviz_node rviz_node
]) ])

View File

@@ -11,7 +11,7 @@ CallbackReturn mg::MgStepperInterface::on_init(const hardware_interface::Hardwar
if (info_.hardware_parameters.find("device_path") != info.hardware_parameters.end()) { if (info_.hardware_parameters.find("device_path") != info.hardware_parameters.end()) {
serial_port_name = info_.hardware_parameters["device_path"]; serial_port_name = info_.hardware_parameters["device_path"];
} else { } else {
serial_port_name = "/dev/ttyACM1"; serial_port_name = "/dev/ttyACM0";
} }
left_wheel_pos_state = 0; left_wheel_pos_state = 0;
@@ -31,6 +31,8 @@ CallbackReturn mg::MgStepperInterface::on_configure(const rclcpp_lifecycle::Stat
"Failed to open serial port (Is the stepper driver plugged in)"); "Failed to open serial port (Is the stepper driver plugged in)");
return CallbackReturn::ERROR; return CallbackReturn::ERROR;
} }
RCLCPP_INFO(rclcpp::get_logger("MgStepperInterface"),
"Configured stepper motor interface");
return CallbackReturn::SUCCESS; return CallbackReturn::SUCCESS;
} }
@@ -45,8 +47,8 @@ std::vector<hardware_interface::StateInterface> mg::MgStepperInterface::export_s
std::vector<hardware_interface::StateInterface> state_interfaces; std::vector<hardware_interface::StateInterface> state_interfaces;
state_interfaces.reserve(2); state_interfaces.reserve(2);
state_interfaces.emplace_back("left_motor", hardware_interface::HW_IF_POSITION, &left_wheel_pos_state); state_interfaces.emplace_back("drivewhl_l_joint", hardware_interface::HW_IF_POSITION, &left_wheel_pos_state);
state_interfaces.emplace_back("right_motor", hardware_interface::HW_IF_POSITION, &right_wheel_pos_state); state_interfaces.emplace_back("drivewhl_r_joint", hardware_interface::HW_IF_POSITION, &right_wheel_pos_state);
return state_interfaces; return state_interfaces;
} }
@@ -55,8 +57,8 @@ std::vector<hardware_interface::CommandInterface> mg::MgStepperInterface::export
std::vector<hardware_interface::CommandInterface> command_interfaces; std::vector<hardware_interface::CommandInterface> command_interfaces;
command_interfaces.reserve(2); command_interfaces.reserve(2);
command_interfaces.emplace_back("left_motor", hardware_interface::HW_IF_VELOCITY, &left_wheel_vel_cmd); command_interfaces.emplace_back("drivewhl_l_joint", hardware_interface::HW_IF_VELOCITY, &left_wheel_vel_cmd);
command_interfaces.emplace_back("right_motor", hardware_interface::HW_IF_VELOCITY, &right_wheel_vel_cmd); command_interfaces.emplace_back("drivewhl_r_joint", hardware_interface::HW_IF_VELOCITY, &right_wheel_vel_cmd);
return command_interfaces; return command_interfaces;
} }

View File

@@ -23,7 +23,7 @@
#define TIMEOUT 10u #define TIMEOUT 10u
constexpr const char* ENCODER_SERIAL_PATH_DEFAULT = "/dev/ttyACM0"; constexpr const char* ENCODER_SERIAL_PATH_DEFAULT = "/dev/ttyACM1";
using SendDoubleSrv = mg_msgs::srv::SendDouble; using SendDoubleSrv = mg_msgs::srv::SendDouble;
using ZeroSrv = std_srvs::srv::Empty; using ZeroSrv = std_srvs::srv::Empty;

0
scripts/build_base.sh Normal file → Executable file
View File

View File

@@ -1,3 +1,4 @@
#!/bin/bash
usage() { usage() {
cat <<EOF cat <<EOF
Usage: Usage:

View File

@@ -5,6 +5,8 @@ ros_distro="jazzy"
script_dir=$(dirname "$(readlink -f "${bash_source[0]}")") script_dir=$(dirname "$(readlink -f "${bash_source[0]}")")
pids=() pids=()
trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
source "/opt/ros/${ROS_DISTRO}/setup.bash" source "/opt/ros/${ROS_DISTRO}/setup.bash"
source "./install/setup.bash" source "./install/setup.bash"

78
scripts/test_wheel.sh Executable file
View File

@@ -0,0 +1,78 @@
#!/bin/bash
TARGET="$1"
if [[ "$TARGET" == "-h" || "$TARGET" == "--help" ]]; then
exit 0
fi
if [[ $# -ne 1 ]]; then
echo "Error: Expected at least 1 arg"
exit 1
fi
source install/setup.bash
trap "trap - SIGTERM && kill -- -$$" SIGINT SIGTERM EXIT
case $TARGET in
"forward")
ros2 topic pub --rate 10 /cmd_vel geometry_msgs/msg/TwistStamped "
header: auto
twist:
linear:
x: 0.4
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0"
;;
"backward")
ros2 topic pub --rate 10 /cmd_vel geometry_msgs/msg/TwistStamped "
header: auto
twist:
linear:
x: -0.8
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0"
;;
"left")
ros2 topic pub --rate 10 /cmd_vel geometry_msgs/msg/TwistStamped "
header: auto
twist:
linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.4"
;;
"right")
ros2 topic pub --rate 10 /cmd_vel geometry_msgs/msg/TwistStamped "
header: auto
twist:
linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: -0.4"
;;
"zero")
ros2 service call /zero std_srvs/srv/Empty
;;
*)
echo "Target not defined"
exit 1
;;
esac

View File

@@ -11,25 +11,23 @@
</xacro:unless> </xacro:unless>
<xacro:if value="${use_mock_hardware}"> <xacro:if value="${use_mock_hardware}">
<hardware> <hardware>
<plugin>mock_components/GenericSystem</plugin> <plugin>mock_components/GenericSystem</plugin>
<param name="calculate_dynamics">true</param> <param name="calculate_dynamics">true</param>
</hardware> </hardware>
</xacro:if> </xacro:if>
<joint name="drivewhl_l_joint"> <joint name="drivewhl_l_joint">
<command_interface name="velocity"/> <command_interface name="velocity"/>
<state_interface name="position"/> <state_interface name="position"/>
<state_interface name="velocity"/>
</joint> </joint>
<joint name="drivewhl_r_joint"> <joint name="drivewhl_r_joint">
<command_interface name="velocity"/> <command_interface name="velocity"/>
<state_interface name="position"/> <state_interface name="position"/>
<state_interface name="velocity"/>
</joint> </joint>
</ros2_control> </ros2_control>
</xacro:macro> </xacro:macro>
</robot> </robot>