顯示具有 <L 標籤的文章。 顯示所有文章
顯示具有 <L 標籤的文章。 顯示所有文章

2025年6月25日 星期三

ROS2 ( RViz , NAV2 , 4Wheel_drive_control ) package

 要將你的四輪差速車模型(roscar4wheel)整合進 ROS 2 中並支援:

  1. ✅ RViz 顯示模型

  2. ✅ 透過 cmd_vel 控制

  3. ✅ 使用 Navigation2 自走規劃

  4. ✅ 四輪差速(4-wheel differential)控制

我將為你分成以下 5 步驟說明操作與建置內容:


✅ 1. 修改 URDF:加入差速移動插件(diff_drive_controller

你需要在 URDF 或 Xacro 中加入 controller plugin:

xml
<gazebo> <plugin name="diff_drive_controller" filename="libgazebo_ros_diff_drive.so"> <ros> <remapping>cmd_vel:=cmd_vel</remapping> <remapping>odom:=odom</remapping> </ros> <robotNamespace>/</robotNamespace> <updateRate>50</updateRate> <leftJoint>left_front_wheel_joint</leftJoint> <leftJoint>left_rear_wheel_joint</leftJoint> <rightJoint>right_front_wheel_joint</rightJoint> <rightJoint>right_rear_wheel_joint</rightJoint> <wheelSeparation>0.4</wheelSeparation> <!-- 根據實際距離 --> <wheelDiameter>0.15</wheelDiameter> <publishWheelTF>true</publishWheelTF> <publishOdom>true</publishOdom> <odometryTopic>odom</odometryTopic> </plugin> </gazebo>

記得在 URDF 中定義正確的 wheel joint 名稱(如 left_front_wheel_joint 等)。


✅ 2. 加入 Robot State Publisher + Joint State Broadcaster(RViz 顯示)

建立 robot.launch.py

python
from launch import LaunchDescription from launch_ros.actions import Node from ament_index_python.packages import get_package_share_directory import os def generate_launch_description(): pkg_path = get_package_share_directory('roscar4wheel') urdf_path = os.path.join(pkg_path, 'urdf', 'roscar.urdf') return LaunchDescription([ Node( package='robot_state_publisher', executable='robot_state_publisher', name='robot_state_publisher', output='screen', parameters=[{'use_sim_time': True}], arguments=[urdf_path] ), Node( package='joint_state_publisher_gui', executable='joint_state_publisher_gui', name='joint_state_publisher_gui', output='screen', parameters=[{'use_sim_time': True}] ), Node( package='rviz2', executable='rviz2', name='rviz2', arguments=[], output='screen' ) ])

✅ 3. 匯入 Nav2 套件(SLAM / 路徑規劃 / AMCL)

安裝 Navigation2(若尚未安裝):

bash
sudo apt install ros-humble-navigation2 ros-humble-nav2-bringup

建立一個 nav2.launch.py

python
from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( package='nav2_bringup', executable='bringup_launch.py', output='screen', parameters=[ {'use_sim_time': True} ] ) ])

✅ 4. 建立 ROS2 控制器設定檔(YAML)

config/roscar_controllers.yaml

yaml
controller_manager: ros__parameters: update_rate: 50 diff_drive_controller: type: diff_drive_controller/DiffDriveController left_wheel_names: ["left_front_wheel_joint", "left_rear_wheel_joint"] right_wheel_names: ["right_front_wheel_joint", "right_rear_wheel_joint"] publish_rate: 50.0 use_stamped_vel: false base_frame_id: base_link wheel_separation: 0.4 wheel_radius: 0.075 cmd_vel_timeout: 0.5

✅ 5. 測試操作步驟

bash
# 啟動 Gazebo + Robot ros2 launch roscar4wheel display.launch.py # 啟動 TF + RViz 顯示 ros2 launch roscar4wheel robot.launch.py # 手動控制車子 ros2 topic pub /cmd_vel geometry_msgs/Twist "{linear: {x: 0.1}, angular: {z: 0.5}}" # 啟動 Nav2 ros2 launch roscar4wheel nav2.launch.py

🧩 可選擴充(由我協助):

功能可提供支援內容
加入 slam_toolbox自建地圖用於 Nav2
加入 LIDAR 模型3D 模擬用於導航或觀察
RViz2 config (.rviz)預設設定 camera / laser / TF 顯示
完整一鍵啟動 launchros2 launch roscar4wheel bringup.launch.py

