ROS机器人

ROS操作系统安装教程请参考如下网址:

①https://www.cnblogs.com/liu-fa/p/5779206.html

②http://wiki.ros.org/kinetic/Installation/Ubuntu

ROS学习教程:http://www.guyuehome.com/column/ros-explore

ROS工程代码管理编辑软件:roboware-studio

通过以下指令安装特定的ROS包:

sudo apt-get install ros-kinetic-PACKAGE;e.g.  sudo apt-get install ros-kinetic-gmapping

也可以通过roboware-studio中的ros包管理器进行搜索安装。

ROS机器人项目架构如下图:

ROS机器人_第1张图片

一、ROS机器人基础

1、ROS机器人工程由package软件包组成(可以是单个或者是多个)

ROS开发思想:节点node组织(软件包中包含多个node节点,一个节点就是一个进程,有一个main函数)。整个机器人由多个软件包来组成,软件包中又有多个node节点组成。软件包可大可小 。小的由一个软件包对应控制一个硬件,大的由多个节点组成一个大的软件包可以控制多个硬件,小软件包和大软件包组合在一起构成一个机器人的工程。 内部的node就可通过话题(topic)和消息(message)进行互连,组成一个完整的机器人。

所有的节点node是通过话题来进行数据互通,发布和订阅 的方式传递消息。主题和消息都属于单向通信,常用于传感器收据收发与周期性的数据收发。而服务用于双向通信和需要数据处理和回应的场合。 例如发送一个目标位置请求 机器人移动到目标点,这个过程要经过一段时间,期间机器人可能遇到障碍物 进行路径的重新规划,最终才能达到目的地并相应服务。有时节点运行时还需要参数的调整,如激光雷达在每个机器人上面安装的位置不同,位置坐标信息是需要写进参数中的,然后再启动node,这种属于静态参数。还有一些参数可以再节点运行时进行动态调整的,会有一个参数服务器。

主题(topic):x消息以发布Publisher/订阅Subscriber的方式传递,发布者和订阅者不了解彼此的存在,可以1对11,多对1,1对多,多对多的方式传递;

消息(message):类似C语言struct结构体 ;例如:/opt/ros/kinetic/share/geometry_msgs/msg下的Twist.msg

# This expresses velocity in free space broken into its linear and angular parts.
Vector3  linear
Vector3  angular

Vectoe3.msg内容如下:

# This represents a vector in free space. 
# It is only meant to represent a direction. Therefore, it does not
# make sense to apply a translation to it (e.g., when applying a 
# generic rigid transformation to a Vector3, tf2 will only apply the
# rotation). If you want your data to be translatable too, use the
# geometry_msgs/Point message instead.

float64 x
float64 y
float64 z

服务(Service):允许nide发送请求request,并获得一个相应reponse;

例如:/opt/ros/kinetic/share/std_srvs/srv下的SetBool.srv(---前属于数据请求格式,---后属于数据相应格式。有些无请求数据,有些无相应数据)

bool data # e.g. for hardware enabling / disabling
---
bool success   # indicate successful run of triggered service
string message # informational, e.g. for error messages

参数(Param):node运行前的静态参数,运行时可调整的动态参数。

总结:

工程由1~N个软件包组成

软件包可以是独立的package,也可以是综合的Metapackage(由多个package组成)

软件包package由多个node组成

1个node就是一个进程,就是一个程序,含有一个main函数

一个node内部包含:Action、Cfg、Launch、Msg、Srv、include、Src

2、ROS节点的运行

指令:roscore (在节点运行之前先要打开一个ros master)。运行节点有两种方法:

①rosrun package名称 node名称(每次运行一个节点)

e.g.  rosrun turtlesim turtlesim_node 

②roslaunch package名称 launch文件名称(可以自动打开master,并且一次运行多个node)

可以通过指令rqt_graph来查看节点之间的关联

3、查看topic话题、msg消息

ROS机器人_第2张图片

taylen@taylen:~$ rosrun turtlesim turtlesim_node 
[ INFO] [1563959541.454174060]: Starting turtlesim with node name /turtlesim
[ INFO] [1563959541.477019308]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]
taylen@taylen:~$ rosrun turtlesim turtle_teleop_key 
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
taylen@taylen:~$ rosrun turtlesim turtle_teleop_key 
Reading from keyboard
---------------------------
Use arrow keys to move the turtle.
taylen@taylen:~$ rostopic -h
rostopic is a command-line tool for printing information about ROS Topics.

Commands:
	rostopic bw	display bandwidth used by topic
	rostopic delay	display delay of topic from timestamp in header
	rostopic echo	print messages to screen
	rostopic find	find topics by type
	rostopic hz	display publishing rate of topic    
	rostopic info	print information about active topic
	rostopic list	list active topics
	rostopic pub	publish data to topic
	rostopic type	print topic or field type

