Ros常用命令
    
    
    
    Linux常用命令
   
#cd 未指定路径则返回主目录
cd <目录路径>
#pwd 返回当前工作目录的绝对路径
pwd
#mkdir 创建文件夹
mkdir [选项]<目录名称>
mkdir test 
# ls 列出目录的内容
ls
# touch 创建文件或者改变文件或者目录时间
touch [选项]<文件名称>
#mv/cp 移动/复制文件,mv也可以用于给文件改名
mv / cp <源文件> <目标文件>
#rmdir/rm 前一个只能删除空文件夹,后一个加上-r可以删除非空文件夹,不加为删除文件
rmdir xxx
rm -r xxx
rm xxx.txt
# df -m :以兆字节为单位查看磁盘使用报告
#du :查看文件占用的空间
# sudo 以管理员身份运行
#diff 比较两个文件的差异,输出不匹配的行
diff file1.ext file2.ext
# chmod 是另一个 Linux 命令,用于更改文件和目录的读取,写入和执行权限
chmod 777 file.ext
#ping 检查与服务器的连接状态
ping google.com
# echo 将文本 “Hello, my name is John”添加到 name.txt的文件中
echo Hello, my name is John >> name.txt
# top 类似于任务管理器
#wget xxx(url)下载链接
# hostname 输出用户名
    
    
    常用命令
   
rosrun
rostopic
rosservice
rosnode
rosparam
rosmsg
rossrv
    
    
    Ros核心概念及常用命令
   
    
    
    Nodes, Topics, Messages,Service常用命令
   
rqt_graph:显示当前节点及topic
rosnode list:列出所有节点(rosout节点每个都有,可以忽略)
rosnode info /turtlesim:列出节点的信息
rostopic list:列出所有Topic
rostopic pub -r 10 cmd_vel geometry_msgs/Twist:发布话题
rostopic echo cmd_vel:打印消息
rostopic hz cmd_vel:显示话题发布速率
rostopic info cmd_vel :列出topic信息
rosmsg show geometry_msgs/Twist:显示消息结构
rosservice call :请求服务
    
    
    例子
   
    
   
    
    
    
     rosnode list
    
    :列出所有节点(rosout节点每个都有,可以忽略)
   
    
     rosnode info /turtlesim
    
    :列出节点的信息
   
    
     rostopic
    
    :相关指令如下:
   
    
    
    按两次tab键会自动补全
   
    
   
    
    
    
     rosservice list
    
服务端都是海龟仿真器,终端都是客户端去请求服务
    
   
请求服务会有返回值
    
    
    节点与节点管理器
   
- 
节点(Node):执行单元
- 执行某一个具体任务的进程,可以理解为一个可执行文件
 - 不同节点可以使用不同的语言,分布式运行在不同的主机
 - 每一个节点必须具备一个唯一的名称
 
 - 
节点管理器(RosMaster):控制中心
- 为节点提供命名和注册
 - 为两个节点之间建立连接(类似于婚姻介绍所)
 - 提供参数服务器,运行是的各种参数(全局变量)都储存在其中
 
 
    
    
    Ros的两种通信方式(Topic和Service)
   
- 
     话题(Topic): 异步通信机制
- 节点间用来传输数据的总线
 - 
       使用
发布/订阅
模型,从发布者传输到订阅者,可以有多个订阅者 
 - 
     消息(Message):话题数据
- 具有一定类型和数据结构,ros提供有标准的数据类型,也可自定义
 - 
       使用与编程语言无关的
.msg
文件定义,编译过程中生成对应的代码文件 
 
    
   
    
   
- 
     服务(Service):同步通信机制(ེ类似于TCP通信)
- 
       使用
客户端/服务器(C/S)
,客户端发送
请求
数据,服务端处理后返回
应答
数据; - 
       使用编程语言无关的
.srv
文件定义请求和应答数据结构,编译过程中生成对应的代码文件 
 - 
       使用
 
    
   
    
   
- 话题与服务的区别
 
话题发布者尽量只有一个,订阅者可以有多个,如果多个发布者可能会造成数据混乱
    
   
    
    
    参数(静态)
   
