---
# System prepended metadata

title: 工作紀錄 / 廖軒裕
tags: [工作紀錄]

---

###### tags: `工作紀錄`

# 工作紀錄 / 廖軒裕

## W7D5 0814

### Trace code (endpoint_env.py => class EndP_env3D(object): \_\_init\_\_(self))

#### 跟 webots 手臂有關的 variable

`rm1_init_position` : 第 1 個 motor 的起始位置

`rm2_init_position` : 第 2 個 motor 的起始位置

`rm3_init_position` : 第 3 個 motor 的起始位置

`rm4_init_position` : 第 4 個 motor 的起始位置



`HJ2` : jointParameters of HingeJoint 2

`HJ4` : jointParameters of HingeJoint 4

`JP2_GP` : anchor of HingeJoint 2

`JP4_GP` : anchor of HingeJoint 4



`ENDP` : endpoint node

`base` : 神秘的 [0, 0, -0.02]

`origin` : JP2_GP + base

`goal_np_p` : 隨機出來的 goal position (based on 轉成 x, -z, y 的 origin)



`HJN1` : jointParameters of HingeJoint 1

`HJN2` : jointParameters of HingeJoint 2

`HJN3` : jointParameters of HingeJoint 3

`HJN4` : jointParameters of HingeJoint 4

`JP1` : position of HingeJoint 1

`JP2` : position of HingeJoint 2

`JP3` : position of HingeJoint 3

`JP4` : position of HingeJoint 4

#### note

`HJ2` 跟 `HJN2` 其實是一樣的

`lives` 不會用到但 return 時會回傳

`P2`, `P4`, `accumulated_reward`, `arrival_time`, `start_time` 都完全不會用到，看要不要刪掉



## W6D2 0804

### Trace Code

