1.ROS
解析:ROS [Robot Operating System, 机器人操作系统]提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、函数库、可视化工具、消息传递和软件包管理等诸多功能。ROS遵循BSD开源许可协议。
2.ROS支持的传感器
解析:
[1]1维传感器
[2]2维传感器
[3]3维传感器[包括距离探测和RGB-D照相机设备]
[4]音频/语音 识别
[5]视觉相机
[6]环境感知
[7]推力/扭力/触摸 传感器
[8]动作捕获
[9]估计定位[GPS/IMU]
[10]电源
[11]射频识别
3.惯性测量单元
解析:惯性测量单元[Inertial Measurement Unit,简称IMU]是测量物体三轴姿态角[或角速率]以及加速度的装置。
4.RS-485协议
解析:典型的串行通讯标准是RS232和RS485,它们定义了电压,阻抗等,但不对软件协议给予定义。RS-485总线标准规定了总线接口的电气特性标准即对于2个逻辑状态的定义:正电平在+2V~+6V之间,表示一个逻辑状态;负电平在-2V~-6V之间,则表示另一个逻辑状态;数字信号采用差分传输方式,能够有效减少噪声信号的干扰。
5.RouterOS
解析:RouterOS是一种路由操作系统,是基于Linux核心开发,兼容x86 PC的路由软件,并通过该软件将标准的PC电脑变成专业路由器,在软件RouterOS软路由图的开发和应用上不断的更新和发展,软件经历了多次更新和改进,使其功能在不断增强和完善。特别在无线、认证、策略路由、带宽控制和防火墙过滤等功能上有着非常突出的功能,其极高的性价比,受到许多网络人士的青睐。
6.消息
解析:节点之间是通过传送消息进行通讯的。每一个消息都是一个严格的数据结构。
7.主题
解析:消息以一种发布/订阅的方式传递。一个节点可以在一个给定的主题中发布消息。一个节点针对某个主题关注与订阅特定类型的数据。可能同时有多个节点发布或者订阅同一个主题的消息。
8.包
解析:ROS的软件以包的方式组织起来。包包含节点、ROS依赖库、数据套、配置文件、第三方软件、或者任何其他逻辑构成。包的目标是提供一种易于使用的结构以便于软件的重复使用。
9.rviz
解析:rviz是ROS中一款强大的3D可视化工具。
10.tf
解析:tf是ROS中的坐标变换系统,在机器人的建模仿真中经常用到。ROS中主要有两种坐标系:
[1]固定坐标系:用于表示世界的参考坐标系。
[2]目标坐标系:相对于摄像机视角的参考坐标系。
11.gazebo
解析:这个工具是ROS中的物理仿真环境,gazebo本身就是一款机器人的仿真软件,基于ODE的物理引擎,可以模拟机器人以及环境中的很多物理特性。
12.Ubuntu 16.04源码编译ROS2
解析:
[1]Set Locale
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
[2]Add the ROS 2 apt repository
sudo apt update && sudo apt install curl gnupg2 lsb-release
curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -
sudo sh -c 'echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu xenial main" > /etc/apt/sources.list.d/ros2-latest.list'
[3]Install development tools and ROS tools
sudo apt update && sudo apt install -y \
build-essential \
cmake \
git \
python3-colcon-common-extensions \
python3-pip \
python-rosdep \
python3-vcstool \
wget
# install some pip packages needed for testing
python3 -m pip install -U \
argcomplete \
flake8 \
flake8-blind-except \
flake8-builtins \
flake8-class-newline \
flake8-comprehensions \
flake8-deprecated \
flake8-docstrings \
flake8-import-order \
flake8-quotes \
pytest-repeat \
pytest-rerunfailures \
pytest \
pytest-cov \
pytest-runner \
setuptools
# install Fast-RTPS dependencies
sudo apt install --no-install-recommends -y \
libasio-dev \
libtinyxml2-dev
# install CycloneDDS dependencies
sudo apt install --no-install-recommends -y \
libcunit1-dev
[4]Get ROS 2 code
mkdir -p ~/ros2_dashing/src
cd ~/ros2_dashing
wget https://raw.githubusercontent.com/ros2/ros2/dashing/ros2.repos
vcs import src < ros2.repos
[5]Install dependencies using rosdep
sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src --rosdistro=dashing -y --os=ubuntu:xenial --skip-keys "console_bridge fastcdr fastrtps libopensplice67 libopensplice69 rti-connext-dds-5.3.1 urdfdom_headers"
[6]Install more DDS implementations [Optional]
- ADLINK OpenSplice Debian Packages built by OSRF
sudo apt install libopensplice69
- RTI Connext [version 5.3.1, amd64 only]
sudo apt install -q -y rti-connext-dds-5.3.1
cd /opt/rti.com/rti_connext_dds-5.3.1/resource/scripts && source ./rtisetenv_x64Linux3gcc5.4.0.bash; cd -
[7]Build the code in the workspace
cd ~/ros2_dashing/
colcon build --symlink-install # ubuntu 18.04
colcon build --symlink-install --packages-ignore qt_gui_cpp rqt_gui_cpp # ubuntu 16.04
[8]Try some examples
. ~/ros2_dashing/install/local_setup.bash
ros2 run demo_nodes_cpp talker
. ~/ros2_dashing/install/local_setup.bash
ros2 run demo_nodes_py listener
13.编译ROS2遇到的问题
解析:
[1]ImportError: No module named 'rosdep2
sudo apt-get install python3-rosdep
pip install rosdep
[2]sudo rosdep init
ERROR: cannot download default sources list from:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down.
sudo c_rehash /etc/ssl/certs
sudo -E rosdep init
[3]pkg_resources.DistributionNotFound: The ‘colcon-core==0.4.5’ distribution was not found and is required by the application
https://github.com/colcon/colcon-core/releases/tag/0.4.5
[4]no module named rosidl_generator_c
pip install lark-parser
[5]Ubuntu 16.04升级gcc
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 50
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 50
sudo update-alternatives --config gcc
sudo update-alternatives --config g++
[6]dynlink_nvcuvid.h: No such file or directory
cmake -D BUILD_opencv_cudacodec=OFF
[7]image_tools编译失败
14.Ubuntu 16.0源码编译OpenCV 3.4.0
解析:
wget https://github.com/opencv/opencv/archive/3.4.0.zip -O opencv-3.4.0.zip
wget https://github.com/opencv/opencv_contrib/archive/3.4.0.zip -O opencv_contrib-3.4.0.zip
sudo apt-get install unzip
unzip opencv-3.4.0.zip
unzip opencv_contrib-3.4.0.zip
cd opencv-3.4.0
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.0/modules -DOPENCV_ENABLE_NONFREE=True -D BUILD_opencv_cudacodec=OFF ..
make -j4
sudo make install
15.Ubuntu 16.04源码编译PCL
解析:
cd pcl-pcl-1.7.2 && mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j2
sudo make -j2 install
16.Ubuntu 16.04源码编译flann
解析:
cd flann-x.y.z-src
mkdir build
cd build
cmake ..
make
sudo make install
17.colcon
解析:colcon是对ROS编译工具catkin_make,catkin_make_isolated,catkin_tools和ament_tools迭代。colcon支持多种编译类型。推荐的编译类型是ament_cmake和ament_python,也支持纯cmake包。Ubuntu安装colcon如下所示:
sudo apt install python3-colcon-common-extensions
说明:colcon与catkin相比,没有devel目录。
18.使用colcon编译包
解析:
[1]创建工作区
mkdir -p ~/ros2_example_ws/src
cd ~/ros2_example_ws
[2]添加一些来源
git clone https://github.com/ros2/examples src/examples
cd ~/ros2_example_ws/src/examples/
git checkout $ROS_DISTRO [dashing]
cd ~/ros2_example_ws
[3]编译工作区
colcon build --symlink-install
[4]运行测试
colcon test
说明:source install/setup.bash导入环境非常重要。
[5]试试示例
ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function
ros2 run examples_rclcpp_minimal_publisher publisher_member_function
19.使用ROS2和colcon创建并编译一个包
解析:
[1]创建一个包
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws/src
source ~/ros2_dashing/install/setup.bash
ros2 pkg create learn
cd learn/src
[2]编写代码talker.cpp
/** talker.cpp **/
#include "rclcpp/rclcpp.hpp"
#include <chrono>
#include <std_msgs/msg/string.hpp>
#include <iostream>
using namespace std::chrono_literals;
using namespace std;
class Publisher : public rclcpp::Node{
public:
Publisher() :
Node("publisher"), count_(0)
{
publisher_ = this ->create_publisher<std_msgs::msg::String>("topic");
timer_ = this ->create_wall_timer(500ms, std::bind(&Publisher::timer_callback, this));
}
private:
void timer_callback(){
auto message = std_msgs::msg::String();
message.data = "Hello World! " + std::to_string(count_++);
RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", message.data.c_str());
publisher_->publish(message);
}
rclcpp::TimerBase::SharedPtr timer_;
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
size_t count_;
};
int main(int argc, char* argv[]) {
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<Publisher>());
rclcpp::shutdown();
return 0;
}
[3]编写代码listener.cpp
/** listener.cpp **/
#include <rclcpp/rclcpp.hpp>
#include <chrono>
#include <std_msgs/msg/string.hpp>
using namespace std::chrono;
using std::placeholders::_1;
class Subscriber : public rclcpp::Node {
public:
Subscriber() : Node("Subscriber")
{
subsciiption_ = this ->create_subscription<std_msgs::msg::String>(
"/topic", std::bind(&Subscriber::topic_callback, this, _1));
}
private:
void topic_callback(const std_msgs::msg::String::SharedPtr msg) {
RCLCPP_INFO(this->get_logger(), "I heard : '%s'", msg->data.c_str());
}
rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subsciiption_;
};
int main(int argc, char* argv[]){
rclcpp::init(argc, argv);
rclcpp::spin(std::make_shared<Subscriber>());
rclcpp::shutdown();
return 0;
}
[4]编写代码CmakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(learn)
# Default to C99
if(NOT CMAKE_C_STANDARD)
set(CMAKE_C_STANDARD 99)
endif()
# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
set(CMAKE_CXX_STANDARD 14)
endif()
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)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)
if(BUILD_TESTING)
find_package(ament_lint_auto REQUIRED)
# the following line skips the linter which checks for copyrights
# remove the line when a copyright and license is present in all source files
set(ament_cmake_copyright_FOUND TRUE)
# the following line skips cpplint (only works in a git repo)
# remove the line when this package is a git repo
set(ament_cmake_cpplint_FOUND TRUE)
ament_lint_auto_find_test_dependencies()
endif()
add_executable(talker src/talker.cpp)
ament_target_dependencies(talker rclcpp std_msgs)
add_executable(listener src/listener.cpp)
ament_target_dependencies(listener rclcpp std_msgs)
install(TARGETS
talker
listener
DESTINATION lib/${PROJECT_NAME}
)
ament_package()
[5]编写代码package.xml
<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format2.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="2">
<name>learn</name>
<version>0.0.0</version>
<description>TODO: Package description</description>
<maintainer email="sad490@todo.todo">sad490</maintainer>
<license>TODO: License declaration</license>
<buildtool_depend>ament_cmake</buildtool_depend>
<build_depend>example_interfaces</build_depend>
<build_depend>rcl</build_depend>
<build_depend>rmw_implementation</build_depend>
<exec_depend>example_interfaces</exec_depend>
<exec_depend>rcl</exec_depend>
<exec_depend>rmw_implementation</exec_depend>
<exec_depend>rosidl_default_runtime</exec_depend>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
<export>
<build_type>ament_cmake</build_type>
</export>
</package>
[6]开始编译包
cd ~/ros2_ws
source install/setup.bash
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Debug
[7]执行命令
source install/setup.bash
ros2 run learn talker
ros2 run learn listener
[8]使用CLion打开项目工程
source install/setup.bash
clion.sh
20.WorldInfo参数
解析:
[1]basicTimeStep:这个参数,它代表仿真最小的时间单元,当它为32时,即每次仿真的时间步长为32毫秒。
[2]Gravity:是重力的大小和方向,xyz的方向可以看仿真视图[界面中间Simulation View]的右下角会有一个坐标系,如果没有坐标系,可以在菜单栏:查看->可选显示->显示坐标系统打开。
[3]Physics:搭载物理插件的参数,在后期需要用到机械上的铰链、万向节等结构时需要用到物理插件。
21.hpp文件
解析:类模板的声明和定义要写在一个.hpp文件中,声明和定义不可以分开。本质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件。
22.make_shared
解析:make_shared函数的主要功能是在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr;由于是通过shared_ptr管理内存,因此一种安全分配和使用动态内存的方法。如下所示:
shared_ptr<string> p1 = make_shared<string>(10, '9');
shared_ptr<string> p2 = make_shared<string>("hello");
shared_ptr<string> p3 = make_shared<string>();
说明:make_shared是一个模板函数,它是组合使用可变参数模板与forward机制实现将实参保持不变地传递给其它函数。
23.CMAKE_COMPILER_IS_GNUCXX
解析:判断编译器类型。
24.cmake四个命令
解析:在cmake脚本中,设置编译选项可以通过add_compile_options命令,也可以通过set命令修改CMAKE_CXX_FLAGS或CMAKE_C_FLAGS。两者的区别是add_compile_options命令添加的编译选项是针对所有编译器的[包括C和C++编译器],而set命令设置CMAKE_C_FLAGS或CMAKE_CXX_FLAGS变量则是分别只针对c和c++编译器的。
[1]add_compile_options
[2]add_definitions
[3]target_compile_definitions
[4]build_command
25.find_package()
解析:find_package()命令是用来查找依赖包的,把整个依赖包的头文件包含路径、库路径、库名字、版本号等情况都获取到。
参考文献:
[1]ROSwiki:https://roswiki.com/
[2]ROS中文文档:http://wiki.ros.org/
[3]rviz:https://wiki.ros.org/rviz
[4]sudo rosdep init ERROR: cannot download default sources list from:https://blog.csdn.net/u013468614/article/details/102917569
[5]BUILD ERROR: the following packages/stacks could not have their rosdep keys resolved:https://github.com/googlecartographer/cartographer_ros/issues/485
[6]Building ROS 2 on Linux:https://index.ros.org/doc/ros2/Installation/Dashing/Linux-Development-Setup/
[7]Installing ROS 2 on Linux:https://index.ros.org/doc/ros2/Installation/Crystal/Linux-Install-Binary/
[8]ubuntu16.04 ros2 Crystal Colcon源码安装教程:https://blog.csdn.net/shanpenghui/article/details/89210049
[9]ROS2入门教程-linux下apt安装ROS2 Dashing:https://www.ncnynl.com/archives/201801/2253.html
[10]ament_index_python:https://github.com/ament/ament_index/tree/master/ament_index_python
[11]demo_nodes_cpp:https://github.com/ros2/demos/tree/master/demo_nodes_cpp
[12]Using colcon to build packages:https://index.ros.org/doc/ros2/Tutorials/Colcon-Tutorial/
[13]ROS Distributions:http://wiki.ros.org/Distributions