- 
     参数(Parameter):全局共享字典
- 可通过网络访问的共享、多变量字典;
 - 节点使用此服务器来存储和检索运行时的参数;
 - 
       适合存储静态、非二进制配置参数,不适合存储动态配置的数据,如
需要ros有设置动态参数储存的功能可以自行了解
 
 
    
   
    
    
    Ros文件系统
   
- 功能包(Package):ROS软件中的基本单元,包含节点源码、配置文件、数据定义等
 - 功能包清单(Package manifest):记录功能包的基本信息,包含作者信息、许可信息、依赖选项、编译标志等
 - 元功能包(Meta Package):组织多个用于同一目的功能包
 
    
   
    
    
    工作空间(Workspace)
   
存放工程开发相关文件的文件夹
    
    
    文件结构
   
- src:代码空间(Source Space)
 - build:编译空间(྆Build Space )存放编译过程中的文件,一般不需要去管
 - devel:开发空间(Development Space)编译生成的可执行文件、库都在这里
 - install:安装空间(Install Space)类似于devel
 
ros2已经取消devel,开发时只需要用devel,开发完成用install
    
    
    创建工作空间
   
mkdir -p ~/catkin_ws/src && cd catkin_ws/src
catkin_init_workspace # optionally init catkin workspace(一般不用)
wstool init # init .rosinstall file
catkin_make #编译工作空间
#如果想要产生install文件(开发完后给用户)
catkin_make install
source devel/setup.bash #添加到环境变量
    
    
    把仓库添加到工作空间
   
roscd; cd ../src
wstool set repo_name \
--git http://github.com/org/repo_name.git \
--version=melodic-devel
wstool up
    
    
    更新工作空间依赖
   
sudo rosdep init  # only once
resdep update
rosdep install --from-paths src --ignore-src \
--rosdistro=${R0OS_DISTRO} -y
    
    
    功能包
   
    
    
    创建功能包
   
cd ~/catkin_ws/src
catkin_create_pkg package_name [dependencies ... ]
#catkin_create_pkg test_pkg std_msg roscpp rospy
#编译功能包
cd ~/catkin_ws
catkin_make
souce cd ~/catkin_ws/devel/setup.bash
    
    
    功能包的文件夹
   
    一定会有
    
     CmakeList.txt
    
    (编译规则)和
    
     paclage.xml
    
    (编译的依赖)两个文件
   
| 文件名 | 功能 | 
|---|---|
| include/package_name | C++ header files | 
| Src | 
       Socurce files. Python libraries in subdirectories  | 
| scripts | Python nodes and scripts | 
| msg, srv, action | Message, Service, and Action definitions | 
    
    
    Release Repo Packages
   
catkin_generate_changelog
# review & commit changelogs
catkin_prepare_release
bloom-release --track kinetic --ros-distro kinetic repo_name
    
    
    Reminders
   
- Testable logic
 - Publish diagnostics
 - Desktop dependencies in a separate package
 
    
    
    话题发布
   
    
    
    C++实现
   
/**
 * 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
 */
 
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
int main(int argc, char **argv)
{
	// ROS节点初始化
	ros::init(argc, argv, "velocity_publisher");
	// 创建节点句柄
	ros::NodeHandle n;
	// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
	ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
	// 设置循环的频率
	ros::Rate loop_rate(10);
	int count = 0;
	while (ros::ok())
	{
	    // 初始化geometry_msgs::Twist类型的消息
		geometry_msgs::Twist vel_msg;
		vel_msg.linear.x = 0.5;
		vel_msg.angular.z = 0.2;
	    // 发布消息
		turtle_vel_pub.publish(vel_msg);
		ROS_INFO("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
				vel_msg.linear.x, vel_msg.angular.z);
	    // 按照循环频率延时
	    loop_rate.sleep();
	}
	return 0;
}
    修改
    
     CMakeLists.txt
    
    文件
   
add_executable(velocity_publisher src/velocity_publisher.cpp) #将src/velocity_publisher.cpp文件编译成名为velocity_publisher的可执行文件
target_link_libraries(velocity_publisher ${catkin_LIBRARIES})#将velocity_publisher链接到ros的库
    编译:
    
     catkin_make
    