[學長的code (Dopamine to Webots) in our github](https://github.com/CT-Lab/Dopamine_Webots/tree/master/controllers)

#### endpoint_env.py

##### class EndP_env3D(object): _get_reward(self)

- 初始化 reward : r = $-\sqrt{d[0] ^ 2 + d[1] ^ 2 + d[2] ^ 2}$
    > d = goal_position - endpoint_position
    > goal_position 在 EndP_env3D init 時會隨機賦值
- 決定是否更新 reward 並維護 done :
若 endpoint_position 的 x, y, z 值分別都介於 goal_position 正負 0.1 之間，則 `reward += 1` 並且 `on_goal += 1` ，反之 `on_goal = 0`
    > on_goal 超過 100 時， `done = True` （連續超過 100 次維持在範圍內才判定為成功到達目標）
- return reward 值

##### class EndP_env3D(object): step(self, action_dict)

- 將傳進來的 `action_dict` 進行 [clip](https://numpy.org/doc/stable/reference/generated/numpy.clip.html)
- 利用 `action_dict` 以 `setPosition` 更新各個 joint 的角度
- 檢查各個 joint 的角度是否超過界線 (arm_position_max, arm_position_min) ，若超過則 `done = True` 、`reward -= 1`
- return information
    > `lives` 在 code 中完全沒有作用，可以無視


## W5D2 0728

設計兩種運動軌跡，[連結](https://github.com/CT-Lab/IKcontrol/tree/motion-adjustment)內有 code, README

發現 step 好像會影響模擬蠻多的，先把 reference 放著方便之後查找
https://cyberbotics.com/doc/reference/robot?tab-language=python#wb_robot_step
https://cyberbotics.com/doc/reference/worldinfo?tab-language=python

## W4D5 0724

使用 inverse_kinematics_frame (相較於 inverse_kinematics 多考慮每一個 joint 的 position) 的 controller code : http://codepad.org/tAvpj7De

## W4D3 0722

### 看範例 controller code

- 為何 Chain 中只到 E motor ，但 motors 中卻到 F motor
- DEF 找不到
  ```python
    # Get the arm and target nodes.
    target = supervisor.getFromDef('TARGET')
    arm = supervisor.getFromDef('ARM')
  ```
  > ARM : 整隻手臂 ( DEF ARM Robot )
  > TARGET : 球 ( DEF TARGET Solid )
- 為何只需要 the 3 first arm motors
  ```python
    # Actuate the 3 first arm motors with the IK results.
    for i in range(3):
        motors[i].setPosition(ikResults[i + 1])
  ```

## W4D2 0721

### [Webots C++/Java/Python APIs](https://cyberbotics.com/doc/guide/cpp-java-python) 重點整理

- The controller class should derive from the `Robot` class if the `supervisor` field of the Robot node is `FALSE` and from the `Supervisor` class if it is `TRUE`.
- `Supervisor` is a subclass of the `Robot` class, hence it is possible to call the `Robot`'s methods from the `Supervisor` controllers.
- user-defined controller (python) :
    1. create an instance of the user-defined controller class
        > robot = Robot()
    2. main controller loop
- controller should never create more than one instance of a derived class, otherwise the results are undefined.
- In C++/Java/Python, each Webots device is implemented as a separate class, the various devices instances can be obtained with dedicated methods of the `Robot` class, like the `getDistanceSensor` or the `getTouchSensor` functions. There is no `WbDeviceTag` in C++/Java/Python.

## W4D1 0720

### 可能會用到的資料

https://cyberbotics.com/doc/guide/cpp-java-python
https://cyberbotics.com/doc/reference/supervisor?tab-language=python
https://cyberbotics.com/doc/reference/robot?tab-language=python
https://cyberbotics.com/doc/guide/supervisor-programming

### docs 中對於範例 code 用到的 attribute 的說明

translation_vector : In URDF, attribute “xyz” of the “origin” element
orientation : In URDF, attribute “rpy” of the “origin” element
rotation : In URDF, attribute “xyz” of the “axis” element

### 疑問

在 [此網頁的 3.3](https://www.guyuehome.com/372) 中可以看到， origin.xyz, origin.rpy, axis.xyz 是 joint 的 parameters
但在 docs 中應是用在 link 上

### 對應

translation_vector <=> jointParameters.anchor （還是 endPoint.translation ? ）
> 結果我們的手臂的 anchor 都是 0 （先用 endPoint.translation 試試）

orientation <=> 暫時用 [0, 0, 0]
rotation <=> jointParameters.axis
bounds <=> RotationalMotor.(minPosition, maxPosition)

## W3D5 0717

~~matlab robotics toolbox 中的 SerialLink 有現成的函數，可以對機器人模型進行正逆向運動學分析~~

嘗試參考 [docs](https://github.com/Phylliade/ikpy/wiki#creating-a-chain-manually) 模仿 [這段 code](https://ikpy.readthedocs.io/en/latest/link.html#ikpy.link.URDFLink) 手動 create 我們要的 chain （機器手臂） ?

### 可能會用到的資料

https://www.guyuehome.com/372
https://www.itread01.com/content/1547858716.html
https://wiki.ros.org/urdf/XML/link
https://wiki.ros.org/urdf/XML/joint

## W2D4 0709

[機器手臂資料 1](https://www.generationrobots.com/media/panda-franka-emika-datasheet.pdf)、[機器手臂資料 2](https://wiredworkers.io/wp-content/uploads/2019/06/Franka-Emika-Panda-Datasheet-may-2019.pdf)

[工程師提供官網機械手臂物理參數](https://frankaemika.github.io/docs/control_parameters.html)

### 參考 gazebo 文章

[MeshLab](https://www.meshlab.net/) : 可簡化 3D 模型並以 .stl, .obj, .vrml 等格式輸出

mass, friction 皆為估計出來的

### 參考六軸機械手臂的設定
#### JointParameters
- minStop, maxStop 對應 joint position limit
- springConstant, dampingConstant, staticFriction 範例都直接設定為 0 (??)

## W2D3 0708

在 webots 中設定 boundingObject 以及 physics

1. 將 DEF __1 transform to Robot
2. 對 boundingObject 右鍵 >> Add New >> 選擇作為碰撞判定方式的物體
3. physics Physics 中有 mass, centorOfMass 等數值能進行設定