diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..1bc8d4c --- /dev/null +++ b/build.sh @@ -0,0 +1,2 @@ +source install/setup.bash +colcon build \ No newline at end of file diff --git a/run.sh b/run.sh new file mode 100644 index 0000000..e69de29 diff --git a/src/ps2_controller/CMakeLists.txt b/src/ps2_controller/CMakeLists.txt index c9e2c8a..856b74a 100644 --- a/src/ps2_controller/CMakeLists.txt +++ b/src/ps2_controller/CMakeLists.txt @@ -15,6 +15,10 @@ add_executable(ps2_reader src/ps2_reader.cpp) ament_target_dependencies(ps2_reader rclcpp rc_msgs) # 添加 rc_msgs 依赖 +install(DIRECTORY launch + DESTINATION share/${PROJECT_NAME}/ +) + install(TARGETS ps2_reader DESTINATION lib/${PROJECT_NAME}) diff --git a/src/ps2_controller/launch/ps2_controller.launch.py b/src/ps2_controller/launch/ps2_controller.launch.py new file mode 100644 index 0000000..a3055ca --- /dev/null +++ b/src/ps2_controller/launch/ps2_controller.launch.py @@ -0,0 +1,15 @@ +from launch import LaunchDescription +from launch_ros.actions import Node + +def generate_launch_description(): + return LaunchDescription([ + Node( + package='ps2_controller', + executable='ps2_reader', + name='ps2_controller_node', + output='screen', + parameters=[ + {'device': '/dev/input/js0'} # 可根据需要修改设备路径 + ] + ) + ]) \ No newline at end of file diff --git a/src/rc_msgs/CMakeLists.txt b/src/rc_msgs/CMakeLists.txt index 68923fc..bc7da6a 100644 --- a/src/rc_msgs/CMakeLists.txt +++ b/src/rc_msgs/CMakeLists.txt @@ -7,6 +7,9 @@ rosidl_generate_interfaces(${PROJECT_NAME} "msg/DataControl.msg" "msg/DataMotor.msg" "msg/DataLeg.msg" + "msg/DataMotors.msg" + "msg/MotorCmd.msg" + "msg/MotorCmds.msg" ) ament_package() diff --git a/src/rc_msgs/msg/DataMotors.msg b/src/rc_msgs/msg/DataMotors.msg new file mode 100644 index 0000000..166cf92 --- /dev/null +++ b/src/rc_msgs/msg/DataMotors.msg @@ -0,0 +1,3 @@ +DataMotor data_motor_0 +DataMotor data_motor_1 +DataMotor data_motor_2 \ No newline at end of file diff --git a/src/rc_msgs/msg/MotorCmd.msg b/src/rc_msgs/msg/MotorCmd.msg new file mode 100644 index 0000000..d50953b --- /dev/null +++ b/src/rc_msgs/msg/MotorCmd.msg @@ -0,0 +1,5 @@ +float32 tau +float32 vw +float32 pos +float32 kp +float32 kd \ No newline at end of file diff --git a/src/rc_msgs/msg/MotorCmds.msg b/src/rc_msgs/msg/MotorCmds.msg new file mode 100644 index 0000000..d19c645 --- /dev/null +++ b/src/rc_msgs/msg/MotorCmds.msg @@ -0,0 +1,3 @@ +MotorCmd motor_cmd_0 +MotorCmd motor_cmd_1 +MotorCmd motor_cmd_2 \ No newline at end of file diff --git a/src/robot_bringup/CMakeLists.txt b/src/robot_bringup/CMakeLists.txt new file mode 100644 index 0000000..1faf3ca --- /dev/null +++ b/src/robot_bringup/CMakeLists.txt @@ -0,0 +1,27 @@ +cmake_minimum_required(VERSION 3.8) +project(robot_bringup) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) + +install(DIRECTORY launch + DESTINATION share/${PROJECT_NAME}/ +) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + # the following line skips the linter which checks for copyrights + # comment the line when a copyright and license is added to all source files + set(ament_cmake_copyright_FOUND TRUE) + # the following line skips cpplint (only works in a git repo) + # comment the line when this package is in a git repo and when + # a copyright and license is added to all source files + set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() + +ament_package() \ No newline at end of file diff --git a/src/robot_bringup/launch/robot_bringup.launch.py b/src/robot_bringup/launch/robot_bringup.launch.py new file mode 100644 index 0000000..dc15ae6 --- /dev/null +++ b/src/robot_bringup/launch/robot_bringup.launch.py @@ -0,0 +1,116 @@ +from launch import LaunchDescription +from launch_ros.actions import Node +from launch_ros.actions import ComposableNodeContainer +from launch_ros.descriptions import ComposableNode + +def generate_launch_description(): + # 定义 leg_ctrl 的四个容器节点 + lf_container = ComposableNodeContainer( + name='lf_motor_container', + namespace='', + package='rclcpp_components', + executable='component_container', + composable_node_descriptions=[ + ComposableNode( + package='unitree_motor_serial_driver', + plugin='unitree_motor_serial_driver::MotorControlNode', + name='unitree_motor_serial_driver_lf', + parameters=[{'serial_port': '/dev/ttyACM0'}], + remappings=[ + ('data_leg_control', 'LF/data_leg_control'), + ('data_leg_motor', 'LF/data_leg_motor') + ] + ) + ], + output='screen', + ) + + rf_container = ComposableNodeContainer( + name='rf_motor_container', + namespace='', + package='rclcpp_components', + executable='component_container', + composable_node_descriptions=[ + ComposableNode( + package='unitree_motor_serial_driver', + plugin='unitree_motor_serial_driver::MotorControlNode', + name='unitree_motor_serial_driver_rf', + parameters=[{'serial_port': '/dev/ttyACM1'}], + remappings=[ + ('data_leg_control', 'RF/data_leg_control'), + ('data_leg_motor', 'RF/data_leg_motor') + ] + ) + ], + output='screen', + ) + + lr_container = ComposableNodeContainer( + name='lr_motor_container', + namespace='', + package='rclcpp_components', + executable='component_container', + composable_node_descriptions=[ + ComposableNode( + package='unitree_motor_serial_driver', + plugin='unitree_motor_serial_driver::MotorControlNode', + name='unitree_motor_serial_driver_lr', + parameters=[{'serial_port': '/dev/ttyACM2'}], + remappings=[ + ('data_leg_control', 'LR/data_leg_control'), + ('data_leg_motor', 'LR/data_leg_motor') + ] + ) + ], + output='screen', + ) + + rr_container = ComposableNodeContainer( + name='rr_motor_container', + namespace='', + package='rclcpp_components', + executable='component_container', + composable_node_descriptions=[ + ComposableNode( + package='unitree_motor_serial_driver', + plugin='unitree_motor_serial_driver::MotorControlNode', + name='unitree_motor_serial_driver_rr', + parameters=[{'serial_port': '/dev/ttyACM3'}], + remappings=[ + ('data_leg_control', 'RR/data_leg_control'), + ('data_leg_motor', 'RR/data_leg_motor') + ] + ) + ], + output='screen', + ) + + # 定义 ahrs_driver 节点 + ahrs_driver = Node( + package="fdilink_ahrs", + executable="ahrs_driver_node", + parameters=[{ + 'if_debug_': False, + 'serial_port_': '/dev/ttyUSB0', + 'serial_baud_': 921600, + 'imu_topic': '/imu', + 'imu_frame_id_': 'gyro_link', + 'mag_pose_2d_topic': '/mag_pose_2d', + 'Magnetic_topic': '/magnetic', + 'Euler_angles_topic': '/euler_angles', + 'gps_topic': '/gps/fix', + 'twist_topic': '/system_speed', + 'NED_odom_topic': '/NED_odometry', + 'device_type_': 1 + }], + output="screen" + ) + + # 返回主启动文件的描述 + return LaunchDescription([ + lf_container, + rf_container, + lr_container, + rr_container, + ahrs_driver + ]) \ No newline at end of file diff --git a/src/robot_bringup/package.xml b/src/robot_bringup/package.xml new file mode 100644 index 0000000..9d4e70e --- /dev/null +++ b/src/robot_bringup/package.xml @@ -0,0 +1,20 @@ + + + + robot_bringup + 0.0.0 + TODO: Package description + robofish + TODO: License declaration + + ament_cmake + + launch + + ament_lint_auto + ament_lint_common + + + ament_cmake + +