讨论

ros2 launch同时拉起两台机械臂有啥讲究没?

随遇而安
随遇而安
2026/06/16 10:23

项目上两台UR5e要一起跑,一个做上料一个做搬运,共用一台工控机。现在想用ros2 launch一个文件把两个机械臂的driver节点、move_group、rviz全拉起来,省得开俩终端。

两台臂的命名空间我打算直接用 robot_name="arm1" 和 robot_name="arm2" 传到 launch 里,urdf也分开两份。tf树会不会打架?话题重映射有没有坑?有人这么干过稳定不,还是说得拆成两台机器各跑各的ros2?

109 7

全部回复 (7)

8866
8866#1

tf树肯定要分开啊,两个robot_state_publisher的tf往一个树上发不就乱了,namespace配上robot_description参数重映射一下基本就行。

2026/06/16 18:07
一杯浓茶
一杯浓茶#2

工控机带得动俩UR5e吗?

2026/06/16 20:01
老王
老王#3

我们厂里三台机械臂+AGV都跑在一台工控机上,namespace+各自的urdf,没出过大问题,记得把move_group的端口错开。

2026/06/16 21:19
小任
小任#4

ros2 humble之前那个namespace bug修了没?之前遇过driver节点忽略ns的情况,你用哪个版本?

2026/06/17 16:48
杰姐
杰姐#5

两台臂之间要不要做联动?要做的话只靠launch起两个独立节点不够,action server那层得自己再撸一层协调。

2026/06/18 13:56
daming
daming#6

这事我们干过不少,俩UR协作的场景,ros2 launch一把起没问题,但有几个地方你得卡死,不然tf和话题立马就乱套。

首先命名空间别只用robot_name参数传,最好直接上namespace=arm1,把driver、move_group、controller、rviz全包进去,每个节点都带PushRosNamespace,这样话题前缀自动就分开了,比你自己一个个remap省心一大截,话题打架的概率能降八成。urdf和SRDF里所有link、joint、planning_group的名字也得带arm1_/arm2_前缀,别偷懒用同名只靠namespace区分,moveit2抓规划组的时候是真按名字找的。

tf这边主要盯三处:base_link、tool0、世界坐标系。两台臂底座位置不一样的话,urdf里joint origin要写真实相对工控机原点的偏移,别俩arm都写(0,0,0),不然rviz打开俩模型叠一起看着就头大,世界系那边我们直接固定一个world_frame做根,给arm1和arm2分别发static_transform_publisher,把base_link挂到world下,父子关系别有公共祖先,不然TF tree会报循环。

还有个容易踩的坑:move_group别图省事起俩在同一个launch里共享一个ompl/moveit_core后台,我试过planning的时候会偶尔串请求。规规矩矩分俩namespace各起各的move_group,每臂配独立的kinematics.yaml和ompl_planning.yaml,参数别复用一份文件。controller manager也拆,俩arm各跟自己的controller_manager通信,不然joint_states混在一起IK解算直接抽风。

rviz装一个就够,configuration里多加载两个RobotModel,TF和RobotModel display都勾上多namespace,display type选RobotModel后robot_description那个topic改成对应臂的/arm2/robot_description就行,不用起俩rviz吃两份显存。

稳定不稳定看你工控机配置,UR5e+moveit2单臂就吃不少CPU和内存,俩臂一起上our case用i7-12700+32G跑起来CPU占用峰值大概60-70%,如果控制频率跑500Hz或者带视觉再叠进来,建议直接上两台机器各跑一套ros2,节点间用domain_id分开或者走分布式,中间走ethernetCAT或者网线互联都行,别硬怼一台机器后期调试能把人逼疯。

参数这块建议直接用yaml写好丢进launch,arm1_config.yaml、arm2_config.yaml分开维护,urdf路径、SRDF路径、kinematics、joint_limits、controller yaml全用find_package+substitution替换,传参容易写错还不直观。

成本角度:一台工控机俩臂方案能省一台机器的钱(带显卡的工控机动辄大几千上万),但调试周期会拉长20%-30%,如果项目周期紧、预算够,还是拆俩机器稳。方案成本和工期你张口先算这个是对的,两台UR5e+ros2 launch一把拉起,我们这边过手的项目案子里大概30%会选单机双臂,剩下的都选拆机器,按你给的时间节点和预算自己权衡就行。

2026/06/21 17:24
zhiqiangg93
zhiqiangg93#7

两台UR5e一台工控机跑ros2 launch这事儿我们干过,1台发那科+1台UR10e一起做打磨上下料,整套跑了大半年没出过大幺蛾子。简单说几个点你参考下:

1. 命名空间必须用足,别光靠robot_name参数,launch里直接给两个robot包一层GroupAction,把节点全push到各自ns里。ur_robot_driver那边有个tf_prefix参数比robot_name更管用,tf树真要打架就靠它隔开,arm1设成prefix_a,arm2设成prefix_b,rviz里robot_description对应的tf_prefix也跟上。

2. move_group这玩意儿比较吃资源,两台一起拉规划是没问题,但你看下CPU占用,我们当时i7-12700H跑双move_group+rviz常驻,规划时峰值能到70%,如果上料节拍紧就把它俩拆开部署更稳。

3. 话题重映射基本不用操太多心,ur_driver默认话题都带serial_number或者robot_ip后缀,自己就分开了。唯一要注意joint_states那俩机械臂的joint名字千万别撞,urdf里关节名字前加上arm1_/arm2_前缀最省事。

4. rviz别拉俩,浪费资源,一个里加两个RobotModel分别选不同tf_prefix和description文件就够了。

建议先在仿真里把双arm的tf树跑通,再上真机,不然真机出collision警告排查起来头疼。

2026/06/26 15:39