roscore#终端1
rosrun turtlesim turtlesim_node#终端2
#终端3
source devel/setup.bash
rosrun learning_topic velocity_publisher
    可执行文件
    
     velocity_publisher
    
    在
    
     /devel/lib/learning_topic
    
    中
   
    
    
    python实现
   
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将发布turtle1/cmd_vel话题,消息类型geometry_msgs::Twist
import rospy
from geometry_msgs.msg import Twist
def velocity_publisher():
	# ROS节点初始化
    rospy.init_node('velocity_publisher', anonymous=True)
	# 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10
    turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)
	#设置循环的频率
    rate = rospy.Rate(10) 
    while not rospy.is_shutdown():
		# 初始化geometry_msgs::Twist类型的消息
        vel_msg = Twist()
        vel_msg.linear.x = 0.5
        vel_msg.angular.z = 0.2
		# 发布消息
        turtle_vel_pub.publish(vel_msg)
    	rospy.loginfo("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", 
				vel_msg.linear.x, vel_msg.angular.z)
		# 按照循环频率延时
        rate.sleep()
if __name__ == '__main__':
    try:
        velocity_publisher()
    except rospy.ROSInterruptException:
        pass
    python 不需要编译,可以直接用
    
     rosrun
    
    运行
   
    
    
    话题订阅
   
    
    
    C++实现
   
#include <ros/ros.h>
#include "turtlesim/Pose.h"
// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
    // 将接收到的消息打印出来
    ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}
int main(int argc, char **argv)
{
    // 初始化ROS节点
    ros::init(argc, argv, "pose_subscriber");
    // 创建节点句柄
    ros::NodeHandle n;
    // 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
    ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
    // 循环等待回调函数
    ros::spin();
    return 0;
}
    C++需要修改
    
     CmakeLists.txt
    
    文件,和上面的发布者相同。
   
    
    
    python实现
   
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
import rospy
from turtlesim.msg import Pose
def poseCallback(msg):
    rospy.loginfo("Turtle pose: x:%0.6f, y:%0.6f", msg.x, msg.y)
def pose_subscriber():
	# ROS节点初始化
    rospy.init_node('pose_subscriber', anonymous=True)
	# 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallback
    rospy.Subscriber("/turtle1/pose", Pose, poseCallback)
	# 循环等待回调函数
    rospy.spin()
if __name__ == '__main__':
    pose_subscriber()
    
    
    话题消息的定义与使用
   
    
    
    话题定义的几个步骤:
   
### Messages,Services
These go after find_packagel(), but before catkin_package[].
Example:
- find_package(`catkin REQUIRED COMPONENTS message_generation std_msgs`)
- add_message_files(`FILES MyMessage.msg`)
- add_service_files(`FILES MyService.msg`)
- generate_messages(`DEPENDENCIES std_msgs`)
- catkin_package(`CATKIN_DEPENDS message_runtime std_msgs`)
### Build Libraries, Executables
Goes after the `catkin_package()` call.
add_library(`${PROJECT_NAME} src/main`)
add_executable(`${PROJECT_NAME} node src/main`)
target_link_libraries(`${PROJECT_NAME}_node ${catkin_LIBRARIES}`)
### Package Dependencies
To use headers or libraries in a package, or to use a package's exported CMake macros, express a build-time dependency:
find_package(catkin REQUIRED COMPONENTS roscpp)
Tell dependent packages what headers or libraries to pull in when your package is declared as a catkin component:
catkin_package(
INCLUDE_DIRS include
LIBRARIES ${PROJECT_NAME}
CATKIN_DEPENDS roscpp)
Note that any packages listed as CATKIN_DEPENDS dependencies must also be declared as a <run_depend> in package.xml.
    1)定义
    
     xxx.msg
    
    文件
   
    2)在
    
     package.xml
    
    中添加功能包依赖
   
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
    3)在
    
     CmakeLists.txt
    
    文件添加编译选项
   