✅ 我可以幫你打包以上項目成一個完整的 ROS 2 roscar4wheel 擴充套件,包含:

  • 四輪差速控制

  • RViz 顯示與模擬

  • cmd_vel 控制

  • Nav2 範例設定

是否要我幫你自動建構 zip 檔案並補上這些?如果有 STL 輪子也可一併加上。



2025年4月24日 星期四

imulog Server API 功能擴充(/imulogload)

 

imulog Server API 功能擴充

✅ 功能擴充目標

API 路徑功能說明
/imulog接收 log 陣列資料(每筆為 [b1..b6, time]),以 .append() 加入全域變數 log_data。若總長度超過 500 筆,則自動移除最舊資料
/imulogloadlog_data 內容作為 JSON 回傳,並在回傳後立即清空(即一次性讀取)


✅ 更新後程式碼內容

🔧 全域 log_data 改為固定容量佇列(可用 collections.deque

python
from flask import Flask, request, jsonify import os import csv import re import json from collections import deque app = Flask(__name__) # 最大容量為 500 筆(約 5 秒) log_data = deque(maxlen=500)

✅ 更新 /imulog:改為 append 模式

python
@app.route('/imulog', methods=['POST']) def post_imu_log(): """接收 IMU log 資料並追加到 log_data(自動裁剪至 500 筆)。""" print("POST IMU log data!") if not request.is_json: return jsonify({"error": "Request must be JSON"}), 400 data = request.get_json() if 'time' not in data or 'log' not in data: return jsonify({"error": "JSON must contain 'time' and 'log' keys"}), 400 try: log_items = data['log'] if isinstance(log_items, str): log_items = json.loads(log_items) if not isinstance(log_items, list): raise ValueError("log must be a list") added = 0 for item in log_items: if isinstance(item, list) and len(item) == 7: log_data.append(item) added += 1 else: print(f"忽略格式錯誤項目:{item}") print(f"Appended {added} items to log_data (total: {len(log_data)})") return jsonify({"message": f"Appended {added} items", "length": len(log_data)}), 201 except Exception as e: print(f"Error appending log: {str(e)}") return jsonify({"error": f"Failed to append: {str(e)}"}), 400

✅ 新增 /imulogload:讀取後清空

python
@app.route('/imulogload', methods=['GET']) def load_and_clear_log_data(): """一次性取得 log_data 中的內容,並清空。""" print("GET /imulogload called") # 將 deque 轉成 list 回傳 data = list(log_data) log_data.clear() print(f"Returned {len(data)} items and cleared log_data") return jsonify({"log": data, "count": len(data)})

🔁 測試流程建議

  1. 傳送 log 資料

    bash
    curl -X POST http://localhost:8081/imulog \ -H "Content-Type: application/json" \ -d '{"time":"t1", "log":[[0.1,0.2,0.3,0.4,0.5,0.6,0.01]]}'
  2. 取得並清空 log 資料

    bash
    curl http://localhost:8081/imulogload


✅ 新增功能 + 調整重點

項目說明
🔁 新增 GET /imulogpeek API只讀取 log 資料內容,但不清除
🔁 log_data buffer 容量提升至 1000 筆對應 100Hz 取樣率 ≈ 10 秒緩衝

🔧 修改程式碼說明

1️⃣ 將 log_data 變更為 1000 筆上限:

python
from collections import deque log_data = deque(maxlen=1000) # 緩衝 10 秒的資料(100Hz)

2️⃣ 新增 /imulogpeek API

python
@app.route('/imulogpeek', methods=['GET']) def peek_log_data(): """僅查看 log_data 內容(不清除)。""" print("GET /imulogpeek called") data = list(log_data) return jsonify({ "log": data, "count": len(data) }), 200

✅ 完整 API 結構總結(目前為止)

Method路徑功能
POST/imulog接收 IMU log,追加至 log_data,保留最多 1000 筆
GET/imulogload讀取 + 清空 log_data
GET/imulogpeek只讀取 log_data,不清空
POST/imulogsave接收 log 並儲存成 CSV(由 client 主動上傳 log)

🧪 測試指令建議

✅ peek(只查看)

bash
curl http://localhost:8081/imulogpeek

✅ load(取出 + 清空)

bash
curl http://localhost:8081/imulogload