Model samochodu RoboRacer (F1TENTH, skala 1:10) dla ROS 2 Jazzy i Gazebo Harmonic:
- podwozie z napędem Ackermann (tylne koła napędowe, przednie skrętne),
- lidar RPLIDAR C1 (360°, 10 Hz),
- kamera RealSense D435 (obraz kolorowy + kamera głębi, model z
realsense2_description), - siatki karoserii i kół F1TENTH.
Pakiet zawiera wyłącznie model. Świat, mostek ROS ↔ Gazebo i uruchamianie symulacji są w pakiecie, który go używa (np. simple_example).
roboracer_description/
├── urdf/roboracer.urdf.xacro model: wymiary, koła, czujniki, wtyczki Gazebo
├── meshes/f1tenth/ siatki STL (karoseria, koła, zwrotnice) + licencja
├── launch/display.launch.py podgląd modelu w RViz bez symulacji
└── rviz/roboracer.rviz konfiguracja RViz (model, lidar, odometria, kamera)
W workspace (np. przez plik .repos):
cd ~/ros2_ws
vcs import src < src/roboracer.repos
rosdep install -i --from-paths src --rosdistro $ROS_DISTRO -y
colcon build --symlink-install --packages-select roboracer_description
source install/setup.bashros2 launch roboracer_description display.launch.py # karoseria F1TENTH
ros2 launch roboracer_description display.launch.py body:=open # otwarte podwozie z elektronikąSuwakami w oknie Joint State Publisher skręcasz i obracasz koła.
W package.xml:
<exec_depend>roboracer_description</exec_depend>W pliku launch:
from ament_index_python.packages import get_package_share_directory
from launch.substitutions import Command, LaunchConfiguration
from launch_ros.parameter_descriptions import ParameterValue
xacro_file = os.path.join(get_package_share_directory('roboracer_description'),
'urdf', 'roboracer.urdf.xacro')
robot_description = ParameterValue(
Command(['xacro ', xacro_file, ' body:=', LaunchConfiguration('body')]),
value_type=str
)robot_description przekaż do robot_state_publisher, a robota w Gazebo utwórz przez ros_gz_sim create -topic robot_description. Gazebo znajduje siatki (package://roboracer_description/...) dzięki eksportowi gazebo_ros w package.xml, jeśli Gazebo jest uruchamiane przez ros_gz_sim/launch/gz_sim.launch.py.
| Argument | Wartości | Znaczenie |
|---|---|---|
body |
shell (domyślnie), open |
karoseria F1TENTH albo otwarte podwozie z płytą i elektroniką |
| Temat | Typ Gazebo | Kierunek | Opis |
|---|---|---|---|
/cmd_vel |
gz.msgs.Twist |
do modelu | prędkość liniowa x i kątowa z (Ackermann) |
/odom |
gz.msgs.Odometry |
z modelu | odometria, 30 Hz |
/tf |
gz.msgs.Pose_V |
z modelu | odom → base_footprint |
/joint_states |
gz.msgs.Model |
z modelu | stany kół i zwrotnic, 30 Hz |
/scan |
gz.msgs.LaserScan |
z modelu | lidar, 720 próbek, 10 Hz |
/camera/color/image_raw |
gz.msgs.Image |
z modelu | 640×480, 15 Hz |
/camera/color/camera_info |
gz.msgs.CameraInfo |
z modelu | parametry kamery |
/camera/depth/points |
gz.msgs.PointCloudPacked |
z modelu | chmura punktów 424×240, 15 Hz |
base_footprint (ziemia) → base_link (środek tylnej osi) → laser, camera_link (+ ramki optyczne RealSense), koła. Dane czujników mają frame_id:
/scan:laser,- obraz:
camera_color_optical_frame, - chmura punktów:
camera_depth_frame.
| Właściwość | Wartość | |
|---|---|---|
wheelbase |
0.325 m | rozstaw osi |
track_width |
0.245 m | rozstaw kół |
wheel_radius |
0.05 m | promień koła |
steering_limit |
0.42 rad | maksymalny skręt |
lidar_height |
0.175 m | wysokość skanu nad osią (powyżej dachu karoserii) |
Karoseria shell pasuje tylko do domyślnych wheelbase i track_width. Przy innych wymiarach używaj body:=open.
Apache License 2.0 (plik LICENSE). Siatki w meshes/f1tenth pochodzą z f1tenth-dev/simulator, również na licencji Apache 2.0 (szczegóły w meshes/f1tenth/README.md).