---
# System prepended metadata

title: Lab problems
tags: [基隆]

---

###### tags: `基隆`
# Lab problems

![](https://i.imgur.com/yQ0nizp.png)

## Linux:
1. 連到 TP-Link_353F 或 TP-Link_353F_5G 
2. SSH 到自己小隊的 RPi
    > pix@192.168.0.20x
    > pwd: nctu-auv 
    >> e.g. pi6@192.168.0.206
 
3. 請照著以下指令操作
:::info
這個部分的練習是為了讓你們熟悉基本指令操作
`ls -al` 是讓你們觀察檔案
:::
``` bash=
# 看看底下有什麼檔案
$ ls
$ ls -al

# 創建資料夾
# 這個資料夾名字每個人別用一樣的
$ mkdir <你自己隨便取一個不重複的>
$ ls -al

# 移動進去
# tip: 善用tab
$ cd <剛剛取的名字>
$ ls -al

# 再創一個資料夾
$ mkdir lab_problems
$ ls -al
$ cd lab_problems
$ ls -al

# 用vim編輯一個檔案
$ vim test.py
# 在裡面打上一些能跑的python code
# code 第一行打上: #! /usr/bin/python3
# 用 python3 跑跑看
```
像是
``` python3
#! /usr/bin/python3
print('hi')
....
```
``` bash=+
# 看一下 test.py 的資訊
$ ls -al
# 執行看看
$ ./test.py
# 更改 test.py 為執行檔
$ chmod +x test.py
# 再執行看看
$ ./test.py

# 將 test.py 移回上一層
$ mv test.py ../
$ ls -al
$ cd ../
# 改名
$ mv test.py haha.py
$ ls -al

# 複製一份到 test
$ cp haha.py <那個資料夾>/
$ ls <那個資料夾>/
# 刪除
$ rm ./<那個資料夾>/haha.py
```

---
# 控制小船的基本操作
**這裡是你們控制小船的基本操作**
**請好好了解**
## 複習ROS
- 需要在 rpi 上開啟 `roscore`
- 我們的 code 由兩部分組成
- talker 傳送 rabboni 的控制訊號 *在學長姐的電腦上*
- listener 接收移動命令並控制馬達 *在rpi上*
- 兩台電腦都要設定 `.bashrc` 並 `source`
- *在rpi上* `rosrun auv_keelung rab_listener_normal.py` 開啟listener
- *在rpi上* `roslaunch usb_cam `

### 修改 .bashrc
1. 它位於 User 的家目錄
2. 裡面記錄著 terminal 的設定檔
3. 修改完要經過 source 才會生效
4. 在pi上做一次就好

:::info
之後控制小船會用到
你們需要熟悉這部分的修改
:::
##### 配合 ROS 修改內容
:::warning
請在學長姐的電腦操作這部分
:::
查詢ip: `$ ifconfig`
``` bash
$ cd
$ vim .bashrc
```
以下擺在`.bashrc`最後面
``` bash=
export ROS_IP=<剛剛看到的IP>
export ROS_MASTER_URI=http://<開roscore的IP>:11311
source ~/keelung_catkin_ws/devel/setup.bash
```
`$ source .bashrc`

---

### ROS - workdspace setup
``` bash
$ cd keelung_catkin_ws
$ source devel/setup.bash
```

# 若屢次嘗試卻無法成功，請重開Terminal

---

## 實作發佈者(publisher)和訂閱者(subscriber)

### 建立python檔

#### 發佈者(publisher)
```
vim publisher.py
```
將發佈者(publisher)的python code複製並貼上(ctrl+shift+v)到裡面後儲存離開(先按ESC再按:wq)

```python=
#!/usr/bin/env python3
import rospy
from std_msgs.msg import String

def talker():
    rospy.init_node('talker', anonymous=True)
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rate = rospy.Rate(10) # 10hz

    while not rospy.is_shutdown():
        hello_str = "hello world"
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()

if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass
```

#### 訂閱者(subscriber)

```
vim subscriber.py
```
將訂閱者(subscriber)的python code複製並貼上(ctrl+shift+v)到裡面後儲存離開(先按ESC再按:wq)

``` python=
#!/usr/bin/env python3
import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo("I heard %s", data.data)
     
def listener():
    rospy.init_node('listener', anonymous=True)
    rospy.Subscriber('chatter', String, callback)
    rospy.spin()

if __name__ == '__main__':
    listener()
```

### 啟動ROS
```
roscore
```

### 執行python檔
開啟兩個新終端機並分別打上
```
python3 publisher.py
python3 subscriber.py
```
可以去看ROS講義裡的執行結果是否和自己的相同

---

## Python: 
- 請寫一python程式，印出下面的圖型:
*             1
             22
            333
           4444
          55555
         666666
        7777777
       88888888
      999999999

