---
# System prepended metadata

title: 工作日誌

---

# 工作日誌
## 3/16 
- 嘗試組裝第一隻腳，但發現有螺絲是沒被寫在BOM表上的 以後直接買完整一點的尺寸
- 壓克力去工設系切

## 3/18
- 調教3D列印ABS材料的參數
overhang angle: https://www.youtube.com/watch?v=iYtlrqmIy3o&ab_channel=ItsMeaDMaDe

## 3/21開始組裝之日
- 發現有一個python檔案，可以調整每個servo的offset
3/25初步組裝完成，進入電路時代
3/29 電路接線完成 剩下電池還在大陸

## 4/9期中報告（教授提出的建議）
- 關於馬達短路的討論：
    可能是馬達的瞬間電流過大，超過電源供應器的功率
- 李博士：要單獨測試IMU的運作、硬體模型中的IMU與現實的IMU參數是否相同
- 何明字：確認 Issac gym 跟 Gazebo 中的硬體模型參數相同
- 周榮華：跑動時的負載，需要考慮
- 李博士：上下的壓克力板可能不夠堅固，如果跌倒可能造成斷裂，
要再測試一下

## 4/14整線、組裝、測試電路

## 4/28 SD卡壞了 滾吧
重新安裝環境，也知道藍牙問題要怎麼解決了

## 4/29 馬達組裝完畢

## 5/1 
### 寫完開機腳本
SPI, 藍芽, ROS環境

## 電量顯示檢測
如果不變 → 檢查 topic 名/回調是否生效
繪製邏輯

如果 log 顯示在變，但畫面不變 → 檢查百分比計算、round() 邏輯或 ImageDraw 坐標是否把新值畫進去
了

### [Dingo 站立](https://youtube.com/shorts/Xw4FGWJ9rDc?si=3RcolFRUmxZS1-21)


### 操作的方式不如預期
- 要使用keyboard listener
  補缺少的py套件`pynput`

### 組裝穩定度不夠
- 腳的穩定度不太夠：3D列印新的零件
- 使用螺絲膠

### 其他
- 鏡頭決定使用D455，目前正在詢問店家


## 5/4
1. 電量問題：BOM表上面的電阻錯誤! 電路圖上面為22k電阻，但實際購買的是47k電阻，應購買22k才是正確的！

2. Bambu A1設定：
    Leg Offset Mod 設定列印到一半卡住，把培林放進去（Layer43設定Pause）
    ABS列印參數，可以把Wall loop設定成3，減少裂開的情況發生
    
3. 新的路由完成了
 


## 5/20
:::spoiler Todo
- [x] 把樹莓派的網路改成創課網路
- [ ] 電量問題
- [ ] IMU數據
- [ ] Isa
- [ ] Docker看來是要學一下了
- [x] 訂完相機
:::

