引言
在当今快速发展的科技时代,机器人技术正以前所未有的速度改变着我们的生活。从工业生产线上的自动化装配,到家庭中的智能助手,再到医疗领域的精密手术,机器人无处不在。然而,随着机器人应用范围的不断扩展,如何高效地开发和部署复杂的机器人系统成为了亟待解决的问题。正是在这种背景下,Robot Operating System(ROS,机器人操作系统)应运而生。
什么是ROS?
ROS并不是一个传统的操作系统,而是一套专为机器人设计的软件框架。它提供了一系列工具、库和规范,使得开发者能够更轻松地构建机器人软件。ROS支持多种编程语言,如C++和Python,并且具有跨平台的特点,可以在多种操作系统上运行,包括Linux、macOS和Windows。ROS的核心理念是“分布式计算”,它通过一组标准的API和通信协议来协调不同组件(称为“节点”)之间的交互,从而使机器人系统能够像一个智能城市那样高效运作。ROS最初由斯坦福大学的Willow Garage实验室在2007年开始研发,并于2010年正式发布。自那时起,ROS经历了多个版本的迭代,其中包括ROS 1(也称为ROS Classic)和ROS 2(也称为ROS Next Generation)。ROS 1主要面向学术界和研究机构,而ROS 2则是为了满足工业界的需求,对ROS 1进行了重大的改进,包括增强了安全性、可靠性和实时性。
目前,ROS已经成为全球范围内机器人研究和开发的标准工具之一,广泛应用于教育、科研、工业等多个领域。无论是初学者还是资深开发者,都能在ROS中找到适合自己需求的工具和资源。
为什么选择ROS?
ROS之所以成为机器人开发者的首选,有以下几个原因:
- 统一的开发平台:ROS为机器人软件开发提供了一个统一的平台,支持多种硬件和传感器,极大地简化了开发流程。
- 丰富的功能库:ROS拥有庞大的功能库,包括视觉处理、运动控制、导航等,几乎覆盖了机器人开发的各个方面。
- 强大的社区支持:ROS有一个活跃的全球开发者社区,他们不断地贡献代码、文档和支持,形成了一个良性循环,推动着ROS的不断发展和完善。
- 灵活性和扩展性:ROS的设计灵活且模块化,开发者可以根据需要自由组合各种组件,轻松构建复杂的机器人系统。
- 开源性:ROS是完全开源的,这意味着任何人都可以免费使用它,并且可以查看和修改源代码,促进了技术的共享和进步。
安装ROS Kinetic (适用于 Ubuntu 16.04)
设置sources.list并替换为国内源
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
设置key
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
更新package
sudo apt-get update
安装ROS kinetic完整版
sudo apt-get install ros-kinetic-desktop-full
初始化rosdep
sudo rosdep init
配置ROS环境
echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
安装依赖项
sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential
验证ROS安装是否成功
roscore
启动小乌龟
在不同的终端里面执行以下三条指令
rosrun turtlesim turtlesim_node #启动小乌龟节点
rosrun turtlesim turtle_teleop_key #启动键盘控制
rosrun rqt_graph rqt_graph #打开tf树
其他常用ROS指令
rostopic list #列出当前活动的话题
rostopic echo /topic_name #打印话题信息
rosnode list #列出当前活跃的节点
安装ROS Melodic (适用于 Ubuntu 18.04)
添加ROS Melodic的APT源,默认是国外的源,但是国内的源比较稳定快速,尤其以离自己近的源为首选,比如人在合肥,可以选择中科大源。
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
添加ROS的GPG Key
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654
更新软件包
sudo apt update
安装ROS Melodic桌面版
sudo apt-get install ros-melodic-desktop-full
初始化rosdep
sudo rosdep init
执行rosdep update更新
rosdep update
设置环境变量
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
自己构建ROS工作空间有效
sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential
测试ROS是否安装成功
roscore
启动小乌龟
在不同的终端里面执行以下三条指令
```bash
rosrun turtlesim turtlesim_node #启动小乌龟节点
rosrun turtlesim turtle_teleop_key #启动键盘控制
rosrun rqt_graph rqt_graph #打开tf树
安装ROS Noetic (适用于 Ubuntu 20.04)
添加ROS Noetic的APT源
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ $DISTRIB_CODENAME main" > /etc/apt/sources.list.d/ros-latest.list'
添加ROS的GPG Key
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
更新软件包
sudo apt update
之后可以配置及更换最佳软件源,这样我们安装的速度和效率都会提高。
安装ROS Noetic桌面版
sudo apt install ros-noetic-desktop-full
初始化rosdep
sudo rosdep init
安装过程中可能遇到的问题及解决办法请参考官方安装文档以及网上其他资料解决。
设置环境变量
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
自己构建ROS工作空间有效
sudo apt install python3-rosinstall python3-rosinstall-generator python3-wstool
安装ROS Humble(适用于 Ubuntu 22.04或更高版本)
在设置源之前我们需设置下语言环境
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
添加ROS Foxy的APT源
sudo apt install software-properties-common
sudo add-apt-repository universe
添加ROS2的GPG Key
sudo apt update && sudo apt install curl -y
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
更新软件包等
sudo apt update
sudo apt upgrade
安装ROS Humble桌面版
sudo apt install ros-humble-desktop
设置环境变量
source /opt/ros/humble/setup.bash
示例测试
新建终端
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_cpp talker
再新建终端
```bash
source /opt/ros/humble/setup.bash
ros2 run demo_nodes_py listener
进阶指南
安装额外的ROS工具和依赖
上述版本的ROS桌面版通常包含以下组件:
- ROS Core:ROS的核心组件,包括通信中间件、节点管理器(master)等。
- roscpp 和 rospy:ROS的客户端库,用于编写C++和Python节点。
- rospy_tutorials 和 roscpp_tutorials:ROS的教程包,包含一些示例程序。
- rviz:用于可视化ROS数据的强大工具。
- rqt:ROS Qt图形工具集,提供了许多可视化的插件。 rosbag:用于记录和回放ROS消息
- rosconsole:用于日志输出。
- roslaunch:用于启动ROS节点。 rostopic 和 rosservice:用于检查话题上的消息和调用服务的工具。
- rosmsg和 rospack:用于管理消息定义和包的工具。
以下是在使用ros过程中常见的工具,这里以noetic版本为例,提供安装指令: - 安装Gazebo
sudo apt-get install ros-noetic-gazebo-ros #以noetic版本为例
sudo apt-get install gazebo11 # 根据你的系统版本选择适当的Gazebo版本
- 安装OpenCV
sudo apt-get install libopencv-dev
sudo apt-get install ros-noetic-opencv3
- 安装PCL
sudo apt-get install ros-noetic-pcl-conversions
sudo apt-get install ros-noetic-pcl-ros
sudo apt-get install ros-noetic-pcl-applications
- 安装TensorFlow
sudo apt-get install tensorflow
sudo apt-get install ros-noetic-tensorflow-ros
构建ROS包
以下以ros1为基础展开:
创建ROS包的基本步骤
- 初始化工作空间
在你的主目录或其他位置创建一个新的目录作为工作空间,在该目录中创建一个src子目录,用于存放ROS包的源代码。
mkdir -p ~/my_ros_workspace/src
cd ~/my_ros_workspace
- 创建ROS包
使用catkin_create_pkg命令来创建一个新的ROS包。这个命令会自动创建一个包含基本文件结构的新包。
cd src
catkin_create_pkg my_first_package rospy std_msgs
上述命令创建了一个名为my_first_package的ROS包,并指定了依赖项rospy和std_msgs。
- 编辑package.xml
打开新创建的包中的package.xml文件,确保填写了正确的信息,尤其是依赖项等。
<?xml version="1.0"?>
<package>
<name>my_first_package</name>
<version>0.0.0</version>
<description>The my_first_package package</description>
<maintainer email="your.email@example.com">Your Name</maintainer>
<license>BSD</license>
<buildtool_depend>catkin</buildtool_depend>
<depend>rospy</depend>
<depend>std_msgs</depend>
<export>
<build_type>catkin</build_type>
</export>
</package>
- 编辑CMakeLists.txt
打开包中的CMakeLists.txt文件,确保包含了正确的编译指令和目标。
cmake_minimum_required(VERSION 2.8.3)
project(my_first_package)
find_package(catkin REQUIRED COMPONENTS
rospy
std_msgs
)
catkin_package(
CATKIN_DEPENDS rospy std_msgs
)
include_directories(include ${catkin_INCLUDE_DIRS})
# 添加可执行文件的编译指令
add_executable(my_node src/my_node.cpp)
target_link_libraries(my_node ${catkin_LIBRARIES})
- 编写ROS节点
创建节点文件:在包的src目录中创建一个C++或Python文件,用于编写ROS节点。
touch src/my_node.cpp
- 编写节点代码
这里是一个简单的C++节点示例,它发布消息到一个话题,并订阅该话题。
#include <ros/ros.h>
#include <std_msgs/String.h>
void chatterCallback(const std_msgs::String::ConstPtr& msg) {
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv) {
ros::init(argc, argv, "my_node");
ros::NodeHandle n;
// 发布消息到一个话题
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok()) {
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
// 订阅话题
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
ros::spin();
return 0;
}
对于Python节点,也可以使用类似的结构:
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def talker():
pub = rospy.Publisher('chatter', String, queue_size=10)
rospy.init_node('my_node', anonymous=True)
rate = rospy.Rate(10) # 10 Hz
count = 0
while not rospy.is_shutdown():
hello_str = "hello world %s" % count
rospy.loginfo(hello_str)
pub.publish(hello_str)
rate.sleep()
count += 1
if __name__ == '__main__':
try:
talker()
except rospy.ROSInterruptException:
pass
- 构建和测试ROS包
返回到工作空间的根目录,并使用catkin_make命令来构建ROS包。
cd ~/my_ros_workspace
catkin_make
- 设置环境变量
确保工作空间的环境变量被正确设置。
source devel/setup.bash
- 运行节点
启动发布者节点:
rosrun my_first_package my_node
启动订阅者节点:
rosrun my_first_package subscriber_node
- 验证功能
观察日志输出,确保节点按预期工作,使用rostopic工具来查看话题上的消息:
rostopic echo /chatter
示例项目
为了更好地理解如何构建和测试ROS包,这里是一个完整的示例项目,实现了基本的计算:
- 初始化工作空间
首先,我们创建一个新的ROS工作空间,并初始化它。
mkdir -p ~/my_ros_calculator_ws/src
cd ~/my_ros_calculator_ws
catkin_make
- 创建ROS包
接下来,我们创建一个ROS包来存放我们的计算器服务:
cd src
catkin_create_pkg calculator_service rospy std_srvs
- 定义服务消息
我们需要定义一个服务消息,它应该包含两个浮点数作为输入,并返回一个浮点数作为结果。打开calculator_service/srv目录,如果没有,请创建它。然后在这个目录下创建一个名为Calculator.srv的服务定义文件,这定义了一个服务,其中a和b是两个输入参数,sum是计算的结果。
float64 a
float64 b
---
float64 sum
- 编写服务服务器
创建一个服务服务器节点,该节点监听请求并返回结果。在calculator_service/src目录下创建一个名为calculator_server.py的Python文件:
#!/usr/bin/env python
import rospy
from calculator_service.srv import Calculator, CalculatorResponse
def calculate(req):
result = req.a + req.b # 这里只是一个示例,实际可以实现其他运算
print("Returning %s + %s = %s" % (req.a, req.b, result))
return CalculatorResponse(result)
def calculator_server():
rospy.init_node('calculator_server')
s = rospy.Service('calculate', Calculator, calculate)
print("Ready to calculate.")
rospy.spin()
if __name__ == "__main__":
calculator_server()
- 编写服务客户端
创建一个服务客户端节点,该节点发送请求并打印结果。同样,在calculator_service/src目录下创建一个名为calculator_client.py的Python文件:
#!/usr/bin/env python
import sys
import rospy
from calculator_service.srv import Calculator
def calculate_client(a, b):
rospy.wait_for_service('calculate')
try:
calculate = rospy.ServiceProxy('calculate', Calculator)
resp = calculate(a, b)
return resp.sum
except rospy.ServiceException as e:
print("Service call failed: %s"%e)
def usage():
return "%s [x y]"%sys.argv[0]
if __name__ == "__main__":
if len(sys.argv) == 3:
a = float(sys.argv[1])
b = float(sys.argv[2])
else:
print(usage())
sys.exit(1)
print("Requesting %s+%s"%(a, b))
print("%s + %s = %s"%(a, b, calculate_client(a, b)))
- python脚本赋权
chmod +x /your_python_files_path/xxx.py
- 构建ROS包
回到工作空间的根目录,构建ROS包:
cd ~/my_ros_calculator_ws
catkin_make
设置好环境变量:
source devel/setup.bash
- 运行示例
启动服务服务器:
rosrun calculator_service calculator_server.py
然后在一个新的终端窗口中启动服务客户端,传递两个数字作为参数:
rosrun calculator_service calculator_client.py 2 3
- 最后你看到类似这样的输出:
Requesting 2.0 + 3.0
2.0 + 3.0 = 5.0
结语
经过一番探索与实践,我们不仅掌握了在Ubuntu系统上安装不同版本ROS的技巧,还学会了如何构建一个Catkin工作空间,并最终完成了一个简单的ROS计算器服务示例。这一旅程不仅让我们从零开始搭建了一个功能齐全的ROS开发环境,还让我们亲身体验到了ROS的强大之处。
希望这篇文章能帮助你在机器人开发的道路上越走越远。无论前方有多少挑战,只要保持好奇心和学习的热情,你就一定能克服困难,实现自己的梦想。祝愿每一位ROS开发者都能在未来的开发过程中不断突破自我,创造更多精彩!