Ros各版本官网文档汇总
rclpy官方文档
RosIndex查各种接口包功能包
各种gazebo的libgazebo控制插件介绍和demo
gazebo官网指导
鱼香ROS的CSDN
我的GitHub项目
ros2 launch.py写法,含代码
(base) xianzhou@xianzhou:~$ mkdir -p ~/dev_ws/src
返回目录
sudo apt install python3-colcon-ros
colcon build
若已经安装conda并激活,在base环境下编译后报错:
ModuleNotFoundError: No module named 'catkin_pkg'
则在base环境下重新安装后再编译即可
pip install catkin_pkg
colcon build --packages-select
colcon build --packages-select YOUR_PKG_NAME --cmake-args -DBUILD_TESTING=0
colcon test
colcon build --symlink-install
colcon官方文档
返回目录
sudo apt install ros-
ros2 pkg create
ros2 pkg create example_py --build-type ament_python --dependencies rclpy
ros2 pkg executables
ros2 pkg executables turtlesim
ros2 pkg list
ros2 pkg xml
返回目录
ros2 run
ros2 node list
ros2 node info
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
ros2 run example_parameters_rclcpp parameters_basic --ros-args -p rcl_log_level:=10
返回目录
rqt
rqt_graph
sudo apt-get install ros-foxy-rqt-tf-tree
ros2 run rqt_tf_tree rqt_tf_tree --force-discover
返回目录
ros2 topic -h
ros2 topic list
ros2 topic list -t
ros2 topic echo
ros2 topic info
ros2 interface show std_msgs/msg/String
ros2 topic pub
ros2 topic pub /chatter std_msgs/msg/String '{data: "hello world"}
ros2 topic pub /chatter std_msgs/msg/String '{data: "hello world"} -
返回目录
ros2 service list
ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts "{a: 5,b: 10}"
ros2 service type /add_two_ints
ros2 service find example_interfaces/srv/AddTwoInts
返回目录
ros2 param list
ros2 param describe /turtlesim background_b
ros2 param describe /turtlesim background_b
ros2 param set /turtlesim background_r 44
ros2 param dump /turtlesim
ros2 param load /turtlesim ./turtlesim.yaml
ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml
返回目录
ros2 action list
ros2 action list -t
ros2 action info /turtle1/rotate_absolute
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.5}" --feedback
返回目录
通讯接口就是各种信息包,查看包可以直接上ros index
ros2 interface list
ros2 interface package
ros2 interface std_msgs
ros2 interface show std_msgs/msg/String
ros2 interface proto sensor_msgs/msg/Image
返回目录
sudo apt-get install ros-foxy-rqt-tf-tree
ros2 run rqt_tf_tree rqt_tf_tree --force-discover
ros2 run tf2_ros tf2_echo father_frame child_frame
返回目录
ros2 pkg create ssr_pkg --build-type ament_python --dependencies rclpy
#!/usr/bin/env python3
#coding=utf-8
import rclpy
from rclpy.node import Node
def main(args=None):
#入口函数
rclpy.init(args=args) #初始化节点
Ultrasonic_node = Node("Ultrasonic") #新建节点
Ultrasonic_node.get_logger().info("hello world")
rclpy.spin(Ultrasonic_node) #保持节点运行
rclpy.shudown() #关闭rclpy
新建节点还能这么写
Ulterasonic_node = rclpy.create_node("Ultrasonic"))
4. 修改/ssr_pkg/setup.py
'console_scripts': [
"Ultrasonic = ssr_pkg.Ultrasonic_node:main"
],
colcon build --symlink-instal
source install/setup.bash
ros2 run ssr_pkg Ultrasonic.py
返回目录
from std_msgs.msg import String
pub_pos = Node.create_publisher(Node_name,String,'Position',qos_profile=10)
self.pub_pos = self.create_publisher(String,'Position',qos_profile=10)
timer = Node.create_timer(Node_name,timer_period_sec=period_sec,callback=self.__pub_callback)
self.timer = self.create_timer(timer_period_sec=period_sec,callback=self.__pub_callback)
def __pub_callback(self):
self.pub_pos.publish(self.msg)
msg = String()
msg.data = "I am Ultrasonic"
pub_pos.publish(msg)
#!/usr/bin/env python3
#coding=utf-8
import rclpy
from rclpy.node import Node
from std_msgs.msg import String #与ros1不同,在创建pkg时不需要写std_msgs的依赖项
#OOP编程
class SsrNode(Node):
'''
define a class of ssr nodes
'''
def __init__(self,name):
super().__init__(name)
self.get_logger().info("Publisher Ultrasonic_node online")
self.pub_pos = self.create_publisher(String,'Position',qos_profile=10)
def publish(self,period_sec,msg):
self.msg = msg
self.timer = self.create_timer(timer_period_sec=period_sec,callback=self.__pub_callback) #回调函数这里不能传参
#两个下划线表示private
def __pub_callback(self):
self.pub_pos.publish(self.msg)
def main(args=None):
'''
入口函数
'''
rclpy.init(args=args) #初始化节点
Ultrasonic_node = SsrNode("Ultrasonic_node") #新建节点
msg = String()
msg.data = "I am Ultrasonic"
Ultrasonic_node.publish(1,msg)
rclpy.spin(Ultrasonic_node) #保持节点运行
rclpy.shudown() #关闭rclpy
返回目录
from std_msgs.msg import String
sub_pos = Node.create_subscription(Node_name,String,"Position",self.__sub_callback,qos_profile=10)
def __sub_callback(self,msg):
self.get_logger().info(msg.data)
#!/usr/bin/env python3
#coding=utf-8
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class AtrNode(Node):
'''
define a class of atr node
'''
def __init__(self,name):
super().__init__(name)
self.get_logger().info("subscriber motor_node online")
self.sub_pos = self.create_subscription(String,"Position",self.__sub_callback,qos_profile=10)
def __sub_callback(self,msg):
self.get_logger().info(msg.data)
def main(args=None):
rclpy.init(args=args)
Motor_node = AtrNode("Motor_node")
rclpy.spin(Motor_node) #保持节点运行
rclpy.shudown() #关闭rclpy
返回目录
ros2 pkg create robot_msgs --build-type ament_cmake --dependencies rosidl_default_generators geometry_msgs
RobotStatus.msg
uint32 STATUS_MOVEING = 1
uint32 STATUS_STOP = 1
uint32 status
float32 pose
RobotPose.msg
uint32 STATUS_MOVEING = 1
uint32 STATUS_STOP = 2
uint32 status
geometry_msgs/Pose pose
MoveRobot.srv
# 前进后退的距离
float32 distance
---
# 当前的位置
float32 pose
ControlRobot.action
# Goal: 要移动的距离
float32 distance
---
# Result: 最终的位置
float32 pose
---
# Feedback: 中间反馈的位置和状态
float32 pose
uint32 status
uint32 STATUS_MOVEING = 3
uint32 STATUS_STOP = 4
# 添加下面的内容
rosidl_generate_interfaces(${PROJECT_NAME}
"msg/RobotPose.msg"
"msg/RobotStatus.msg"
"srv/MoveRobot.srv"
"action/ControlRobot.action"
DEPENDENCIES geometry_msgs
)
rosidl_interface_packages #添加这一行
colcon build --packages-select robot_msgs
source install/setup.bash
pip install empy==3.3.2
pip install lark
返回目录
from robot_msgs.srv import MoveRobot
self.moverobot_srv_ = self.create_service(MoveRobot,"move_robot",self.__moverobot_callback)
def __moverobot_callback(self,request,response):
'''
服务端回调函数,获得前进距离,并返回现在位置
request和response为固定参数,必须有。不过名字可以更换
request\response 都是MoveRobot类型
'''
self.get_logger().info("get requestions,moving forward %f meters"%request.distance)
self.pose += request.distance
response.pose = self.pose
return response
from robot_msgs.srv import MoveRobot
self.moverobot_client_ = self.create_client(MoveRobot,"move_robot")
def move_robot(self,distance):
'''
客户端发送请求函数
distance 输入移动距离
'''
while rclpy.ok() and self.moverobot_client_.wait_for_service(1)==False:
self.get_logger().info(f"等待服务端上线....")
#创建请求对象,后面的.Request()是自带的不是写在massage里的 ,可能是把消息打包?
request = MoveRobot.Request()
request.distance = distance
self.get_logger().info(f"Requesting robot to move forward {distance} meters")
#调用服务函数,并设置接收回调函数
self.moverobot_client_.call_async(request).add_done_callback(self.move_robot_callback__)
def move_robot_callback__(self,response):
'''
客户端回调函数
response为服务端返回值,就是客户端回调函数return的呢个
'''
# .result()可能是把消息解包?
result = response.result()
self.get_logger().info(f"now located {result.pose} meters away")
返回目录
Node.declare_parameter(Ultrasonic_node,"period",5)
self.declare_parameter("period",5)
period = Node.get_parameter(Ultrasonic_node,"period").value
period = Node.get_parameter(Ultrasonic_node,"period").get_parameter_value().integer_value
period = Node.get_parameter_or("period",alternative_value = 5).value
返回目录
有点复杂,用到的时候再写
├── atr_pkg
│ ├── launch #放launch文件
| └── Motor.launch.py
│ └── atr_pkg #放的节点.py文件夹,别弄错了
| ...
# 导入库
from launch import LaunchDescription
from launch_ros.actions import Node
# from launch.actions import ExecuteProcess # ExecuteProcess用于在launch文件中启动一个进程
def generate_launch_description():
# 函数名固定,由ros2 launch 扫描调用
#创建两个节点的启动对象,其他启动项写法不同
motor_node = Node(
package="atr_pkg",
executable="Motor_node"
)
Ultrasonic_node = Node(
package="ssr_pkg",
executable="Ultrasonic" #这里为你在节点.py中定义的节点名字
#也就是setup.py中entry_points里添加的最前面的呢个名字
)
# teleop_key = ExecuteProcess(
# cmd=['xterm', '-e', 'ros2', 'run', 'turtlesim', 'turtle_teleop_key'],
# name='teleop_key',
# )
# ExecuteProcess()中最重要的参数是cmd,它是一个包含要执行的命令及其参数的列表。例如,cmd=['ls', '-l']将执行ls -l命令。
# 在上面的launch示例文件中,需要在你的系统中安装xterm才能使用这个功能。
# sudo apt-get update
# sudo apt-get install xterm
# 为什么没有将turtle_teleop_key以Node的方式进行启动?大概问题是,launch启动文件无法从终端获取用户输入,
# 所以使用ExecuteProcess替代,这将会自动运行一个xterm终端模拟器来获取键盘输入。
# 取自https://blog.csdn.net/xijuezhu8128/article/details/131818608
# 创建LaunchDescription对象launch_description,用于描述launch文件
launch_description = LaunchDescription(
[motor_node, Ultrasonic_node])
return launch_description
launch启动Rviz2
from ament_index_python.packages import get_package_share_directory #启动rviz用
import os #启动rviz用
def generate_launch_description():
rviz_name = 'display.rviz' #rviz的配置文件
# 获取功能包路径(注意,这个路径是在工作空间的install文件夹里
package_name = 'atr_pkg'
pkg_description = get_package_share_directory(package_name)
# 声明文件路径,os.path.join将口号内的str用\连接,组成路径
rviz_config_path = os.path.join(pkg_description,'rviz',rviz_name)
# 创建Rviz项
rviz_node = Node(
package="rviz2",
executable="rviz2",
name="rviz2",
output="screen",
arguments=['-d', rviz_config_path]
)
return launch_description = LaunchDescription(
[rviz])
# setup.py中添加这个(先看步骤3)
# (os.path.join('share', package_name, 'rviz'), glob('rviz/*.rviz')), #启动Rviz添加这一行
launch启动Gazebo
from ament_index_python.packages import get_package_share_directory #启动rviz和Gazebo用
import os #启动rviz和Gazebo用
def generate_launch_description():
# 获取world路径
world_file_name = 'empty_world.world'
package_name = 'atr_pkg'
pkg_description = get_package_share_directory(package_name)
world = os.path.join(pkg_description,'world',world_file_name)
# 创建Gazebo项
gazebo = ExecuteProcess(
cmd=['gazebo', '--verbose',world], #若没有world则删掉'--verbose',world
output='screen'
)
return launch_description = LaunchDescription(
[gazebo])
# 使用保存的world时,在setup.py中添加这个(先看步骤3)
# (os.path.join('share', package_name, 'world'), glob('world/*.world')), #使用保存的地图添加这一行
from glob import glob #添加这一行
import os #添加这一行
data_files=[
('share/ament_index/resource_index/packages',
['resource/' + package_name]),
('share/' + package_name, ['package.xml']),
(os.path.join('share', package_name, 'launch'), glob('launch/*.launch.py')), #添加这一行
],
colcon build --packages-select atr_pkg
source install/setup.bash
ros2 launch atr_pkg Motor.launch.py
返回目录