### Docker
方便使用VSCode快速Debug
目前還不太會使用，學習中
相關資料：[VSCode容器文件](https://learn.microsoft.com/zh-tw/visualstudio/docker/tutorials/docker-tutorial)

### 排查電量問題
電量會一直顯示100%

依序檢查每個節點的output
電壓電阻分配正常，而程式碼在經過測試後要吃到2.1-1.9V電壓才會改變，但PCB分壓結果為4.5-3V，後續應該會採用更改程式碼，修正成4.5-3V range，並再次測試
- 快速測試方式: 將 battery line 接到直流供電器直接改變電壓來看液晶螢幕上面的值有沒有變

:::warning 
更改程式碼前記得先整理好github
:::

### IMU

:::spoiler rosmsg show sensor_msgs/Imu

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
geometry_msgs/Quaternion orientation
  float64 x
  float64 y
  float64 z
  float64 w
float64[9] orientation_covariance
geometry_msgs/Vector3 angular_velocity
  float64 x
  float64 y
  float64 z
float64[9] angular_velocity_covariance
geometry_msgs/Vector3 linear_acceleration
  float64 x
  float64 y
  float64 z
float64[9] linear_acceleration_covariance
:::

https://wiki.ros.org/ros_imu_bno055
https://www.ncnynl.com/archives/202203/5075.html
:::spoiler IMU校正
校正步驟
加速度計 (Accel) 校正

動作：保持感測器水平，輕輕且緩慢地把它翻到各個面（上下、左側、右側、前後），每個面停留一點時間。

目標：accel 由 0 → 3。

陀螺儀 (Gyro) 校正

動作：把感測器保持平穩，持續以固定角速度繞各軸旋轉，並且中間停頓歸零。

目標：gyro 由 0 → 3。

磁力計 (Mag) 校正

動作：以「8」字形在空中揮動感測器，確保所有方向都被掃過。

目標：mag 由 0 → 3。

系統 (System) 校正

只要以上三個都校到 3，system 也會自動到 3。
:::
完成校正後，就可以在 RViz／rqt_plot 或其他 downstream node 看到穩定、正確的姿態、加速度與方向資訊了！

## 5/23 IMU沒有
- 發現IMU沒有寫frame_id，沒有在package裡執行關於IMU的程式，rosnode沒有關於IMU的相關節點資訊，rviz自然就不能透過訂閱取得IMU的data

==解決方法:在package.launch新增IMU節點==
- 建立坐標系廣播(TF)
==CMakelists.txt變更==
- find_package、catkin_package、catkin_install_python
對應的package.xml
查找ros msg and topic
- 開rviz檢查是否有IMU相關節點資料

## 5/25 建立IMU node 
- 在`dingo_peripheral_interfacing/scripts`建立`imu_publisher.py`
並在.py裡設置frame_id(imu_link)、topic(imu/data_row)，加入imu = IMU()以抓取IMU.py的數據，並透過covarience校正誤差
- package中新增
```cmake
<build>sensor_msgs</build>
<exec_depend>sensor_msgs</exec_depend>
<build>tf</build>
<exec_depend>tf</exec_depend>
```

- dingo_launch中新增IMU的節點資訊
```cmake
<node pkg="dingo_peripheral_interfacing"
      type="imu_publisher.py"
      name="imu_publisher"
      output="screen"
      if="$(eval arg('use_imu') == '1')">

  <!-- 你可以把 topic、frame_id 等參數放在這裡 -->
  <param name="frame_id" value="imu_link"/>
  <param name="rate"     value="50"/>
```

::: spoiler Cmakelist 加入 snesor_msg&tf，安裝IMU.py的函式庫
```diff
@@
-find_package(catkin REQUIRED COMPONENTS
-  rospy message_generation std_msgs
+# ─── 新增 sensor_msgs / geometry_msgs / tf ───
+find_package(catkin REQUIRED COMPONENTS
+  rospy
+  std_msgs
+  sensor_msgs
+  tf
+  message_generation
 )
 
@@
-catkin_package(
-#  INCLUDE_DIRS include
-#  LIBRARIES dingo_nano_interfacing
-  CATKIN_DEPENDS rospy message_runtime
-#  DEPENDS system_lib
-)
+# ─── 把新依賴放進 CATKIN_DEPENDS ───
+catkin_package(
+  CATKIN_DEPENDS
+    rospy
+    std_msgs
+    sensor_msgs
+    tf
+    message_runtime   # 你已有 ElectricalMeasurements.msg，所以保留
+)

@@
-## Mark executable scripts (Python etc.) for installation
-## in contrast to setup.py, you can choose the destination
-catkin_install_python(PROGRAMS
-    scripts/battery_voltage_checking.py
-    DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
+## ----------  安裝 Python 腳本  ----------
+catkin_install_python(
+  PROGRAMS
+    scripts/battery_voltage_checking.py
+    scripts/imu_publisher.py         # ★ 把新節點列進來
+  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
+)
+
+## ----------  安裝 Python 函式庫 (IMU.py) ----------
+# 這一步會把整個目錄複製到 /opt/ros/…/site-packages，
+# 任何節點都可以 `import dingo_peripheral_interfacing.IMU`
+install(
+  DIRECTORY src/dingo_peripheral_interfacing
+  DESTINATION ${CATKIN_PACKAGE_PYTHON_DESTINATION}
+)

```
:::

以上做完後需要重新編譯
```
catkin_make
source devel/setup.bash
```
## 5/22 釀梅子
## 5/23
- Docker建好了，但還不太會用
- [ROS教學-鐵人賽](https://ithelp.ithome.com.tw/users/20112348/ironman/1965)

## 5/24 
- 鐵人賽看到Day20: 學了Node, Topic, publisher, subscriber

## 5/25 
> 學會走路的那天
### [ROS進階-鐵人賽](https://ithelp.ithome.com.tw/users/20112348/ironman/3378)
- 短期先不考慮轉到ROS2，如果要轉可以用[ROS Bridge](https://github.com/ros2/ros1_bridge)
- 簡易的subscriber callback（多參數版）
```python
#input 一個參數時:
def callback(data, arg):
    rospy.loginfo(data, arg)

sub = rospy.Subscriber("topic", message_type, callback, arg)


#input 兩個以上參數時:
def callback(data, args):
    arg1 = args[0]
    arg2 = args[1]

sub = rospy.Subscriber("topic_name", String, callback, (arg1, arg2))
```
- 如果沒有jeston nano，導致效能不足
可以參考[這個](https://ithelp.ithome.com.tw/articles/10244398), 把master設定在主機上面

---
### 移動控制問題
1. 修改部分 `InputInterface.py` 中xbox對應ps4按鈕的問題，現在可以[踏步](https://youtube.com/shorts/Xw4FGWJ9rDc?si=j0AFEoZbxDPZq5Tc)了
2. 了解整個控制流程，之後debug應該可以更順利（[chatgpt對話紀錄](https://chatgpt.com/share/68333422-5700-8001-a54b-cc01d654d2e6)）
3. 接下來要解決前進的問題
4. 也發現沒辦法支撐自己 -> 新的腳掌還沒實裝
5. E-stop會一直被按下



:::spoiler ps4搖桿
| PS4 手把         | `/joy.axes[idx] / buttons[idx]` | 對應 `Command` 欄位          | 說明        |
| -------------- | ------------------------------- | ------------------------ | --------- |
| 左搖桿 **Y**      | `axes[1]`（向前 = −1）              | `horizontal_velocity[0]` | 前進 / 後退   |
| 左搖桿 **X**      | `axes[0]`（右 = +1）               | `horizontal_velocity[1]` | 右移 / 左移   |
| 右搖桿 **X**      | `axes[2]` 或 `axes[3]`¹          | `yaw_rate`               | 原地順 / 逆時針 |
| 右搖桿 **Y**      | `axes[5]` 或 `axes[4]`¹          | `pitch`                  | 機身俯仰      |
| **▢ (Square)** | `buttons[3]`                    | `trot_event`             | 開 / 關 小跑步 |
| **○ (Circle)** | `buttons[2]`                    | `hop_event`              | 跳躍（瞬時）    |
| **OPTIONS**    | `buttons[9]`                    | `joystick_control_event` | 進入 / 離開遙控 |
:::

---
### Reference
[Intel D455 to ROS CSDN](https://blog.csdn.net/weixin_51157015/article/details/127747882)
[intel d455 ros github](https://github.com/IntelRealSense/realsense-ros/tree/ros1-legacy)
[Realsense d455 SLAM using Octomap in ROS1](https://hackmd.io/@aQPXIDmWRSCq4QfY42mKhA/ByTmSAIC3)
[IMU bno055](https://wiki.ros.org/ros_imu_bno055)


## 6/10 
### 行走的控制已經完成
修改ps4搖桿對照到xbox搖桿
走路方式：先按下y進入指令模式，接下來按下x開啟走路模式，在走路模式下就可以使用左蘑菇前進後退

### 問題：沒辦法承受負載
正常行走後，把狗放在地上卻沒辦法如預期移動

1. 檢查機構是否有正常安裝
在檢查過後發現，螺桿的長度有一隻特別長，沒有鎖到底

2. 測試馬達力量是否足夠
3. 嘗試使用巧拼作為增加地面摩擦力的方式
4. 調整PID參數，

### 鏡頭架
設計完成，使用M4-10mm螺絲固定相機 (相機背部6mm，底座厚度3mm)
![image](https://hackmd.io/_uploads/ByFJ4kLmgx.png)

### IMU節點

### 6/17

- [x] Issac gym 訓練完的模型要怎麼接進ROS2
    [solution](https://chatgpt.com/share/685117ab-6c28-8001-b162-991da3c3dcfd)
- [x] 樹莓派到底怎樣 是不是在搞，備份了 dingo_backup.img
    [ Backup file Reference](https://blog.cavedu.com/2018/03/22/raspberry-pi-sd-card/)
    `sudo dd if=/dev/sdb of=/media/esmaker/SanDick/dingo_backup.img bs=4M status=progress | zip Dingo_20250617.zip -`
- [ ] IMS節點打開

### 7/8
ros1 轉到 ros2
[遷移方式](https://blog.csdn.net/qq_16539009/article/details/124043163)
[example](https://blog.csdn.net/qq_16539009/article/details/124060944)

可使用 ros bridge 進行兩邊的溝通
小範圍遷移：先挑一兩個核心節點測試，確定 Publisher/Subscriber 正常。
[gpt](https://chatgpt.com/g/g-p-686c9cc98de88191b4f39af7972ef0cd-rosqiao-qian-pai-dui/project)
[ros官網](https://docs.ros.org/en/humble/How-To-Guides/Migrating-from-ROS1.html#migrating-from-ros-1-to-ros-2)

### IMU
[imu catkin](https://automaticaddison.com/how-to-publish-imu-data-using-ros-and-the-bno055-imu-sensor/)