ROS学习日记1

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NLP工程化

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值