Ubuntu24.04下ROS2和MoveIt2控制六轴机械臂
一.安装Ubuntu24.04
二.安装ROS2(来源于ROS2官网)
1.Set locale
bash
locale # check for UTF-8
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
locale # verify settings
2.Enable required repositories
bash
sudo apt install software-properties-common
sudo add-apt-repository universe
bash
sudo apt update && sudo apt install curl -y
export ROS_APT_SOURCE_VERSION=$(curl -s https://api.github.com/repos/ros-infrastructure/ros-apt-source/releases/latest | grep -F "tag_name" | awk -F\" '{print $4}')
curl -L -o /tmp/ros2-apt-source.deb "https://github.com/ros-infrastructure/ros-apt-source/releases/download/${ROS_APT_SOURCE_VERSION}/ros2-apt-source_${ROS_APT_SOURCE_VERSION}.$(. /etc/os-release && echo ${UBUNTU_CODENAME:-${VERSION_CODENAME}})_all.deb"
sudo dpkg -i /tmp/ros2-apt-source.deb
3.Install development tools (optional)
bash
sudo apt update && sudo apt install ros-dev-tools
bash
sudo apt update
sudo apt upgrade
sudo apt install ros-jazzy-desktop
4.Setup environment
bash
source /opt/ros/jazzy/setup.bash
echo " source /opt/ros/jazzy/setup.bash" >> ~/.bashrc
bash
echo " source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash" >> ~/.bashrc
5.install MoveIt2
bash
sudo apt install ros-$ROS_DISTRO-rmw-cyclonedds-cpp
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
echo " export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp" >> ~/.bashrc
bash
sudo apt install ros-jazzy-moveit
6.install vscode
bash
sudo snap install code --classic
vscode需要下载的插件: 

7.install terminator
bash
sudo apt install terminator
三.制作URDF
1.创建工作空间:
bash
mkdir ros2_ws
cd ros2_ws/
mkdir src
colcon build
cd install/
source setup.bash
echo " source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
2.创建功能包:
bash
wzy@wzy-VMware-Virtual-Platform:~$ cd ros2_ws/
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws$ cd src
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src$ ros2 pkg create my_robot_description #
完成后终端如下所示:

bash
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src$ cd my_robot_description/
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description$ ls
CMakeLists.txt include package.xml src
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description$ rm -r include/ src/
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description$ ls
CMakeLists.txt package.xml
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description$ mkdir urdf launch rviz
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description$ ls
CMakeLists.txt launch package.xml rviz urdf
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description$ cd ..
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src$ code .
将如下部分删除:

修改后的CMakeLists.txt
cmake
cmake_minimum_required(VERSION 3.8)
project(my_robot_description)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
add_compile_options(-Wall -Wextra -Wpedantic)
endif()
# find dependencies
find_package(ament_cmake REQUIRED)
#-----增加的内容------
install(
DIRECTORY launch rviz urdf
DESTINATION share/${PROJECT_NAME}
)
#-------------------
ament_package()
修改后重新编译:
bash
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws$ colcon build --packages-select my_robot_description
执行如下指令:
bash
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws$ cd src/
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src$ ls
my_robot_description
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src$ cd my_robot_description/
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description$ ls
CMakeLists.txt launch package.xml rviz urdf
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description$ cd urdf/
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description/urdf$ ls
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description/urdf$ touch arm.urdf
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description/urdf$ ls
arm.urdf
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description/urdf$ cd ~/ros2_ws/src/
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src$ code .
3.制作arm.urdf文件代码:
xml
<?xml version="1.0"?>
<robot name="my_robot">
<material name="grey">
<color rgba="0.5 0.5 0.5 1" />
</material>
<link name="base_link">
<visual>
<geometry>
<box size="0.4 0.4 0.1" />
</geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<material name="grey" />
</visual>
</link>
</robot>
返回命令行执行:
bash
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src$ sudo apt install ros-jazzy-urdf-tutorial
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src$ cd my_robot_description/
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description$ cd urdf/
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description/urdf$ source ~/.bashrc
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description/urdf$ ros2 launch urdf_tutorial display.launch.py model:=/home/wzy/ros2_ws/src/my_robot_description/urdf/arm.urdf
界面显示:

4.更新arm.urdf文件代码:
xml
<?xml version="1.0"?>
<robot name="my_robot">
<material name="grey">
<color rgba="0.5 0.5 0.5 1" />
</material>
<material name="blue">
<color rgba="0 0 0.5 1" />
</material>
<link name="base_link">
<visual>
<geometry>
<box size="0.4 0.4 0.1" />
</geometry>
<origin xyz="0 0 0.05" rpy="0 0 0" />
<material name="grey" />
</visual>
</link>
<link name="shoulder_link">
<visual>
<geometry>
<cylinder length="0.5" radius="0.1" />
</geometry>
<origin xyz="0 0 0" 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" rpy="0 0 0" />
<axis xyz="1 0 0" />
<limit effort="1000.0" velocity="1.0" lower="-3.14" upper="3.14" />
</joint>
</robot>
然后在终端执行:
bash
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description/urdf$ ros2 launch urdf_tutorial display.launch.py model:=/home/wzy/ros2_ws/src/my_robot_description/urdf/arm.urdf

5.完整版URDF
xml
<?xml version="1.0"?>
<robot name="my_robot">
<material name="grey">
<color rgba="0.5 0.5 0.5 1" />
</material>
<material name="blue">
<color rgba="0 0 0.5 1" />
</material>
<link name="base_link">
<visual>
<geometry>
<box size="0.4 0.4 0.1" />
</geometry>
<origin xyz="0 0 0.05" rpy="0 0 0" />
<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>
<link name="arm_link">
<visual>
<geometry>
<cylinder length="0.6" radius="0.05" />
</geometry>
<origin xyz="0 0 0.3" rpy="0 0 0" />
<material name="grey" />
</visual>
</link>
<link name="elbow_link">
<visual>
<geometry>
<cylinder length="0.1" radius="0.05" />
</geometry>
<origin xyz="0 0 0.05" rpy="0 0 0" />
<material name="blue" />
</visual>
</link>
<link name="forearm_link">
<visual>
<geometry>
<cylinder length="0.5" radius="0.05" />
</geometry>
<origin xyz="0 0 0.25" rpy="0 0 0" />
<material name="grey" />
</visual>
</link>
<link name="wrist_link">
<visual>
<geometry>
<box size="0.1 0.1 0.05" />
</geometry>
<origin xyz="0 0 0.025" rpy="0 0 0" />
<material name="blue" />
</visual>
</link>
<link name="hand_link">
<visual>
<geometry>
<box size="0.1 0.1 0.02" />
</geometry>
<origin xyz="0 0 0.01" rpy="0 0 0" />
<material name="grey" />
</visual>
</link>
<link name="tool_link" />
<joint name="joint1" type="revolute">
<parent link="base_link" />
<child link="shoulder_link" />
<origin xyz="0 0 0.1" rpy="0 0 0" />
<axis xyz="0 0 1" />
<limit effort="1000.0" velocity="1.0" lower="-3.14" upper="3.14" />
</joint>
<joint name="joint2" type="revolute">
<parent link="shoulder_link" />
<child link="arm_link" />
<origin xyz="0 0 0.5" rpy="0 0 0" />
<axis xyz="0 1 0" />
<limit effort="1000.0" velocity="1.0" lower="0" upper="2.5" />
</joint>
<joint name="joint3" type="revolute">
<parent link="arm_link" />
<child link="elbow_link" />
<origin xyz="0 0 0.6" rpy="0 0 0" />
<axis xyz="0 1 0" />
<limit effort="1000.0" velocity="1.0" lower="0" upper="2.5" />
</joint>
<joint name="joint4" type="revolute">
<parent link="elbow_link" />
<child link="forearm_link" />
<origin xyz="0 0 0.1" rpy="0 0 0" />
<axis xyz="0 1 0" />
<limit effort="1000.0" velocity="1.0" lower="-3.14" upper="3.14" />
</joint>
<joint name="joint5" type="revolute">
<parent link="forearm_link" />
<child link="wrist_link" />
<origin xyz="0 0 0.5" rpy="0 0 0" />
<axis xyz="0 1 0" />
<limit effort="1000.0" velocity="1.0" lower="-1.57" upper="1.57" />
</joint>
<joint name="joint6" type="continuous">
<parent link="wrist_link" />
<child link="hand_link" />
<origin xyz="0 0 0.05" rpy="0 0 0" />
<axis xyz="0 0 1" />
</joint>
<joint name="hand_tool_joint" type="fixed">
<parent link="hand_link" />
<child link="tool_link" />
<origin xyz="0 0 0.02" rpy="0 0 0" />
</joint>
</robot>
然后在终端执行:
bash
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description/urdf$ ros2 launch urdf_tutorial display.launch.py model:=/home/wzy/ros2_ws/src/my_robot_description/urdf/arm.urdf

四.将URDF修改为xacro格式

1.各自文件内容
1.1.arm.xacro
xml
<?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>
<origin xyz="0 0 0.05" rpy="0 0 0" />
<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>
<link name="arm_link">
<visual>
<geometry>
<cylinder length="0.6" radius="0.05" />
</geometry>
<origin xyz="0 0 0.3" rpy="0 0 0" />
<material name="grey" />
</visual>
</link>
<link name="elbow_link">
<visual>
<geometry>
<cylinder length="0.1" radius="0.05" />
</geometry>
<origin xyz="0 0 0.05" rpy="0 0 0" />
<material name="blue" />
</visual>
</link>
<link name="forearm_link">
<visual>
<geometry>
<cylinder length="0.5" radius="0.05" />
</geometry>
<origin xyz="0 0 0.25" rpy="0 0 0" />
<material name="grey" />
</visual>
</link>
<link name="wrist_link">
<visual>
<geometry>
<box size="0.1 0.1 0.05" />
</geometry>
<origin xyz="0 0 0.025" rpy="0 0 0" />
<material name="blue" />
</visual>
</link>
<link name="hand_link">
<visual>
<geometry>
<box size="0.1 0.1 0.02" />
</geometry>
<origin xyz="0 0 0.01" rpy="0 0 0" />
<material name="grey" />
</visual>
</link>
<link name="tool_link" />
<joint name="joint1" type="revolute">
<parent link="base_link" />
<child link="shoulder_link" />
<origin xyz="0 0 0.1" rpy="0 0 0" />
<axis xyz="0 0 1" />
<limit effort="1000.0" velocity="1.0" lower="-3.14" upper="3.14" />
</joint>
<joint name="joint2" type="revolute">
<parent link="shoulder_link" />
<child link="arm_link" />
<origin xyz="0 0 0.5" rpy="0 0 0" />
<axis xyz="0 1 0" />
<limit effort="1000.0" velocity="1.0" lower="0" upper="2.5" />
</joint>
<joint name="joint3" type="revolute">
<parent link="arm_link" />
<child link="elbow_link" />
<origin xyz="0 0 0.6" rpy="0 0 0" />
<axis xyz="0 1 0" />
<limit effort="1000.0" velocity="1.0" lower="0" upper="2.5" />
</joint>
<joint name="joint4" type="revolute">
<parent link="elbow_link" />
<child link="forearm_link" />
<origin xyz="0 0 0.1" rpy="0 0 0" />
<axis xyz="0 1 0" />
<limit effort="1000.0" velocity="1.0" lower="-3.14" upper="3.14" />
</joint>
<joint name="joint5" type="revolute">
<parent link="forearm_link" />
<child link="wrist_link" />
<origin xyz="0 0 0.5" rpy="0 0 0" />
<axis xyz="0 1 0" />
<limit effort="1000.0" velocity="1.0" lower="-1.57" upper="1.57" />
</joint>
<joint name="joint6" type="continuous">
<parent link="wrist_link" />
<child link="hand_link" />
<origin xyz="0 0 0.05" rpy="0 0 0" />
<axis xyz="0 0 1" />
</joint>
<joint name="hand_tool_joint" type="fixed">
<parent link="hand_link" />
<child link="tool_link" />
<origin xyz="0 0 0.02" rpy="0 0 0" />
</joint>
</robot>
1.2 common_properties.xacro
xml
<?xml version="1.0"?>
<robot xmlns:xacro="http://www.ros.org/wiki/xacro">
<material name="grey">
<color rgba="0.5 0.5 0.5 1" />
</material>
<material name="blue">
<color rgba="0 0 0.5 1" />
</material>
</robot>
1.3 my_robot.urdf.xacro
xml
<?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>
2.终端运行命令
bash
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws/src/my_robot_description/urdf$ ros2 launch urdf_tutorial display.launch.py model:=/home/wzy/ros2_ws/src/my_robot_description/urdf/my_robot.urdf.xacro
会出现跟之前一样的rviz机械臂界面,XACRO作为主要描述文件,可以提供了更好的可维护性和重用性,特别是在多个相似关节的情况下。

五.制作launch文件(display.launch.xml)

1.文件内容
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>
<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>
2.终端输入如下命令行
bash
wzy@wzy-VMware-Virtual-Platform:~$ cd ros2_ws/
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws$ ls
build install log src
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws$ colcon build
Starting >>> my_robot_description
Finished <<< my_robot_description [0.40s]
Summary: 1 package finished [0.97s]
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws$ source install/setup.bash
wzy@wzy-VMware-Virtual-Platform:~/ros2_ws$ ros2 launch my_robot_description display.launch.xml
3.弹出rviz界面
3.1 进行配置

首先将Fixed Frame设置为:base_link
然后点击左下角的Add按钮,往下拉选择RobotModel:

继续配置如下部分:

最终效果:
