---
tags: TPW2
---
# TPW2 Buildup
[TOC]
router: TBA1_5G / TPW2_ASUS
PW: tirc3516
## 啟動說明
### 基本連線資訊
Linux IP: 192.168.2.10
Thermal Camera IP: 192.168.2.11
RGB Camera IP: 192.168.2.12
PW : lcp
### ssh連線
ssh lcp@192.168.2.10
pw : lcp
### VNC連線
IP : 192.168.2.10
PW : 0955159767
## GPR Server
### 程式解說
* Launch Files
```mermaid
graph TD
gpr(gpr_server)
gpr --> lcp_startup_bring_up(lcp工研院套件)
gpr --> pr2_indiv_no_kinect(ar_track_alvar倒車入庫)
gpr --> ptzcontrol(ptzcontrol雲台)
lcp_startup_bring_up --> bf_bl
lcp_startup_bring_up --> robot_state_publisher_node
lcp_startup_bring_up --> joint_state_publisher_node
lcp_startup_bring_up --> actuators_bringup
lcp_startup_bring_up --> lcp_teleop
lcp_startup_bring_up --> sensors_without_lidar
actuators_bringup --> scout_base_node(機器松齡平台)
actuators_bringup --> linear_motor_node(升降桿)
lcp_teleop --> xbox_joy_ready_fb_node
lcp_teleop --> joy_node(搖桿)
sensors_without_lidar --> tf(座標轉換)
sensors_without_lidar --> imu_um7(陀螺儀)
sensors_without_lidar --> cael_eco(溫溼度計)
sensors_without_lidar --> urm08_driver(超音波感測器)
tf --> bl_lidar
tf --> bl_usleft
tf --> bl_usright
tf --> bl_rscamera
tf --> bl_imu
```
其餘node是利用gpr_server內的bash檔開啟
* NodeManager負責管理所有topic的subscribe以及publish,所有訊號先在此處subscribe後存取下來,再提供給各介面自行取用。
1. Interfaces_Manager: 此處處理各介面的溝通以及控制,統整導航,搖桿和UI介面的指令,再將統合後的指令藉由ros topics publish到升降桿、雲台和底盤。
* InterfacesManager.cpp: 啟動所有介面和MultiChannelIntegrator.
* 命令介面
* MultiChannelIntegrator.cpp: 整合所有命令介面的指令,建立執行續時刻更新各介面是否有新指令要發送,依據各介面的優先權,調用NodeManager的API做最後的publish指令。
* JoyStickInterface.cpp: 從NodeManager獲取搖桿的msg,並轉換成底盤速度,升降桿和雲台的msg後調用NodeManager的API進行pusblish給底盤、升降桿以及雲台。
* Robot_FCInterface.cpp: 讀取UI的數值,並轉換成底盤速度,升降桿和雲台的指令
* 控制介面
* ptz_serial.cpp: 與lifter相同
* LifterInterface.cpp: 不斷藉由NodeManager的API獲取升降桿當前位子,收到MultiChannelIntegrator的升降指令後將升降多寡與當前位置加總後藉由NodeManager做publish。
* NavInterface.cpp: 從NodeManager獲取movebase下的導航速度
* 感測介面
* SafeCtrlInterface.cpp: 從NodeManager獲取兩側超音波感測器偵測到的距離,若是距離低於一定值及處於連續危險狀態,MultiChannelIntegrator會讀取此狀態藉由NodeManager下達靜止的速度給底盤。
2. Aruco Path Planning (用 arcode 倒車入庫)
* 在gpr.launch啟動估算tag位置的程式
```bash=
roslaunch ar_tracker_alvar pr2_indiv_no_kinect.launch
```
* Error Estimation.cpp: 估算當前位置和目標位置的誤差,儲存目標位置
* Motion Control.cpp: 依據當前位置和目標位置的直線誤差(Dis)和角度誤差(alpha), 以及機器人朝向誤差(phi) 做運動控制。
參數調整:
K_HIGH_ALPHA 數值增加會減少與目標點的誤差,但會增加路徑的震盪
K_PHI 數值增加會減少路徑震盪,但會增加與目標點的誤差
K_RHO 調整直線速度,太快可能會讀不到Tag
OMax/OMin: 角速度最高和最低值
VMax/VMin: 直線速度最高和最低值
Y_THRES: 橫向誤差的收斂閥值
X_THRES: 直線誤差的收斂閥值
Ang_THRES: 機器人朝向誤差的收斂閥值
* Control ALG.cpp: 啟動和停止倒車的功能
:::spoiler UI設定
{
"ver" : 0,
"pcSubPort" : "17777",
"pcPushPort" : "17778",
"pc_broadcast_port" : 58788,
"rosSubPort" : "7777",
"rosPushPort" : "7778",
"rosSubStreamPort" : "7779",
"ros_broadcast_port" : 58787,
"rgb_cam_ip" : "192.168.2.12",
"rgb_cam_user_name" : "admin",
"rgb_cam_user_password" : "admin",
"thermal_cam_ip" : "192.168.2.11",
"thermal_cam_streaming_rtsp" : false,
"thermal_cam_streaming_zmq_port" : "17781",
"audio_streaming_zmq_port" : "17782",
"ros_server_ip" : "192.168.2.10"
}
:::
### 安裝步驟
:::spoiler 步驟
- [ROS melodic installation](http://wiki.ros.org/melodic/Installation/Ubuntu)
- gpr_server
```bash=
mkdir ~/catkin_ws
cd ~/catkin_ws
mkdir src
catkin_make
cd ~/catkin_ws/src/
git clone https://bitbucket.org/tirctw/gpr_server.git
```
* modbus
```bash=
cd ..
wget https://libmodbus.org/releases/libmodbus-3.0.8.tar.gz
tar -zxvf libmodbus-3.0.8.tar.gz
cd libmodbus-3.0.8/
./configure && make check
sudo make install
sudo ldconfig
```
- [ar_tracker_alvar](http://wiki.ros.org/ar_track_alvar)
``` bash=
sudo apt-get install ros-($ ros_distro)-ar-track-alvar
```
- 工研院的套件
控制升降桿、讀取手把資料、讀取感測器(3D camera, 超聲波感測器)
```bash=
sudo apt install ros-($ ros_distro)-teleop-twist-keyboard
sudo apt-get install ros-($ ros_distro)-joint-state-publisher-gui
sudo apt install ros-($ ros_distro)-ros-controllers
cd ~/catkin_ws/src/
git clone https://bitbucket.org/tirctw/itri_packages.git
將itri_packages內的nav_ws刪除,否則會有編譯問題。
```
- [quanergy_client](https://github.com/QuanergySystems)
```bash=
sudo apt install git cmake g++ libboost-all-dev libpcl-dev
mkdir ~/QuanergySystems
cd ~/QuanergySystems
git clone https://github.com/QuanergySystems/quanergy_client.git
cd quanergy_client
mkdir build
cd build
cmake ..
make
sudo make install
```
* log4plus, zmq, libsodium (@TPW1 ubuntu buildup)
```bash=
sudo apt-get install libtool pkg-config build-essential autoconf automake
sudo apt-get install libzmq3-dev
```
* log4cplus
```bash=
cd ~
wget https://github.com/log4cplus/log4cplus/releases/download/REL_2_0_2/log4cplus-2.0.2.tar.gz
tar -xvf log4cplus-2.0.2.tar.gz
cd log4cplus-2.0.2/
./configure && make check
sudo make install
sudo ldconfig
```
* zmq
```bash=
cd ~
wget https://github.com/zeromq/libzmq/releases/download/v4.2.5/zeromq-4.2.5.tar.gz
tar -xvf zeromq-4.2.5.tar.gz
cd zeromq-4.2.5/
./autogen.sh
./configure && make check
sudo make install
sudo ldconfig
```
* libsodium
```bash=
cd ~
wget https://github.com/jedisct1/libsodium/releases/download/1.0.17/libsodium-1.0.17.tar.gz
tar -xvf libsodium-1.0.17.tar.gz
cd libsodium-1.0.17/
./autogen.sh
./configure && make check
sudo make install
sudo ldconfig
```
* joy
```bash=
sudo apt-get install ros-($ ros_distro)-joy
```
- [webots_ros](http://wiki.ros.org/webots_ros)
```bash=
sudo apt-get install ros-($ ros_distro)-webots-ros
```
- submodule -> CXX_CommDispatcher
```bash=
cd ~/catkin_ws/src/gpr_server/submodule/
git submodule init
git submodule update
```
- move_base -> navigation_msgs
> 因為有使用到move_base的msg,需導入另一專案[navigation_msgs],
存放於 smb://192.168.158.21/temp/Gary/TPW1,將其copy到workspace中,
與gpr_server同層即可(~/catkin_ws/src)。
- [realsense2-camera](https://github.com/IntelRealSense/realsense-ros#installation-instructions)
```bash=
sudo apt-get install ros-($ ros_distro)-realsense2-camera
```
- serial
```bash=
sudo apt-get install ros-($ ros_distro)-serial
```
- ptzcontrol (雲台)
```bash=
cd ~/catkin_ws/src/
git clone https://bitbucket.org/tirctw/nodeptzcontrol.git ptzcontrol
```
* 加載配置文件
```bash=
source /opt/ros/melodic/setup.bash
source ~/catkin_ws/devel/setup.bash
```
- 設置儲存檔案路徑,安裝Navigation和IMU driver (um7)
```bash=
sudo su
cd gpr_server
source setup.sh
```
:::info
如果啟動gpr.launch顯示log4plus ERROR: can't open file **.log (權限問題)。
在terminal 加入
```bash=
sudo chmod -R o+rw /home/data/gpr
```
:::
### 參數調整以及存放位置
存在GPR_Server
1. Cartographer
* Files path: ($ catkin_ws_cartographer)/install_isolated/share/cartographer_ros/configuration_files/
tirc_3d_slam.lua for SLAM; tirc_3d_slam_loca.lua for localization
* Reference: https://google-cartographer-ros.readthedocs.io/en/latest/tuning.html
2. Navigation
* roslaunch husky_navigation move_base.launch
* configuration file:
($ husky_navigation)/config/costmap.yaml
($ husky_navigation)/config/planner.yaml (DWAPLANNER)
> note. ($husky_navigation) => /Home/catkin_ws_gpr/src/husky_navigation/
* xy_tolerance: 室外(0.2 m) 室內(0.15 m)
> Reference: http://kaiyuzheng.me/documents/navguide.pdf
### FTP 設定
1. 在Robot端的FileZilla Server 設定home路徑。將C:\Users\tirc\Documents\TPW1_MainController\PatrolPlanRecord 設定為home路徑
2. 在User Computer 上啟動複製檔案的程式: https://bitbucket.org/tirctw/tpw_ftp/src/develop/
* 程式會在C:\Users\Public\TPW1_FTP 產生設定檔:
```shell=
"ver" : 1,
"sb_com" : "simulator",
"ip_address" : "192.168.178.9",
"port" : 22,
"back_up_path" : "D:\\robot_data\\",
"auto_delete" : false
```
* FileZilla Server的帳號: tirc ; 密碼: 0955159767
* 程式端設定寫在 AutoBackupFTPClient.java
### IMU 校正
使用軟體RedShift校正加速度和角度: https://redshiftlabs.com.au/support-services/serial-interface-software/
1. 將IMU連接到電腦再開啟軟體,設定Baud Rate(921600), Comport後,按connect
2. 切換至"commands"頁籤,依序點選 "calibrate angular accelerometer", "zero gyro rate"和"write to flash"
3. 若需微調gyro數值,可以切換至"configuration"頁籤,
"read": 讀取當前設定; "RAM": 將設定寫入IMU但重新啟動後設定不保留; "FLASH": 將設定永久寫入IMU。
可以在此頁籤手動修改gyro的offset數值,再到"Data"頁籤讀取IMU數值
* Gyro數值會影響IMU的線性加速度
* 校正完成後須確保IMU平放於機構上時,z軸方向的線性加速度接近9.8,且三軸的角加速度趨近於0
### 自動啟動
### GPR Server
在 /etc/rc.local 檔案中啟動/usr/local/bin/inspection_robot_launcher.bash
::: spoiler rc.local
```bash=
#!/bin/bash
echo "startup log" > /usr/local/test.log
source /usr/local/bin/inspection_robot_launcher.bash
exit 0
```
:::
::: spoiler inspection_robot_launcher.bash
```bash=
#!/bin/bash
# ROS packages path
source /opt/ros/melodic/setup.bash
# Inspection robot packages workspace
source /home/lcp/lcp_ws/devel/setup.bash
source /home/lcp/catkin_ws_gpr/devel/setup.bash
# ping the lidar before starting
while ! ping -c 1 -n -w 3 192.168.1.1 &> /dev/null
do
echo 'Lidar network not ready. Will retry every three second.'
done
echo 'Lidar network ready. Starting the Scout system.'
# Bringup the gpr launch file
roslaunch gpr_server gpr.launch > /dev/null 2>&1
```
:::
Debug 可使用以下指令 啟動和終止service
```bash=
sudo systemctl start rc-local
sudo systemctl stop rc-local
```
> Reference: https://ubuntuqa.com/zh-tw/article/6408.html
### Main Controller
從[GoogleDriver -> Release -> TPW2_main_controller](https://drive.google.com/drive/folders/1orrBgCaFlFiazO-jKIEoTV1Es8RlXKih?usp=sharing)下載.jar到指定位置
使用ubuntu的 "Startup Applications",開啟新項目將下列command加入
```
gnome-terminal --working-directory=/home/lcp/檔案路徑/ -e 'sh run.sh'
```
> gnome-terminal是用於啟動ubuntu的terminal程式,command可於ALT+F2的控制模式中測試。
> Reference: https://askubuntu.com/questions/48321/how-do-i-start-applications-automatically-on-login
另一個方式,與上述方法等效
在"/home/tirc/.config/autostart"內建立檔案:
#### maincontroller.desktop
```!shell=
[Desktop Entry]
Type=Application
Exec=gnome-terminal --working-directory=/home/lcp/檔案路徑/ -e 'sh run.sh'
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=MainController_Run
Comment=Run MainController
```
Main Controller的自動登入方式 :
把位於 /home/lcp/TPW1_MainController/setting.json 參數檔中
```
manualConnect = False
```
## 遠端桌面
使用x11vnc,設置方式參考以下網頁
https://www.footmark.info/embedded-systems/raspberry-pi/ubuntu-server-x11vncr-raspberry-pi/
note. 沒接螢幕時會是黑畫面,可能要用hdmi dummy試試。
## Echo Robot data/ Use rviz on a remote computer
* IP List
```
LCP: 192.168.2.10
TPW1: 192.168.178.x
```
* Add robots' IP to hosts on the remote computer (/etc/hosts)
```
192.168.2.10 inspection-robot inspection-robot
```
* Set ROS_HOSTNAME and ROS_IP in .bashrc file
```
export ROS_MASTER_URI=http://192.168.2.10:11311
export ROS_HOSTNAME=192.168.2.10
```
* Start a new terminal on the remote computer, and check if the computer can communicate with the robot master by typing "rostopic echo /($ topic_name)" locally.
## 其他
* 修改地圖檔案,可使用Gimp。修改後圖檔->以原檔案類型匯出->選raw data
https://www.gimp.org/downloads/
* TF 設定:
```
~/lcp_ws/src/sensors_bringup/launch/sensors_without_lidar.launch
```
* Set udev rule for IMU
設定路徑: /etc/udev/rules.d/100-um7.rules
```
KERNEL=="ttyACM*", ATTRS{idVendor}=="2341", ATTRS{idProduct}=="0058", MODE:="0666", GROUP:="dialout", SYMLINK+="motor"
```
* Set udev rule for linear Motor
設定路徑: /etc/udev/rules.d/100-linear-motor.rules
```
KERNEL=="ttyUSB*", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", GROUP:="dialout",MODE:="0666" SYMLINK+="um7"
```
:::spoiler pr2_indiv_no_kinect.launch
```shell=
<launch>
<arg name="marker_size" default="5.8" />
<arg name="max_new_marker_error" default="0.08" />
<arg name="max_track_error" default="0.2" />
<arg name="cam_image_topic" default="/camera/color/image_raw" />
<arg name="cam_info_topic" default="/camera/color/camera_info" />
<arg name="output_frame" default="base_link" />
<node name="ar_track_alvar" pkg="ar_track_alvar" type="individualMarkersNoKinect" respawn="false" output="screen">
<param name="marker_size" type="double" value="$(arg marker_size)" />
<param name="max_new_marker_error" type="double" value="$(arg max_new_marker_error)" />
<param name="max_track_error" type="double" value="$(arg max_track_error)" />
<param name="output_frame" type="string" value="$(arg output_frame)" />
<remap from="camera_image" to="$(arg cam_image_topic)" />
<remap from="camera_info" to="$(arg cam_info_topic)" />
</node>
</launch>
```
:::
## Main Controller
- bitbucket - GPR_main
### ON LINUX(for building .jar file)
先至雲端Release資料夾(Jim管理)安裝[JAVA JDK8後](https://drive.google.com/drive/u/0/folders/16dgZYfPIODOIz6GzUScGQERo4qmZD0QS)再安裝[maven](https://www.gushiciku.cn/pl/gaow/zh-tw)
```bash=
git clone https://bitbucket.org/tirctw/gpr_main.git
git submodule init
git submodule update
cd gpr_main
bash build.sh
```
### ON WINDOWS USING ECLIPSE(for develop and debug)
#### Install [jre/jdk](https://drive.google.com/drive/u/0/folders/16dgZYfPIODOIz6GzUScGQERo4qmZD0QS)
#### eclipse (Eclipse IDE for Enterprise Java and Web Developers)
file -> import -> maven -> existing maven project -> browse gpr_main
select all -> file -> import -> maven -> existing maven project -> browse submodule