Type rostopic  -h for more detailed usage, e.g. 'rostopic echo -h'

taylen@taylen:~$ rostopic list
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
taylen@taylen:~$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
taylen@taylen:~$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

taylen@taylen:~$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
taylen@taylen:~$ rostopic type /turtle1/cmd_vel |rosmsg show
geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z
taylen@taylen:~$ rostopic pub -1 turtle1/cmd_vel geometry_msgs/Twist -- '[1,0,0]' '[0,0,1]'
publishing and latching message for 3.0 seconds

按1Hz发布:

taylen@taylen:~$ rostopic pub -r 1 turtle1/cmd_vel geometry_msgs/Twist -- '[1,0,0]' '[0,0,1]'
publishing and latching message for 3.0 seconds

订阅topic

taylen@taylen:~$ rostopic echo turtle1/cmd_vel

4、图形化工具的应用

查看图形化工具:

taylen@taylen:~$ rosrun rqt_
rqt_action           rqt_gui_cpp          rqt_nav_view         rqt_robot_dashboard  rqt_srv
rqt_bag              rqt_gui_py           rqt_plot             rqt_robot_monitor    rqt_tf_tree
rqt_bag_plugins      rqt_image_view       rqt_pose_view        rqt_robot_steering   rqt_top
rqt_console          rqt_launch           rqt_publisher        rqt_runtime_monitor  rqt_topic
rqt_dep              rqt_logger_level     rqt_py_common        rqt_rviz             rqt_web
rqt_graph            rqt_moveit           rqt_py_console       rqt_service_caller   
rqt_gui              rqt_msg              rqt_reconfigure      rqt_shell  

打印出系统中的话题与消息:

taylen@taylen:~$ rosrun rqt_topic rqt_topic 

ROS机器人_第3张图片

利用图形化工具发布话题消息:

taylen@taylen:~$ rosrun rqt_publisher rqt_publisher 

ROS机器人_第4张图片

启动可视化工具rviz:

taylen@taylen:~$ rviz
[ INFO] [1564017780.278932561]: rviz version 1.12.17
[ INFO] [1564017780.278974198]: compiled against Qt version 5.5.1
[ INFO] [1564017780.278985216]: compiled against OGRE version 1.9.0 (Ghadamon)
[ INFO] [1564017780.935744722]: Stereo is NOT SUPPORTED
[ INFO] [1564017780.935831614]: OpenGl version: 4.5 (GLSL 4.5).

ROS机器人_第5张图片

用于动态调整参数工具:

taylen@taylen:~$ rosrun rqt_reconfigure rqt_reconfigure

二、roboware创建ROS工程编译激光雷达

雷达采用思岚科技的rplidar A2,关于在Ubuntu下如何驱动激光雷达,可以参考:https://blog.csdn.net/dzhongjie/article/details/84575189

在思岚科技官网下载相应的ros开发包----rplidar_ros-master.zip:https://github.com/slamtec/rplidar_ros

解压后将其重命名为rplidar_ros(为了与其ros包中的CMakeLists.txt的内容对应,第二行)

cmake_minimum_required(VERSION 2.8.3)
project(rplidar_ros)

set(RPLIDAR_SDK_PATH "./sdk/")

FILE(GLOB RPLIDAR_SDK_SRC 
  "${RPLIDAR_SDK_PATH}/src/arch/linux/*.cpp"
  "${RPLIDAR_SDK_PATH}/src/hal/*.cpp"
  "${RPLIDAR_SDK_PATH}/src/*.cpp"
)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rosconsole
  sensor_msgs
)

include_directories(
  ${RPLIDAR_SDK_PATH}/include
  ${RPLIDAR_SDK_PATH}/src
  ${catkin_INCLUDE_DIRS}
)

catkin_package()

add_executable(rplidarNode src/node.cpp ${RPLIDAR_SDK_SRC})
target_link_libraries(rplidarNode ${catkin_LIBRARIES})

add_executable(rplidarNodeClient src/client.cpp)
target_link_libraries(rplidarNodeClient ${catkin_LIBRARIES})