- find_package( … message_generation)
 - 
     add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs) - catkin_package(… message_runtime)
 
    4)用
    
     catkin_make
    
    编译文件
   
5)编写发布者和订阅者
- C++发布者,需要导入头文件,修改注册topic时的消息类型,其他的地方和调用ros的消息类型一样
 
/**
 * 该例程将发布/person_info话题,自定义消息类型learning_topic::Person
 */
 
#include <ros/ros.h>
#include "learning_topic/Person.h"
int main(int argc, char **argv)
{
    // ROS节点初始化
    ros::init(argc, argv, "person_publisher");
    // 创建节点句柄
    ros::NodeHandle n;
    // 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10
    ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);
    // 设置循环的频率
    ros::Rate loop_rate(1);
    int count = 0;
    while (ros::ok())
    {
        // 初始化learning_topic::Person类型的消息
    	learning_topic::Person person_msg;
		person_msg.name = "Tom";
		person_msg.age  = 18;
		person_msg.sex  = learning_topic::Person::male;
        // 发布消息
		person_info_pub.publish(person_msg);
       	ROS_INFO("Publish Person Info: name:%s  age:%d  sex:%d", 
				  person_msg.name.c_str(), person_msg.age, person_msg.sex);
        // 按照循环频率延时
        loop_rate.sleep();
    }
    return 0;
}
订阅者和之前相比完全相同
    注意:
    
    需要修改
    
     CmakeLists.txt
    
    文件添加编译选项
   
add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)
add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)
python的实现方法和之前的完全一样
    
    
    launch启动
   
launch文件:通过XML文件实现多节点的配置和启动(可自动启动Ros Master)
    
    
    launch文件语法
   
<launch>:launch文件中的根元素采用<launch>标签定义
<node>
- pkg:节点所在的功能包名称
- type:节点的可执行文件名称
- name:节点运行时的名称,这个可以自己去,会取代掉初始化时的节点名字,同一个可执行文件用不同的名字会产生两个
- output、respawn、reqiured、ns、args
<launch>
	#启动节点
    <node pkg="package_name" type="executable_name" name="node_name" output="screen" />
</launch>
例子:
<launch>
    <node pkg="learning_topic" type="person_subscriber" name="talker" output="screen" />
    <node pkg="learning_topic" type="person_publisher" name="listener" output="screen" /> 
</launch>
    
    
    Installation
   
install{TARGETS ${PROJECT_NAME}
	DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION})
install{TARGETS ${PROJECT_NAME} node
	DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
install(PROGRAMS scripts/myscript
	DESTINATION ${CATKIN_ PACKAGE_BIN_DESTINATION})
install{(DIRECTORY launch
	DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION})
    
    
    RUNNING SYSTEM
   
    Run ROS using plain:
    
     roscore
    
Alternatively, roslaunch will run its own roscore automatically if it can’t find one:
roslaunch my_package package_launchfile. launch
Suppress this behaviour with the –wait flag.
    
    
    Remote Connection
   
Master’s ROS environment:
- 
     
ROS_IP
or
ROS_HOSTNAME
set to this machine’s network address. - 
     
ROS_MASTER_URI
set to URI containing that IP or hostname. 
Your environment:
- 
     
ROS_IP
or
ROS_HOSTNAME
set to your machine’s network address. - 
     
ROS_MASTER_URI
set to the URI from the master. 
    To debug, check ping from each side to the other, run
    
     roswtf
    
    on each side.
   
    
    
    ROS Console
   
    Adjust using
    
     rqt_logger_level
    
    and monitor via
    
     rqt_console
    
    . To enable debug output across sessions, edit the
    
     $HOME/ . ros/config/rosconscle. config
    
    and add a line for your package:
    
    
     log4dj. logger.ros.package_name=DEBUG
    
    And then add the following to your session:
    
    
     export ROSCONSOLE_CONFIG_FILE=$HOME/.ros/config/rosconsole.config
    
    
    Use the
    
     roslaunch --screen flag
    
    to force all node output to the screen, as if
    
    each declared had the ocutput=“screen” attribute.
   
参考: