本專案目的在提供簡單的範例以ROS架構整合載具驅動、視覺偵測、手臂驅動、搖桿控制,不包含3D定位、SLAM、自動控制的部份。 整合項目包括:
- raspberry pi ros 主程式
- rosserial arduino馬達驅動(含雙輪驅動與相機轉動)
- rosserial tcp esp8266手臂驅動
- urdf建模與gazebo模擬
- ros control 馬達驅動
- movit 手臂路徑規劃
- 搖桿控制
- picamera影像擷取與yolo物件偵測
- apriltag偵測
- PC OS: ubuntu 18.04
- Raspberry PI OS: ubuntu mate 18.04
- ROS version: medolic
主程式放在Raspberry PI,透過rosserial與arduino溝通,由arduino控制車子移動與相機轉動; 同時以rosserial tcp與手臂(esp8266板)溝通,經由moveit輸出移動路徑; PC端連接搖桿控制車子與手臂,並取得camera影像做假蕃茄和apriltag偵測。
- 從github下載程式 git pull https://github.com/aga3134/topower_v1.git 到ros working space的src資料夾
- 將yolo的函式庫libdarknet.so複製到src/yolo資料夾裡
- 如果在PC上使用可將src/yolo資料夾裡的libdarknet.so.pc改名為libdarknet.so
- 如果在Raspberry PI上使用可將src/yolo資料夾裡的libdarknet.so.pi改名為libdarknet.so;
- 如果兩個都不能用就從yolo source code自己編譯。
- 將apriltag函式庫libapriltag.so複製到src/apriltag資料夾裡
- 如果在PC上使用可將src/apriltag資料夾裡的libapriltag.so.pc改名為libapriltag.so;
- 如果在Raspberry PI上使用可將src/apriltag資料夾裡的libapriltag.so.pi改名為libapriltag.so;
- 如果兩個都不行就從apriltag source code自己編譯。
- 安裝需要的ros package
- sudo apt-get install ros-melodic-moveit ros-melodic-rosserial-arduino ros-melodic-rosserial ros-melodic-joy ros-melodic-ros-control ros-melodic-ros-controllers ros-melodic-cv-bridge ros-melodic-vision-opencv
- 在ros working space資料夾執行catkin_make編譯程式
- 在ros working space資料夾執行source devel/setup.bash更新ros狀態
- 在arduino放函式庫的資料夾執行 rosrun rosserial_arduino make_libraries.py . 產生ros自定義的message
- 將arduino/RosArduinoMotorControl/RosArduinoMotorControl.ino透過arduino IDE燒進arduino uno板。
- 在arduino放函式庫的資料夾執行 rosrun rosserial_arduino make_libraries.py . 產生ros自定義的message
- 手臂控制板esp8266可用arduino IDE燒入程式,但需先安裝相關檔案。安裝方式可參考這裡
- 修改esp8266_arm/RosESP8266Arm/RosESP8266Arm.ino裡的ssid、password,並把server的IP address設為執行roscore的機器IP
- 將esp8266_arm/RosESP8266Arm/RosESP8266Arm.ino透過arduino IDE燒進esp8266板。
- joy_control.launch 搖桿控制功能
- topower_v1_demo.launch 實體機器控制主程式,包含手臂、車子、相機之間的控制與溝通
- topower_v1_gazebo.launch 開啟gazebo做土砲1號模擬控制
- topower_v1_remote.launch pc端遠端操控實體機器,包含搖桿控制、yolo物件偵測、apriltag偵測
- topower_v1_rviz.launch 開啟rviz將目前狀態做視覺化顯示
* 如果是用ssh連入機器,因為沒有視窗界面,gazebo跟rviz都無法開啟。
* 在raspberry pi上跑gazebo雖然可以開,但可能因為記憶體不足,打開之後會整個當掉。
在ROS中若要做到兩台機器間互相溝通,兩台機器需在同一個內網下(除非你有固定對外的IP),並且設定ROS_MASTER_URI和ROS_IP(或ROS_HOSTNAME,跟ROS_IP二擇一)
設定指令:
- export ROS_MASTER_URI=http://{執行roscore的機器IP或hostname}:11311
- export ROS_IP={這台機器的IP} 或
- export ROS_HOSTNAME={這台機器的hostname}
- 若是使用hostname,需在/etc/hosts中寫入ip跟hostname的對應關係
把前面所有東西設定好後,ssh進raspberry pi執行start_demo.sh(裡面會跑topower_v1_demo.launch),然後在pc中執行topower_v1_remote.launch做遠端操控跟影像辨識。最後打開rqt觀看影像處理結果。
搖桿控制包含車體控制跟手臂控制兩種模式,按鈕依羅技F310搖桿設定。如果使用不同搖桿,可進joy_control.launch調整。
在rqt中打開image view plugin,並把topic設成/topower_v1/camera/yolo_result/compressed
在rqt中打開image view plugin,並把topic設成/topower_v1/camera/apriltag/compressed
- arduino: 放arduino車體控制程式
- RosArduinoHelloWorld: arduino跟ros溝通的簡單範例
- RosArduinoMotorControl: arduino控制車體的程式
- esp8266_arm: 放esp8266手臂控制程式
- RosESP8266Arm: esp8266手臂控制程式
- RosESP8266HelloWorld: esp8266跟ros溝通的簡單範例
- topower_v1: ros主程式的package
- config: 放參數檔
- cfg.fake-tomato: yolo參數設定,使用yolov3-tiny訓練假蕃茄模型
- topower_v1_control.yaml: ros control參數設定
- topower_v1_moveit.rviz: rviz設定for moveit測試
- topower_v1_rviz.rviz: rviz設定for urdf debug
- launch: 放launch檔
- joy_control.launch: 搖桿控制
- topower_v1_demo.launch: 實體機器控制
- topower_v1_gazebo.launch: gazebo模擬
- topower_v1_remote.launch: 遠端控制
- topower_v1_rviz.launch: 開啟rviz做urdf debug
- msg: 放message定
- ArmJoyCmd.msg: 搖桿傳給moveit控制手臂的訊號
- ArmPose.msg: 傳給esp8266手臂的訊號
- CamPanTilt.msg: 控制相機轉動的訊號
- WheelDrive.msg: 控制車子移動的訊號
- robot_model: 放土砲1號的urdf定義
- 最上層的定義是topower_v1.xacro,裡面會將其他xacro檔叫進來
- topower_v1_arm.urdf.xacro、topower_v1_pan_tilt_cam.urdf.xacro、topower_v1_vehicle.urdf.xacro分別定義手臂、相機、車體機構
- topower_v1_common.xacro定義給其他xacro共用的元素
- topower_v1.gazebo定義給gazebo看的參數
- materials.xacro定義在rviz顯示的顏色
- src: 放主程式
- apriltag: 偵測apriltag的程式
- topower_v1: 主要控制程式
- arm_control_node.py: 手臂控制程式
- cam_capture_node.py: 相機取像程式
- car_control_node.py: 車體控制程式
- joy_mapper_node.py: 搖桿控制程式
- yolo: 偵測假蕃茄的程式
- topower_v1_hw.cpp: 定義土炮1號的hardware interface,跟實體機器溝通
- worlds: 放gazebo場景
- config: 放參數檔
- topower_v1_moveit: 由moveit setup assistant產生的package
- arduino digital out
- 左輪前進: pin 11
- 左輪後退: pin 10
- 右輪前進: pin 6
- 右輪後退: pin 9
- 相機左右轉: pin 3
- 相機上下轉: pin 5
- 所有pin輸出皆需PWM功能,程式使用SoftPWM函式庫,選哪個pin輸出應該都ok
- 相機轉動的伺服馬達直接吃arduino輸出的5v電源
- 雙輪馬達驅動時的突波會影響伺服馬達位置,所以雙輪馬達另外從USB行動電源獨立供電
- 萬向輪固定用兩個螺帽上下夾緊,方便調整車體水平
- BOM
- raspberry pi上執行yolov3-tiny跑不起來,可能是記憶體不足,網路上有範例是跑yolov2-tiny,但是很慢。之後需搭配NCS2或改用jetson nano
- 手臂使用的串列馬達雖然可以設定移動速度,但是使用搖桿控制因為會連續一直傳位置給手臂,速度調快動作會頓、調慢則會lag;如果是直接給一個目標位置一次移動到位則不會有這個問題。
- moveit預設的ik solver對目前使用的手臂容易算不出角度,要實用的話需自己寫轉換或試用其他ik solver
- 車子跑一跑輪子容易掉下來
- apriltag看起來很穩定,但是有部分遮蔽就會抓不到。如果農場植物會長得很雜亂可能不適用
- 截取相機照片如果有開啟上下或左右flip,有時會取到顛倒的畫面
- 夾爪打開或關閉時會抖,有時還會在沒訊號控制的時候自己動