使用ROS1驅動程式操控ADI Trinamic馬達控制器
使用ROS1驅動程式操控ADI Trinamic馬達控制器
作者:ADI 軟體系統工程師 Krizelle Apostol, 資深軟體系統工程師Jamila Macagba, 及軟體系統設計工程經理Maggie Maralit
摘要
TMC ROS1驅動程式支援TMC驅動層和應用層之間在ROS框架內無縫通訊,且適用於其支援的各種TMC板。本文將深入探討TMC ROS1驅動程式的功能,包括馬達控制、資訊檢索、指令執行、參數擷取以及對多種設定的支援。文中並概述了如何將馬達控制器整合到嵌入式系統和應用中,進而利用ROS框架提供的優勢。
ADI Trinamic馬達控制器ROS1驅動程式
ROS是一個機器人系統中間層,包含一組軟體庫和強大的開發工具,從驅動程式到最先進的演算法,可以在此基礎上開發機器人系統或應用程式。 ADI 馬達控制器支援新型智慧執行器,並且隨著ROS變得越來越流行,尤其是在機器人領域,為了擴展在製造和工業自動化應用中的適用性,我們開發了ROS驅動程式等附加模組支援。ADI的TMC ROS1驅動程式提供與Triaminic馬達控制語言整合式開發環境(TMCL-IDE)類似的功能,但有一個關鍵區別:其允許支援ROS的系統中的節點使用TMC,而無需額外安裝驅動程式。此外,adi_tmcl整合自己的TMCL協議解譯器,因此,能夠解釋符合TMCL標準的用戶請求的指令。最後一層是tmcl_ros_node,其建立了與ROS系統的直接介面,提供發佈者、訂閱者和服務等功能。每一個功能都可以使用一組參數進行自訂,以下部分將詳細討論這些功能。
功能
1. 支援多種TMC模組
TMC ROS驅動程式或adi_tmcl目的在支援所有遵守TMCL協定的商用TMC。截至本文發佈時,其目前都還支援CAN介面(特別是SocketCAN)。但開發工作還在進行中,不久的將來可望支援其他介面。這些TMC包含ADI Trinamic PANdriveTM 智能馬達和 模組, 可以支援步進馬達和直流無刷伺服(BLDC)馬達。由於使用ROS參數,adi_tmcl能夠無縫支援不同的TMC模組。只需配置 tmcl_ros_node而無需重新建構整個套件。
在adi_tmcl/config目錄中,每個ADI Trinamic馬達控制器模組(TMCM)都有兩個相關的YAML檔。這些檔以人類可讀的資料序列化語言編寫,包含ROS參數,應在執行期間載入:
- X adi_tmcl/config/autogenerated/TMCM-XXXX.yaml
此YAML檔是自動生成的,包含特定於模組的參數,不建議修改,以免導致節點行為異常。
- adi_tmcl/config/TMCM-XXXX_Ext.yaml
此YAML檔包含用戶可以修改的所有參數,以便(1)與板通訊(例如介面名稱),(2)實現馬達控制,以及(3)更改ROS主題名稱。
例如,如果您想使用 TMCM-1636 圖3),只需運行圖1所示的代碼。
Terminal |
# Launch using TMCM-1636 ~/catkin_ws $ roslaunch adi_tmcl tmcm_1636.launch # To exit the node, press Ctrl + C |
圖1. 啟動TMCM-1636。
其中,adi_tmcl/launch/tmcm_1636.launch載入TMCM-1636專用的YAML 檔。
Tmcm_1636.launch |
[…] <!--Launches node--> <node name="tmcl_ros_node" pkg="adi_tmcl" type="tmcl_ros_node" output="screen" required="true">
<!-- Autogenerated YAML file containing TMCM-1636 configurations -->
</node><rosparam command="load" file="$(find adi_tmcl)/config/autogenerated/TMCM-1636.yaml" /> <!-- User-generated YAML file containing ROS-specific parameters as well as user-set values for TMCM-1636 configurations --> <rosparam command="load" file="$(find adi_tmcl)/config/TMCM-1636_Ext.yaml" /> […] |
圖2. 使用TMCM-1636執行TMC ROS驅動程式的程式碼片段。
圖3. (上)TMCM-1636硬體連接圖;(下)實際設定的參考圖片。 |
要使用 TMCM-1260(圖6),請執行以下指令:
Terminal |
# Launch using TMCM-1260 ~/catkin_ws $ roslaunch adi_tmcl tmcm_1260.launch # To exit the node, press Ctrl + C |
圖4. 使用TMCM-1260啟動TMC ROS驅動程式的指令。
其中,adi_tmcl/launch/tmcm_1260.launch載入TMCM-1260專用的YAML 檔。
tmcm_1260.launch |
[…] <!--Launches node--> <node name="tmcl_ros_node" pkg="adi_tmcl" type="tmcl_ros_node" output="screen" required="true"> <!-- Autogenerated YAML file containing TMCM-1260 configurations -->
</node><rosparam command="load" file="$(find adi_tmcl)/config/autogenerated/TMCM-1260.yaml" /> <!-- User-generated YAML file containing ROS-specific parameters as well as user-set values for TMCM-1260 configurations --> <rosparam command="load" file="$(find adi_tmcl)/config/TMCM-1260_Ext.yaml" /> […] |
圖5. 使用TMCM-1260執行TMC ROS驅動程式的程式碼片段。
圖6. (上)TMCM-1260硬體連接圖;(下)實際設定的參考圖片。 |
啟動目錄包括所有支援的TMC模組,可以點擊 此處查看。
2. 使用TMCL-IDE一次性配置TMC模組
在透過ROS使用TMC模組之前,需要根據所使用的馬達完成配置。所有的配置使用TMCL-IDE完成,並應儲存在EEPROM中(否則可能無法正確控制馬達)。
- BLDC馬達模組(如TMCM-1636)
- 步進馬達模組(如TMCM-1260)
- 有關如何在TMCL-IDE中透過Wizard Pool功能完成初始化配置的流程/教程,請查看此 教程。
初始化和調諧後,務必將所有參數儲存在板的EEPROM中。這可以透過如下方法來完成:(1) store參數,(2) STAP指令,以及/或者(3)創建和上傳TMCL程式並啟用自動啟動模式。有些板僅支援其中的少數選項。
TMC ROS驅動程式的設計得到了簡化,在完成TMC模組和馬達的初始化配置/調諧後,基於使用TMCL-IDE的一次性配置即可控制馬達。
3. 移動⁄停止馬達
TMC ROS驅動程式透過在以下任一主題中發佈指令來移動/停止馬達:
- /cmd_vel/cmd_vel (geometry_msgs/Twist)—設定馬達轉速
- /cmd_abspos (std_msgs/Int32)—設定馬達的絕對位置
- /cmd_relpos (std_msgs/Int32)—設定馬達的相對位置
- /cmd_trq (std_msgs/Int32)—設定馬達扭矩
注:多軸TMC設定中的不同馬達有不同的位址。
使用者可以連接ROS系統來發送至這些特定指令,進而控制馬達的運動。指令的選擇取決於具體應用、TMC設定以及所用馬達的類型。例如,對於輪式機器人,使用者可以選擇設定速度;而對於夾具,設定位置會更合適。
作為說明性示例,可以查看腳本adi_tmcl/scripts/fake_cmd_vel.sh。這個簡單的腳本可以控制馬達以順時針和逆時針兩個方向旋轉,並且逐漸提高轉速。若要執行此腳本,請按照圖7所示的指令進行操作。
Terminal #1 |
~ $ cd ~/catkin_ws ~/catkin_ws $ source /opt/ros/noetic/setup.bash ~/catkin_ws $ source devel/setup.bash ~/catkin_ws $ roslaunch adi_tmcl tmcm_1260.launch # or $ roslaunch adi_tmcl tmcm_1636.launch |
Terminal #2 |
~ $ cd ~/catkin_ws ~/catkin_ws $ source /opt/ros/noetic/setup.bash ~/catkin_ws $ source devel/setup.bash ~/catkin_ws $ rostopic echo /tmc_info_0 |
Terminal #3 |
~ $ cd ~/catkin_ws/src/adi_tmcl/scripts ~/catkin_ws/src/adi_tmcl/scripts $ sudo chmod +x fake_cmd_vel.sh ~/catkin_ws/src/adi_tmcl/scripts $ ./fake_cmd_vel.sh |
圖7. 用於測試TMC ROS驅動程式轉速控制的指令。
注意:
- 2號終端視窗和3號終端視窗最好並排顯示。
- 可以按Ctrl-C複製1號終端視窗中的指令,完成後貼到2號終端視窗中。
- 3號終端視窗中的指令會自行停止。
為了驗證馬達是否已移動,圖8顯示了來自TMC (/tmc_info_0)的實際轉速回饋圖。
圖8. 使用RQT繪製的馬達實際轉速圖(以m/s為單位) |
4. TMC⁄馬達資訊檢索
系統可以透過訂閱以下主題,從TMC ROS驅動程式檢索資訊:
- /tmc_info (adi_tmcl/TmcInfo)- 提供電壓、TMC狀態、實際轉速、 實際位置和實際扭矩資訊
註:多軸TMC設定中的不同馬達有不同的主題。
使用者可以連結ROS系統來訂閱這些指定的主題。如此使用者就可以監視參數值,並根據參數值採取行動。例如,在特定應用的場景中,當檢測到TMC狀態出錯時,操作員可能會選擇停止系統,或者在馬達到達特定位置時執行預程式設計的動作。
舉例而言,透過adi_tmcl/scripts/fake_cmd_pos.sh這個簡單的腳本,其讓馬達先順時針旋轉,再逆時針旋轉,並且不斷提高位置幅度。請執行圖9所示的指令。
Terminal #1 |
~ $ cd ~/catkin_ws ~/catkin_ws $ source /opt/ros/noetic/setup.bash ~/catkin_ws $ source devel/setup.bash ~/catkin_ws $ roslaunch adi_tmcl tmcm_1260.launch # or $ roslaunch adi_tmcl tmcm_1636.launch |
Terminal #2 |
~ $ cd ~/catkin_ws ~/catkin_ws $ source /opt/ros/noetic/setup.bash ~/catkin_ws $ source devel/setup.bash ~/catkin_ws $ rostopic echo /tmc_info_0 |
Terminal #3 |
~ $ cd ~/catkin_ws/src/adi_tmcl/scripts ~/catkin_ws/src/adi_tmcl/scripts $ sudo chmod +x fake_cmd_pos.sh ~/catkin_ws/src/adi_tmcl/scripts $ ./fake_cmd_pos.sh |
圖9. 用於測試TMC ROS驅動程式位置控制的指令。
為了驗證馬達是否已移動,圖10顯示了來自TMC (/ (/tmc_info_0)的實際位置回讀圖。
圖10. 使用RQT繪製的馬達實際位置圖(以度為單位)。 |
5. 執行自訂TMC指令
系統可以透過執行以下功能存取和調整TMC參數:
- tmcl_custom_cmd (adi_tmcl/TmcCustomCmd) – 擷取/設定TMC的軸參數AP和全域參數(GP)的值
使用者可以選擇將此服務整合到ROS系統中,以滿足特定應用需求。此功能讓使用者能夠直接從ROS驅動程式配置TMC板。例如,用戶可以選擇設定軸參數(SAP)以獲得最大電流,進而調整允許的絕對電流水準。但是,用戶必須透徹瞭解他們要透過此功能修改的參數,不正確的設定可能會導致TMC ROS驅動程式故障。因此,強烈建議任何配置都透過TMCL-IDE執行。圖11提供了調用此服務的示例,展示了使用指令類型208對DrvStatusFlags進行擷取軸參數(GAP)操作。
圖11. 透過RQT觸發的tmcl_custom_cmd服務。 |
6. 存取所有軸參數值
系統可以透過以下方式存取TMC軸參數值:
- tmcl_gap (adi_tmcl/TmcGapGgpAll) – 擷取指定馬達/軸的所有TMC軸參數(AP)的值
使用者可以將ROS系統與此功能整合,以滿足特定應用的需求。例如,此服務可以擷取TMC板的目前設定和狀態,包括AP(例如編碼器步長、PI調諧、換向模式等)。
圖12顯示了部分輸出示例。透過分析該結果,使用者可以確認一次性配置是否正確保存在板的EEPROM中。
圖12. 透過RQT觸發的tmcl_gap_all服務。 |
7. 存取所有全域參數值
系統可以透過以下方式存取TMC全域參數值:
- tmcl_ggp (adi_tmcl/TmcGapGgpAll) -擷取所有TMC全域參數(GP)的值
此功能可以檢索TMC板的目前配置和狀態。可存取的一些GP包括:CAN位元速率、串列傳輸速率、自動啟動模式等。
圖13顯示了執行此服務後獲得的部分輸出。此結果讓使用者能夠確認一次性配置是否已正確儲存在板的EEPROM中。
圖13. 透過RQT觸發的tmcl_ggp_all。 |
8. 多個TMC板設定
對於可能需要多個TMC模組的較大系統(如機械手臂),TMC ROS驅動程式支援多個元件設定。
a. 多個CAN通道中的多個TMC板
如圖14所示,當用戶的每個TMC板都有一個CAN-USB時,系統將增加命名空間以區分每個節點的實例。在此特定用例中,需要相應更新 comm_interface_name 參數,以確保與板正確通訊。
圖14. 多個CAN通道中的多個TMC板的示例圖 |
圖15中的代碼是用於設定此用例的示例開機檔案。在此示例中,馬達A可以透過發佈到 /tmcm1/cmd_abspos來控制,馬達B可以透過發佈到 /tmcm2/cmd_abspos來控制,馬達C可以透過發佈到 /tmcm3/cmd_abspos來控制。
multiple_tmcm_multiple_can_channel.launch |
[…] <group ns="tmcm1">
<node name="tmcl_ros_node" pkg="adi_tmcl" type="tmcl_ros_node" output="screen" required="true">
</group><rosparam command="load" file="$(find adi_tmcl)/config/autogenerated/TMCM-1260.yaml" />
</node><rosparam command="load" file="$(find adi_tmcl)/config/TMCM-1260_Ext.yaml" /> <param name="comm_interface_name" type="string" value="can0" /> <group ns="tmcm2">
<node name="tmcl_ros_node" pkg="adi_tmcl" type="tmcl_ros_node" output="screen" required="true">
</group><rosparam command="load" file="$(find adi_tmcl)/config/autogenerated/TMCM-1260.yaml" />
</node><rosparam command="load" file="$(find adi_tmcl)/config/TMCM-1260_Ext.yaml" /> <param name="comm_interface_name" type="string" value="can1" /> <group ns="tmcm3">
<node name="tmcl_ros_node" pkg="adi_tmcl" type="tmcl_ros_node" output="screen" required="true">
</group><rosparam command="load" file="$(find adi_tmcl)/config/autogenerated/TMCM-1260.yaml />
</node><rosparam command="load" file="$(find adi_tmcl)/config/TMCM-1260_Ext.yaml" /> <param name="comm_interface_name" type="string" value="can2" /> […] |
圖15. 使用多個CAN通道執行多個TMC ROS驅動程式的程式碼片段。
b. 單個CAN通道中的多個TMC板
TMC ROS驅動程式支援的另一種設定是單個CAN通道中有多個TMC板, 如圖16所示。與上文所述的對多個TMC板的支援非常相似,系統引入命名空間來區分每個節點實例。所有板的comm_interface_name 保持一致。調整 comm_tx_id 和 comm_rx_id 以確保與各板正確通訊。
圖16. 單CAN通道中的多個TMC板的示例圖。 |
圖17顯示了用於設定此用例的示例開機檔案。在此示例中,馬達A可以透過發佈到/tmcm1/cmd_abspos來控制,馬達B可以透過發佈到/tmcm2/cmd_abspos來控制,馬達C可以透過發佈到/tmcm3/cmd_abspos來控制。
multiple_tmcm_single_can_channel.launch |
[…] <group ns="tmcm1">
<node name= "tmcl_ros_node" pkg="adi_tmcl" type="tmcl_ros_node" output="screen" required="true">
</group><rosparam command="load" file="$(find adi_tmcl)/config/autogenerated/TMCM-1260.yaml" />
</node><rosparam command="load" file="$(find adi_tmcl)/config/TMCM-1260_Ext.yaml" /> <param name="comm_tx_id" type="int" value="1" /> <param name="comm_rx_id" type="int" value="2" /> <group ns="tmcm2">
<node name="tmcl_ros_node" pkg="adi_tmcl" type="tmcl_ros_node" output="screen" required="true">
</group>
<rosparam command="load" file="$(find adi_tmcl)/config/autogenerated/TMCM-1260.yaml" />
</node><rosparam command="load" file="$(find adi_tmcl)/config/TMCM-1260_Ext.yaml" /> <param name="comm_tx_id" type="int" value="3" /> <param name="comm_rx_id" type="int" value="4" /> <group ns="tmcm3">
<node name="tmcl_ros_node" pkg="adi_tmcl" type="tmcl_ros_node" output="screen" required="true">
</group><rosparam command="load" file="$(find adi_tmcl)/config/autogenerated/TMCM-1260.yaml" />
</node><rosparam command="load" file="$(find adi_tmcl)/config/TMCM-1260_Ext.yaml" /> <param name="comm_tx_id" type="int" value="5" /> <param name="comm_rx_id" type="int" value="6" /> […] |
圖17. 使用單個CAN通道執行多個TMC ROS驅動程式的程式碼片段。
9. 輕鬆整合到ROS系統⁄應用中
透過ROS提供的消息傳遞系統,即便是較大的系統也可以輕鬆地交換節點(例如驅動程式、演算法等)。TMC ROS驅動程式將這一優勢擴展到了TMC板,允許其無縫整合到ROS系統/應用中。
a. 整合到AGV⁄AMR中
圖18說明了 navigation_node 如何透過發送geometry_msg/Twist格式的/cmd_vel 來控制移動機器人。然後,motor_controller透過geometry_msg/Twist格式的/wheel_velocity發送回饋,使得 navigation_node可以相應地重新校準。
圖18. AGV/AMR的簡化架構。 |
透過瞭解 navigation_node發佈和訂閱的位置,motor_controller可以輕鬆更改tmcl_ros_node(圖19)。與TMC資訊檢索功能類似,adi_tmcl會發佈關於車輪轉速的即時資訊,wheel_velocity_node 會將車輪轉速資訊從 adi_tmcl/TmcInfo轉換為geometry_msg/Twist。由於新架構及其整合的TMC板符合正確的資料格式,因此移動機器人預計以相同方式工作。
圖19. 具有TMC ROS驅動程式的AGV/AMR簡化架構。 |
b. 整合到機械手臂中
圖20說明了為將TMC板整合到採用機械手臂的貼片應用中,控制機械臂需要使用多個馬達。與之前的用例類似,使用者需要確保pick_and_place_node 會訂閱/發佈所預期的資料格式。
圖20. (上)具有通用馬達控制器的機械手臂;(下)具有TMC板的機械手臂。 |
有關將TMC板整合到ROS系統的步驟指南以及如何利用所述的功能,請點擊 此處。
結論
ADI TMC ROS1驅動程式支援TMC基礎驅動層和應用層之間在ROS管理的系統內無縫通訊,且適用於其支援的各種TMC模組。
本文深入探討了ADI Trinamic馬達控制器ROS1驅動程式提供的功能,包括:
- 馬達運動控制
- 檢索馬達和控制器資訊
- 執行TMC指令
- 擷取軸和全域參數值
- 支援多個TMC模組控制設定
所有功能都是利用ROS的消息傳遞系統實現的,使得馬達控制器可以輕鬆整合到基於ROS的系統和應用中。
如需瞭解更多資訊,請瀏覽ADI 機器人網頁。
探索永不停息
- 查看文章 「實現機器人作業系統——ADI Trinamic馬達控制器ROS1驅動程式簡介」
- 敬請關注未來發表的有關用於ADI Trinamic馬達控制器的ROS2的文章!
- 下載Trinamic馬達控制器ROS1驅動程式
- 下載 Trinamic馬達控制器ROS2驅動程式
- 點擊 此處 購買ADI Trinamic馬達控制器評估板
- 點擊 此處 此處購買ADI Trinamic馬達