1 安装步骤
系统是Ubuntu20.04,对应的ROS版本是要安装FoxyFitzroy
1.1 配置语言环境
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
第一条如果有报错,比如:
Get:41 http://mirrors.aliyun.com/ubuntu focal-security/universe amd64 DEP-11 Metadata [160 kB]
Get:42 http://mirrors.aliyun.com/ubuntu focal-security/multiverse amd64 Packages [26.7 kB]
Get:43 http://mirrors.aliyun.com/ubuntu focal-security/multiverse i386 Packages [7,184 B]
Get:44 http://mirrors.aliyun.com/ubuntu focal-security/multiverse amd64 DEP-11 Metadata [940 B]
Reading package lists... Done
E: The repository 'https://download.docker.com/linux/ubuntu focal Release' no longer has a Release file.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
可以再执行一遍,最后是这样的打印
Preparing to unpack .../locales_2.31-0ubuntu9.18_all.deb ...
Unpacking locales (2.31-0ubuntu9.18) over (2.31-0ubuntu9.16) ...
Setting up locales (2.31-0ubuntu9.18) ...
Generating locales (this might take a while)...
en_AG.UTF-8... done
en_AU.UTF-8... done
en_BW.UTF-8... done
en_CA.UTF-8... done
en_DK.UTF-8... done
en_GB.UTF-8... done
en_HK.UTF-8... done
en_IE.UTF-8... done
en_IL.UTF-8... done
en_IN.UTF-8... done
en_NG.UTF-8... done
en_NZ.UTF-8... done
en_PH.UTF-8... done
en_SG.UTF-8... done
en_US.UTF-8... done
en_ZA.UTF-8... done
en_ZM.UTF-8... done
en_ZW.UTF-8... done
zh_CN.UTF-8... done
zh_SG.UTF-8... done
Generation complete.
Processing triggers for man-db (2.9.1-1) ...
1.2 开启 universe 仓库,安装 curl
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl gnupg
1.3 添加 ROS2 软件源密钥
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
如果国内下载慢,把上面
http://packages.ros.org/ros2/ubuntu替换成清华源:http://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu
不换也能下载
1.4 更新源,安装桌面完整版(带 rclcpp、rviz2、demo 示例)
sudo apt update
sudo apt upgrade
# 桌面完整版
sudo apt install ros-foxy-desktop python3-argcomplete
最小版本(无可视化工具):
sudo apt install ros-foxy-ros-base
我安装的桌面完整版
1.5 自动加载环境变量
echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc
source ~/.bashrc
1.6 测试ROS2的自带例程
printenv ROS_DISTRO
输出 foxy 就成功。
测试自带 cpp 示例节点:
终端 A:
ros2 run demo_nodes_cpp talker
终端 B 新开一个:
ros2 run demo_nodes_py listener
看到收发消息,代表 rclcpp 底层全部正常。
也可以运行小乌龟例程.
首先启动小乌龟图形窗口,新开终端:
ros2 run turtlesim turtlesim_node
会弹出蓝色小乌龟窗口,然后再开一个终端,输入如下,用于键盘上下左右键控制小乌龟移动
ros2 run turtlesim turtle_teleop_key
再开一个终端,输入如下,可以查看所有通信话题
ros2 topic list
可以看到:
/turtle1/cmd_vel
-
- (速度指令)
/turtle1/pose
- (乌龟坐标)
1.7 安装编译工具 colcon
colcon 是 ROS2 的编译构建工具,用来编译 C++ 节点代码
sudo apt install python3-colcon-common-extensions
2 C++程序测试
2.1 创建工作空间(存放 rclcpp 代码)
ROS2 约定:所有代码放在 ~/dev_ws/src 下面。
mkdir -p ~/dev_ws/src
cd ~/dev_ws
~/dev_ws/src 是 ROS 2开发中工作空间的源代码目录。 在 ROS 2 的标准开发流程中,dev_ws 通常作为工作空间的根目录,而 src 是其下必须手动创建的子目录,专门用于存放所有功能包(Package)的源代码。放置在此目录下,以便构建工具 colcon 能够识别并编译 。
核心作用与结构:
代码存放区:所有 ROS 2 功能包的源码(包括 CMakeLists.txt、package.xml 及源代码文件)均需置于 src 内 。
构建入口:执行编译命令时,colcon 会递归扫描 src 目录下的所有包进行构建 。
标准规范:严格遵守将代码放在 src 目录的约定,避免因路径不规范导致编译失败
2.2 创建 C++ 功能包
下面来写第一个 rclcpp 节点
2.2.1 创建包
进入 src 目录创建包:
cd ~/dev_ws/src
ros2 pkg create --build-type ament_cmake my_first_rclcpp --dependencies rclcpp std_msgs
--build-type ament_cmake
-
- :C++ 包类型(rclcpp 必用)
--dependencies rclcpp std_msgs
- :声明依赖 rclcpp 库 和标准消息库
现在生成目录结构:
src/my_first_rclcpp/
├── CMakeLists.txt
├── package.xml
└── src/
2.2.2 编写自己的代码
进入 src/my_first_rclcpp/src/,新建文件 hello_node.cpp
#include <rclcpp/rclcpp.hpp>
#include <std_msgs/msg/string.hpp>
// 自定义节点类,继承rclcpp::Node
class HelloNode : public rclcpp::Node
{
public:
HelloNode() : Node("hello_cpp_node")
{
RCLCPP_INFO(this->get_logger(), "rclcpp节点启动成功!");
}
};
int main(int argc, char * argv[])
{
// 初始化rclcpp库
rclcpp::init(argc, argv);
// 创建节点对象
auto node = std::make_shared<HelloNode>();
// 自旋,处理回调,等待消息
rclcpp::spin(node);
// 关闭rclcpp
rclcpp::shutdown();
return 0;
}
2.2.3 修改 CMakeLists.txt
打开 my_first_rclcpp/CMakeLists.txt,在 ament_target_dependencies 那一块添加可执行文件编译规则:
# 编译src/hello_node.cpp 生成可执行文件 hello_node
add_executable(hello_node src/hello_node.cpp)
# 绑定依赖 rclcpp std_msgs
ament_target_dependencies(hello_node rclcpp std_msgs)
# 安装编译出来的程序,否则ros2 run找不到
install(TARGETS
hello_node
DESTINATION lib/${PROJECT_NAME}
)
2.2.4 确认package.xml
确认依赖已经存在,这行要有:
<depend>rclcpp</depend>
<depend>std_msgs</depend>
2.3 编译代码
回到工作空间根目录 ~/dev_ws
cd ~/dev_ws
colcon build
编译完成后会生成:build install log 三个文件夹。
如果邮箱格式不对,会报错:
改正格式后
注:每一次新开终端,还要 source 自己工作空间的 install
source ~/dev_ws/install/setup.bash
2.4 运行这个 rclcpp 节点
ros2 run my_first_rclcpp hello_node
输出:[INFO] [xxx]: rclcpp节点启动成功!,第一个 rclcpp 节点跑通。
3 总结
本篇先介绍了在Ubuntu20.04上安装FoxyFitzroy的过程,然后介绍了ROS2的C++代码编写与运行示例。
119