install(TARGETS rplidarNode rplidarNodeClient
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

install(DIRECTORY launch rviz sdk
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
  USE_SOURCE_PERMISSIONS
)

通过roboware_stdio新建工程命名为rplidar_ws,将rplidar_ros拷贝到src文件夹下,编译后,添加环境变量,在~/.bashrc最后添加一行:

source ~/rplidar_ws/devel/setup.bash

关闭终端,重新打开终端,输入一下命令便可运行激光雷达:

roslaunch rplidar_ros view_rplidar.launch

三、ssh远程连接ROS主控

①配置本机

打开终端添加ssh服务:sudo apt-get install openssh-server

检查ssh的服务状态:sudo service ssh status或sudo ps -e | grep ssh

taylen@taylen:~$ sudo service ssh status
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enab
   Active: active (running) since 五 2019-07-26 15:33:55 CST; 46min ago
  Process: 2401 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCES
  Process: 2396 ExecReload=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
  Process: 1241 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
 Main PID: 1259 (sshd)
   CGroup: /system.slice/ssh.service
           └─1259 /usr/sbin/sshd -D

7月 26 15:56:23 taylen systemd[1]: Reloading OpenBSD Secure Shell server.
7月 26 15:56:24 taylen sshd[1259]: Received SIGHUP; restarting.
7月 26 15:56:24 taylen systemd[1]: Reloaded OpenBSD Secure Shell server.
7月 26 15:56:24 taylen sshd[1259]: Server listening on 0.0.0.0 port 22.
7月 26 15:56:24 taylen sshd[1259]: Server listening on :: port 22.
7月 26 15:56:24 taylen systemd[1]: Reloading OpenBSD Secure Shell server.
7月 26 15:56:24 taylen sshd[1259]: Received SIGHUP; restarting.
7月 26 15:56:24 taylen systemd[1]: Reloaded OpenBSD Secure Shell server.
7月 26 15:56:24 taylen sshd[1259]: Server listening on 0.0.0.0 port 22.
7月 26 15:56:24 taylen sshd[1259]: Server listening on :: port 22.
taylen@taylen:~$ sudo ps -e | grep ssh
 1259 ?        00:00:00 sshd

开启ssh服务:sudo service ssh start(关闭ssh服务:sudo service ssh stop)

②配置远端

若远端为电脑,则配置如上,需要开启ssh服务

若远端为树莓派,则按照如下配置开启ssh服务:sudo raspi-config-->Advanced Option-->A4 SSH-->Yes

③ssh usr@远端IP 或者ssh usr@host  ,便可建立连接

免密码登录:1、ssh-keygen 默认设置生成key在.ssh目录中;2、ssh-copy-id -i .ssh/id_rsa.pub usr@host(将公钥复制到远程主控)

四、TF空间描述与变换(http://wiki.ros.org/tf/)

作用:各个坐标系进行相互换算。tf能根据时间缓冲并维护多个参考系之间的坐标变换关系,可以在任意时间,将点、向量等数据的坐标,完成坐标变换。

TF使用方法

①监听tf变换:接收并缓存系统中发布的所有参考系变换,并从中查询所需要的参考系变换。

②广播tf变换:向系统中广播参考系之间的坐标变换关系。系统中更可能会存在多个不同部分的tf变换广播,每个广播都可以直接将参考系变换关系直接插入tf树中,不需要进行同步。

TF包内的指令工具

①tf_monitor :打印tf树中的所有参考系信息

②tf_echo 查看指定参考系之间的变换关系

③static_transform_publisher 发布两个参考系之间的静态坐标变换,两个参考系一般不发生相对位置变化。命令的格式如下:

  • static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
  • static_transform_publisher x y z qx qy qz qw frame_id child_frame_id  period_in_ms

以上两种命令格式,需要设置坐标的偏移和旋转参数,偏移参数都使用相对于xyz三轴的坐标位移,而旋转参数第一种命令格式使用以弧度为单位的 yaw/pitch/roll三个角度(yaw是围绕x轴旋转的偏航角,pitch是围绕y轴旋转的俯仰角,roll是围绕z轴旋转的翻滚角),而第二种命令格式使用四元数表达旋转角度。发布频率以ms为单位,一般100ms比较合适。

该命令不仅可以在终端中使用,还可以在launch文件中使用,使用方式如下:

  
  

view_frames:

view_frames 是可视化的调试工具,可以生成pdf文件,来显示整棵tf树的信息。命令行的执行方式如下:

$ rosrun tf view_frames  
$ evince frames.pdf

五、ROS节点编程serial节点(大脑连接小脑)

USB接口名称和权限问题:

当接入多个USB设备时,为避免更改程序中USB名称,可以为相关USB设备创建端口软链接。例如所接设备为CH340串口助手。

①创建一个名为CH340.rules的文件,内容如下(所填参数可在终端中通过命令lsusb查看):

# set the udev rule , make the device_port be fixed by CH340
# chmod 0666 /dev/ttyUSB*(ll /dev 查看设备)
KERNEL=="ttyUSB*", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE:="0666", SYMLINK+="CH340"

②将上述文件放到/etc/udev/rules.d 中:

sudo cp 路径/CH340.rules  /etc/udev/rules.d 

③更改端口权限(通过指令 ll /dev来查看端口号):

sudo chmod 0666 ttyusb?

通过上述步骤,便可在程序中通过CH340来替换相应的ttyusb?

Linux串口编程

借鉴rplidar的sdk中的成熟代码(arch/linux/net_seria.cpp)

  • open()
  • waitfordata()
  • recvdata()
  • sendata()
  • close()

fsdsd

你可能感兴趣的:(ROS机器人)