在ur12e上玩一玩ROS2 + Moveit2
一. 安裝
1. 環(huán)境:ubuntu24,RTX5070Ti,UR12e機(jī)械臂,Realsense D435i or D555 or D405雙目
2. 安裝ROS2
參考這里:https://docs.ros.org/en/jazzy/Installation/Ubuntu-Install-Debs.html,跟著只是一步一步cv指令就好。
另外,不想每次都source的話,安裝后要補(bǔ)上:
sudo vim ~/.bashrc source /opt/ros/jazzy/setup.bash source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash # colcon自動(dòng)補(bǔ)全
3. 安裝Moveit2
參考這里:https://moveit.ai/install-moveit2/binary/,安裝前先:
sudo apt install ros-$ROS_DISTRO-rmw-cyclonedds-cpp export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp sudo vim ~/.bashrc RMW_IMPLEMENTATION=rmw_cyclonedds_cpp # 最后寫(xiě)入這個(gè),把DDS換成cyclone DDS
然后按照官網(wǎng)去安裝就好
4. 安裝vscode和terminator
vscode:安裝【CMake】和【Robot Developer Extensions for ROS 2】插件
terminator:sudo apt install terminator(一個(gè)可以分屏的終端)
二. 配置機(jī)械臂
5. Create a URDF for a 6-axis Robotic Arm
URDF:統(tǒng)一機(jī)器人描述格式
cd ~/Project/ mkdir ros2_ws cd ros2_ws mkdir src colcon build # build完之后除了src外多了:build、log、install文件夾 cd install source setup.bash # source一下使得工作區(qū)可以運(yùn)行 vim ~/.bashrc source ~/Project/ros2_ws/install/setup.bash # 每次打開(kāi)bash都跑起這個(gè)工作區(qū) # 重啟終端 cd ~/Project/ros2_ws/src ros2 pkg create my_robot_description # 這時(shí)src文件夾下會(huì)多了:my_robot_description文件夾 cd my_robot_description # 這是會(huì)發(fā)現(xiàn)有CMakeLists.txt、include、package.xml、src,刪掉include和src文件夾 rm -rf include/ src/ # urdf就是描述文件了,launch啟動(dòng)文件用來(lái)可視化這個(gè)urdf,rviz用來(lái)放rviz的配置 mkdir urdf launch rviz # 然后我們就可以在vscode里面以src作為項(xiàng)目根目錄打開(kāi)了~ # 然后編輯CMakeLists.txt文件,刪掉BUILDING_TESTING的IF語(yǔ)句,加入: install( DIRECTORY launch rviz urdf DESTINATION share/${PROJECT_NAME} ) # 修改完之后切回終端 cd ~/Project/ros2_ws colcon build --packages-select my_robot_description
6. Create and Setup the URDF
URDF:Unified Robot Description Format 統(tǒng)一機(jī)器人描述格式
link可以理解為一個(gè)剛體,他可以是機(jī)械臂的手臂,也可以是基座等一切剛體。
【 文檔地址:https://wiki.ros.org/urdf/XML/link 】
在vscode中在urdf文件夾里面新建一個(gè)文件arm.urdf,輸入以下內(nèi)容:
<?xml version="1.0"?> <robot name="my_robot"> <!--材質(zhì)灰--> <material name="grey"> <color rgba="0.5 0.5 0.5 1.0" /> </material> <!--材質(zhì)紅--> <material name="blue"> <color rgba="0 0 0.5 1.0" /> </material> <!--基座--> <link name="base_link"> <visual> <geometry> <box size="0.4 0.4 0.1" /> </geometry> <!--原點(diǎn)向量--> <origin xyz="0 0 0.05" rpy="0 0 0" /> <!--通過(guò)name引用了上面的材質(zhì)--> <material name="grey" /> </visual> </link> <link name="shoulder_link"> <visual> <geometry> <cylinder length="0.5" radius="0.1" /> </geometry> <origin xyz="0 0 0.25" rpy="0 0 0" /> <material name="blue" /> </visual> </link> <joint name="joint1" type="revolute"> <parent link="base_link" /> <child link="shoulder_link" /> <origin xyz="0 0 0.1" rpy="0 0 0" /> <!--繞z旋轉(zhuǎn)--> <axis xyz="0 0 1" /> <!-- effort:作用在這個(gè)關(guān)節(jié)上的力,單位N,大于這個(gè)力運(yùn)動(dòng)就會(huì)被阻斷, velocity:轉(zhuǎn)速,秒/弧度, lower/upper:最小/大轉(zhuǎn)角--> <limit effort="1000.0" velocity="1.0" lower="-3.14" upper="3.14" /> </joint> </robot>
打開(kāi)終端,導(dǎo)航到urdf文件夾里面,輸入:
sudo apt install ros-jazzy-urdf-tutorial source ~/.bashrc
# 注意路徑只能是絕對(duì)路徑 ros2 launch urdf_tutorial display.launch.py model:=/home/gssl/Project/ros2_ws/src/my_robot_description/urdf/arm.urdf
這樣我們就可以在一個(gè)可視化的窗口里面看到剛才新建的小小的機(jī)械臂了~
n個(gè)link,就要有n-1個(gè)joint,如果沒(méi)有joint的話會(huì)報(bào)錯(cuò)
在跑這RVIz的時(shí)候輸入:
ros2 run tf2_tools view_frames
就會(huì)生成機(jī)械臂樹(shù)
PS:引入U(xiǎn)R12e的URDF文件(后面講講怎么從UR官網(wǎng)弄這份urdf出來(lái))
找你的UR機(jī)械臂的提供商拿到URDF文件,然后:
sudo apt update sudo apt install ros-jazzy-ur-description
然后把這份URDF拷到這個(gè)目錄里面打開(kāi)就可以了
7. Improve the URDF with Xacro
好處:material和geo分離;共性抽離;可以為機(jī)器人的不同部件模塊化配置;
把之前的arm.urdf拆成3份文件:my_robot.urdf.xacro、arm.xacro、common_properties.xacro
common_properties.xacro:
<?xml version="1.0"?> <robot xmlns:xacro="http://www.ros.org/wiki/xacro"> <!--材質(zhì)灰--> <material name="grey"> <color rgba="0.5 0.5 0.5 1.0" /> </material> <!--材質(zhì)紅--> <material name="blue"> <color rgba="0 0 0.5 1.0" /> </material> </robot>
arm.xacro:
<?xml version="1.0"?> <robot xmlns:xacro="http://www.ros.org/wiki/xacro"> <!--基座--> <link name="base_link"> <visual> <geometry> <box size="0.4 0.4 0.1" /> </geometry> <!--原點(diǎn)向量--> <origin xyz="0 0 0.05" rpy="0 0 0" /> <!--通過(guò)name引用了上面的材質(zhì)--> <material name="grey" /> </visual> </link> <link name="shoulder_link"> <visual> <geometry> <cylinder length="0.5" radius="0.1" /> </geometry> <origin xyz="0 0 0.25" rpy="0 0 0" /> <material name="blue" /> </visual> </link> <joint name="joint1" type="revolute"> <parent link="base_link" /> <child link="shoulder_link" /> <origin xyz="0 0 0.1" rpy="0 0 0" /> <!--繞z旋轉(zhuǎn)--> <axis xyz="0 0 1" /> <!-- effort: 作用在這個(gè)關(guān)節(jié)上的力,單位N,大于這個(gè)力運(yùn)動(dòng)就會(huì)被阻斷, velocity: 轉(zhuǎn)速,秒/弧度, lower/upper: 最小/大轉(zhuǎn)角--> <limit effort="1000.0" velocity="1.0" lower="-3.14" upper="3.14" /> </joint> </robot>
my_robot.urdf.xacro:
<?xml version="1.0"?> <robot name="my_robot" xmlns:xacro="http://www.ros.org/wiki/xacro"> <xacro:include filename="common_properties.xacro" /> <xacro:include filename="arm.xacro" /> </robot>
然后終端運(yùn)行:
ros2 launch urdf_tutorial display.launch.py model:=/home/gssl/Project/ros2_ws/src/my_robot_description/urdf/my_robot.urdf.xacro
8. Create a Launch File to Display the Robot
查看當(dāng)前ROS2節(jié)點(diǎn)的狀態(tài)
ros2 node list
rqt_graph
Launch File有xml和python兩種寫(xiě)法,這里先用xml入門(mén)~
在launch文件夾新建文件:display.launch.xml
display.launch.xml:
<launch> <let name="urdf_path" value="$(find-pkg-share my_robot_description)/urdf/my_robot.urdf.xacro"/> <let name="rviz_config_path" value="$(find-pkg-share my_robot_description)/rviz/urdf_config.rviz"/> <node pkg="robot_state_publisher" exec="robot_state_publisher"> <param name="robot_description" value="$(command 'xacro $(var urdf_path)')" /> </node> <!--調(diào)節(jié)關(guān)節(jié)的GUI--> <node pkg="joint_state_publisher_gui" exec="joint_state_publisher_gui" /> <node pkg="rviz2" exec="rviz2" output="screen" args="-d $(var rviz_config_path)" /> </launch>
然后在Bash輸入,后面的都按照這個(gè)跑:
cd ~/Project/ros2_ws
colcon build
source install/setup.bash
ros2 launch my_robot_description display.launch.xml
這時(shí)候會(huì)啥也沒(méi)有,在fix_frame選base_link;左下角Add,彈窗選擇RobotModel;Description Topic選/robot_description;左下角Add,添加TF
然后save as,保存rviz文件到src的rviz文件夾下,命名為:urdf_config.rviz
后面再打開(kāi)就不用配置了;
三. Set Up Your Robot for MoveIt
9. Add Collision Tags (配置剛體)
arm.xacro,加入碰撞體標(biāo)簽【collision】,描述碰撞體的幾個(gè)形狀:
<?xml version="1.0"?> <!--xmlns:xacro這個(gè)一定要加--> <robot xmlns:xacro="http://www.ros.org/wiki/xacro"> <!--基座--> <link name="base_link"> <visual> <geometry> <box size="0.4 0.4 0.1" /> </geometry> <!--原點(diǎn)向量--> <origin xyz="0 0 0.05" rpy="0 0 0" /> <!--通過(guò)name引用了上面的材質(zhì)--> <material name="grey" /> </visual> <collision> <geometry> <box size="0.4 0.4 0.1" /> </geometry> <!--原點(diǎn)向量--> <origin xyz="0 0 0.05" rpy="0 0 0" /> </collision> </link> <link name="shoulder_link"> <visual> <geometry> <cylinder length="0.5" radius="0.1" /> </geometry> <origin xyz="0 0 0.25" rpy="0 0 0" /> <material name="blue" /> </visual> </link> <joint name="joint1" type="revolute"> <parent link="base_link" /> <child link="shoulder_link" /> <origin xyz="0 0 0.1" rpy="0 0 0" /> <!--繞z旋轉(zhuǎn)--> <axis xyz="0 0 1" /> <!--effort:作用在這個(gè)關(guān)節(jié)上的力,單位N,大于這個(gè)力運(yùn)動(dòng)就會(huì)被阻斷, velocity:轉(zhuǎn)速,秒/弧度, lower/upper:最小/大轉(zhuǎn)角--> <limit effort="1000.0" velocity="1.0" lower="-3.14" upper="3.14" /> </joint> </robot>
跑起之后在RobotModel里面把Visual Enable的勾去掉,把Collision的勾打上,然后你就會(huì)發(fā)現(xiàn)基座的碰撞體就顯示出來(lái)了
碰撞體的幾何結(jié)構(gòu)盡量要比Visual的簡(jiǎn)單,大概歸納成一個(gè)box或者其他簡(jiǎn)單幾何體就好
10. 加入U(xiǎn)R12e機(jī)械臂
之前提到的ur12e.urdf是找機(jī)械臂那邊的人拿到的,但是我們不是每個(gè)人都可以買(mǎi)得起那么十幾萬(wàn)的設(shè)備,所以我們可以到這里弄一個(gè)出來(lái):
ur_description:https://github.com/UniversalRobots/Universal_Robots_ROS2_Description/tree/rolling/urdf
一個(gè)有背景墻的啟動(dòng)項(xiàng)目github地址:https://github.com/UniversalRobots/Universal_Robots_ROS2_Tutorials/tree/main
官方文檔:https://docs.universal-robots.com/Universal_Robots_ROS2_Documentation/doc/ur_tutorials/tutorial_index.html
由于我實(shí)在沒(méi)有耐心自己弄一個(gè)6軸機(jī)械臂,而且后面也需要引入官方的URDF,那倒不如早點(diǎn)引入好了
# 反正就是在項(xiàng)目下面新建ur_tutorials文件夾,在ur_tutorials里面再新建src文件夾 mkdir -p ~/Project/ur_tutorials/src # 定位到~/Project/ur_tutorials,克隆倉(cāng)庫(kù) git clone https://github.com/UniversalRobots/Universal_Robots_ROS2_Tutorials.git src/ur_tutorials # 這個(gè)可以不運(yùn)行也沒(méi)所謂 rosdep update && rosdep install --ignore-src --from-paths src -y # 然后是build、source、launch三步曲 colcon build source install/setup.bash ros2 launch my_robot_cell_control start_robot.launch.py use_mock_hardware:=true
恭喜你,執(zhí)行完上面的內(nèi)容就表示已經(jīng)跑起這個(gè)demo了,demo里面的具體內(nèi)容詳細(xì)可以看官方文檔,其實(shí)有了上面的基礎(chǔ),應(yīng)該直接看代碼也能明白~
然后就是要把官方的東西搬到自己的項(xiàng)目里面了~
# 把~/Project/ur_tutorials/src/ur_tutorials/my_robot_cell/my_robot_cell_description文件夾復(fù)制到~/Project/ros2_ws/src下,跟我們那個(gè)my_robot_description同一個(gè)層級(jí) # 然后經(jīng)典三部曲,ur_type設(shè)置成ur12e cd ~/Project/ros2_ws colcon build source install/setup.bash ros2 launch my_robot_cell_description view_robot.launch.py ur_type:="ur12e"
可以看到引用了ur_description這個(gè)包,所有ros的包可以在【/opt/ros/jazzy/share】這里找到,而ur12e的配置放在/opt/ros/jazzy/share/ur_description/config/ur12e里面
而這個(gè)包在第6步,通過(guò)【sudo apt install ros-jazzy-ur-description】安裝了
因?yàn)檫@個(gè)是包含了所有版本機(jī)械臂的,通過(guò)ur_type來(lái)控制,我們?nèi)绻雽?dǎo)出指定機(jī)械臂型號(hào)的xacro文件可以這樣:
xacro /home/gssl/Project/ur_tutorials/src/ur_tutorials/my_robot_cell/my_robot_cell_description/urdf/my_robot_cell.urdf.xacro -o /home/gssl/Project/ros2_ws/src/my_ur12e_robot.xacro ur_type:=ur12e
然后在2025-9-25的這個(gè)moveit版本有問(wèn)題,ros-jazzy-rviz-common模塊需要退一下版本,要不moveit助手導(dǎo)入ur模型的時(shí)候會(huì)閃退,bug描述在這里:
https://github.com/moveit/moveit2/issues/3546#issuecomment-3252683608
wget http://snapshots.ros.org/jazzy/2025-05-23/ubuntu/pool/main/r/ros-jazzy-rviz-common/ros-jazzy-rviz-common_14.1.11-1noble.20250520.201719_amd64.deb sudo chmod 777 ros-jazzy-rviz-common_14.1.11-1noble.20250520.201719_amd64.deb sudo dpkg -i ros-jazzy-rviz-common_14.1.11-1noble.20250520.201719_amd64.deb
后面的步驟我們就用 UR_Tutorials 這個(gè)庫(kù)里面的 my_robot_cell_description 包來(lái)跑了,之前自己手搓的玩具可以放一放了~
11. Run the moveit setup Assistant(Moveit的配置助手)
把my_robot_cell_description,復(fù)制去那個(gè)手搓玩具的平級(jí),終端跑:
ros2 launch moveit_setup_assistant setup_assistant.launch.py
* 【create new moveit configuration package】>>【Browse】>>【~/Project/ros2_ws/src/my_robot_cell_description/urdf/my_robot_cell.urdf.xacro】
>> optional xacro arguments填入:ur_type:=ur12e >> 右下角【load files】(因?yàn)槲覀冇玫氖莡r12e的機(jī)械臂,所以要配置一下生成的參數(shù))
* 左側(cè)【Self-Collision】tab >> 【Generate Collision Matrix】
* 左側(cè)【Virtual Joints】tab >> 【Add Virtual Joints】>> parent填world,child填base_link,type填fixed(把base固定到world)
* 左側(cè)【Planning Groups】>> 【Add Group】>> 填入Group Name,Kinematic Solver 選擇 KDL >> 【Add Joints】>> 選擇所有ur12e
* 左側(cè) 【Robot Poses】:添加機(jī)械臂姿態(tài)的,可以為一些固定點(diǎn)位擺好pose
* 左側(cè)【End Effectors】:添加末端工具
* 左側(cè)【Passive Joints】:設(shè)置Joints為被動(dòng)模式
* 左側(cè)【ros2_control URDF Model】:Commonet Interfaces 控制接口、State Interfaces 狀態(tài)接口,選好之后點(diǎn)擊【Add Interfaces】把這些加入到udrf的關(guān)節(jié)描述里面
* 左側(cè)【ROS 2 Controllers】:點(diǎn)擊【Auto...Group】自動(dòng)加載,這里是控制硬件的
* 左側(cè)【Moveit Controllers】:點(diǎn)擊【Auto...Group】自動(dòng)加載,這里是控制Moveit的
* 左側(cè)【Perception】:感知模塊,可以加深度圖或點(diǎn)云
* 左側(cè)【Launch Files】:自動(dòng)生成啟動(dòng)文件
* 左側(cè)【Author information】:作者信息
* 左側(cè)【Configuration Files】:生成配置文件,設(shè)置好保存路徑,我們保存到src下面就好,點(diǎn)擊【Generate Package】
這樣我們就會(huì)在指定的目錄下有一個(gè)moveit的配置文件夾了,再次打開(kāi)配置助手,我們可以在編輯那里選擇這個(gè)文件夾并編輯
12. Moveit Config Files Overview
config文件:
initial_positions.yaml:記錄了在fake system的關(guān)節(jié)初始位置
joint_limits.yaml:記錄了關(guān)節(jié)限制,default_velocity_scaling_factor=0.1 表示相當(dāng)于10%的速度這個(gè)速度是弧度/時(shí)間,default_acceleration_scaling_factor表示加速度,max_velocity要設(shè)置成浮點(diǎn)
kinematics.yaml:運(yùn)動(dòng)學(xué)求解器,配置這個(gè)求解器的參數(shù)。我們用到KDL插件,那就是配置這個(gè)參數(shù),一般不用配置~
moveit_controllers.yaml:Moveit Controller控制器的管理工具
moveit.rviz:顯示demo的rviz配置
my_robot_cell.ros2_control.xacro:加入了ROS2控制的URDF文件,對(duì)應(yīng)配置助手的【ros2_control URDF Model】,提供了硬件的控制和反饋接口
* my_robot_cell.srdf:里面定義了相當(dāng)于【Self-Collision】、【Virtual Joints】、【Planning Groups】、【Robot Poses】的內(nèi)容
my_robot_cell.urdf.xacro:演示demo真正引用的urdf文件
pilz_cartesian_limits.yaml:這個(gè)不用改
ros2_controllers.yaml:這個(gè)是ros2_controllers的配置文件, 有個(gè) update_rate 的字段,表示機(jī)械臂的刷新率是100次/秒,ur機(jī)械臂可以做到500
launch文件:就是各種不同的啟動(dòng)項(xiàng)目
四. 控制機(jī)械臂
13. 一圖說(shuō)明moveit、ros_controller、機(jī)械臂/simulator之間的關(guān)系

14. 在rviz上控制ur12e
到了這步,我們需要安裝UR機(jī)械臂的驅(qū)動(dòng)
ur_driver: https://github.com/UniversalRobots/Universal_Robots_ROS2_Driver/tree/jazzy
doc: https://docs.universal-robots.com/Universal_Robots_ROS2_Documentation/doc/ur_robot_driver/ur_robot_driver/doc/usage/toc.html
# 把驅(qū)動(dòng)的git clone下來(lái),build & source # 用無(wú)頭無(wú)rviz的方式開(kāi)啟驅(qū)動(dòng) ros2 launch ur_robot_driver ur_control.launch.py ur_type:=ur12e robot_ip:=192.168.77.58 headless_mode:=true launch_rviz:=false # 再開(kāi)一個(gè)終端跑驅(qū)動(dòng)里面的moveit config ros2 launch ur_moveit_config ur_moveit.launch.py ur_type:=ur12e
這個(gè)時(shí)候你就可以用這個(gè)ur_moveit config里面的rviz控制真實(shí)的機(jī)械臂了
PS:
1)在這之前要先在UR機(jī)械臂上開(kāi)啟遠(yuǎn)程控制,可以咨詢(xún)UR Arm的技術(shù)支持,或者參考這篇文章:https://zhuanlan.zhihu.com/p/683370314
2)如果自己用moveit的配置助手手搓的moveit配置是控制不了的,這個(gè)時(shí)候簡(jiǎn)單來(lái)說(shuō)就把官方的moveit配置config文件夾里面moveit_controller
15. python控制機(jī)械臂運(yùn)動(dòng)
rclpy github:https://github.com/ros2/rclpy/tree/jazzy
根據(jù)上述文檔從源碼安裝rclpy
然后安裝moveit_py,文檔在這里:https://moveit.picknik.ai/main/doc/api/python_api/api.html
sudo apt install ros-jazzy-moveit-py
PS:
1)clone下來(lái)之后記得切去jazzy分支~
2)如果用pycharm開(kāi)發(fā)的話,先把rclpy的source install/setup.bash放到~/.bashrc里面,然后:
# 找到snap的啟動(dòng)文件 sudo find /var/lib/snapd/desktop/applications/ -name "*pycharm*" # 修改啟動(dòng)文件 sudo vim xxxx/pycharm-community_pycharm-community.desktop # 找到Exec這行,里面有一個(gè)環(huán)境變量,我順手也寫(xiě)到~/.bashrc里面了,然后改成這樣: Exec=bash -i -c "/snap/bin/pycharm-community %f" # 這樣做的話重啟之后又變回去了,因此需要改這里 sudo vim ~/.local/share/applications/pycharm-community_pycharm-community.desktop sudo chmod 777 ~/.local/share/applications/pycharm-community_pycharm-community.desktop

浙公網(wǎng)安備 33010602011771號(hào)