机器人编程趣味实践14-机器人三维仿真(Gazebo+TurtleBot3)
生活随笔
收集整理的這篇文章主要介紹了
机器人编程趣味实践14-机器人三维仿真(Gazebo+TurtleBot3)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
之前,介紹了節點、主題、服務和行動等基本概念,以及rqt和rosbag2等工具。
采用了官方改版的二維環境,那么現在玩耍一下更為逼真的三維仿真環境吧。
- 仿真軟件Gazebo
- 機器人TurtleBot3
TurtleBot3支持仿真開發環境,可以在仿真中用虛擬機器人編程開發。 有兩種開發環境可以做到這一點,一種是使用帶有 3D 可視化工具 RViz 的假節點,另一種是使用 3D 機器人模擬器 Gazebo。
- 假節點適合用機器人模型和運動進行測試,但不支持傳感器。
- 如果需要執行 SLAM 或導航,Gazebo 將是一個可行的解決方案,因為它支持 IMU、LDS 和攝像頭等傳感器。
環境配置
# TURTLEBOT3_MODEL export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/home/zhangrelay/RobSoft/turtlebot3/src/simulations/turtlebot3_gazebo/models export TURTLEBOT3_MODEL=burger# ROS2 source /opt/ros/foxy/setup.bash#colcon source /usr/share/colcon_cd/function/colcon_cd.sh源碼編譯
可以使用deb直接安裝:
- sudo apt install ros-foxy-turtlebot3-gazebo
注意包要裝全。
這里,采用源碼編譯如下:
- colcon build
功能包列表如上所示。
仿真實踐
1 啟動環境
- ros2 launch turtlebot3_gazebo empty_world.launch.py
藍色射線為激光的可視化效果。
empty_world.launch代碼如下:
import osfrom ament_index_python.packages import get_package_share_directory from launch import LaunchDescription from launch.actions import ExecuteProcess from launch.actions import IncludeLaunchDescription from launch.launch_description_sources import PythonLaunchDescriptionSource from launch.substitutions import LaunchConfigurationTURTLEBOT3_MODEL = os.environ['TURTLEBOT3_MODEL']def generate_launch_description():use_sim_time = LaunchConfiguration('use_sim_time', default='True')world_file_name = 'empty_worlds/' + TURTLEBOT3_MODEL + '.model'world = os.path.join(get_package_share_directory('turtlebot3_gazebo'),'worlds', world_file_name)launch_file_dir = os.path.join(get_package_share_directory('turtlebot3_gazebo'), 'launch')pkg_gazebo_ros = get_package_share_directory('gazebo_ros')return LaunchDescription([IncludeLaunchDescription(PythonLaunchDescriptionSource(os.path.join(pkg_gazebo_ros, 'launch', 'gzserver.launch.py')),launch_arguments={'world': world}.items(),),IncludeLaunchDescription(PythonLaunchDescriptionSource(os.path.join(pkg_gazebo_ros, 'launch', 'gzclient.launch.py')),),ExecuteProcess(cmd=['ros2', 'param', 'set', '/gazebo', 'use_sim_time', use_sim_time],output='screen'),IncludeLaunchDescription(PythonLaunchDescriptionSource([launch_file_dir, '/robot_state_publisher.launch.py']),launch_arguments={'use_sim_time': use_sim_time}.items(),),])2 圓周運動
之前和之前二維環境圓周運動的指令非常類似哦。
- ros2 topic pub --rate 2 /cmd_vel geometry_msgs/msg/Twist "{linear: {x: 1.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.8}}"
3 鍵盤遙控
使用如下命令啟動鍵盤遙控:
- ros2 run turtlebot3_teleop teleop_keyboard
鍵盤遙控代碼如下:
import os import select import sys import rclpyfrom geometry_msgs.msg import Twist from rclpy.qos import QoSProfileif os.name == 'nt':import msvcrt else:import termiosimport ttyBURGER_MAX_LIN_VEL = 0.22 BURGER_MAX_ANG_VEL = 2.84WAFFLE_MAX_LIN_VEL = 0.26 WAFFLE_MAX_ANG_VEL = 1.82LIN_VEL_STEP_SIZE = 0.01 ANG_VEL_STEP_SIZE = 0.1TURTLEBOT3_MODEL = os.environ['TURTLEBOT3_MODEL']msg = """ Control Your TurtleBot3! --------------------------- Moving around:wa s dxw/x : increase/decrease linear velocity (Burger : ~ 0.22, Waffle and Waffle Pi : ~ 0.26) a/d : increase/decrease angular velocity (Burger : ~ 2.84, Waffle and Waffle Pi : ~ 1.82)space key, s : force stopCTRL-C to quit """e = """ Communications Failed """def get_key(settings):if os.name == 'nt':return msvcrt.getch().decode('utf-8')tty.setraw(sys.stdin.fileno())rlist, _, _ = select.select([sys.stdin], [], [], 0.1)if rlist:key = sys.stdin.read(1)else:key = ''termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)return keydef print_vels(target_linear_velocity, target_angular_velocity):print('currently:\tlinear velocity {0}\t angular velocity {1} '.format(target_linear_velocity,target_angular_velocity))def make_simple_profile(output, input, slop):if input > output:output = min(input, output + slop)elif input < output:output = max(input, output - slop)else:output = inputreturn outputdef constrain(input_vel, low_bound, high_bound):if input_vel < low_bound:input_vel = low_boundelif input_vel > high_bound:input_vel = high_boundelse:input_vel = input_velreturn input_veldef check_linear_limit_velocity(velocity):if TURTLEBOT3_MODEL == 'burger':return constrain(velocity, -BURGER_MAX_LIN_VEL, BURGER_MAX_LIN_VEL)else:return constrain(velocity, -WAFFLE_MAX_LIN_VEL, WAFFLE_MAX_LIN_VEL)def check_angular_limit_velocity(velocity):if TURTLEBOT3_MODEL == 'burger':return constrain(velocity, -BURGER_MAX_ANG_VEL, BURGER_MAX_ANG_VEL)else:return constrain(velocity, -WAFFLE_MAX_ANG_VEL, WAFFLE_MAX_ANG_VEL)def main():settings = Noneif os.name != 'nt':settings = termios.tcgetattr(sys.stdin)rclpy.init()qos = QoSProfile(depth=10)node = rclpy.create_node('teleop_keyboard')pub = node.create_publisher(Twist, 'cmd_vel', qos)status = 0target_linear_velocity = 0.0target_angular_velocity = 0.0control_linear_velocity = 0.0control_angular_velocity = 0.0try:print(msg)while(1):key = get_key(settings)if key == 'w':target_linear_velocity =\check_linear_limit_velocity(target_linear_velocity + LIN_VEL_STEP_SIZE)status = status + 1print_vels(target_linear_velocity, target_angular_velocity)elif key == 'x':target_linear_velocity =\check_linear_limit_velocity(target_linear_velocity - LIN_VEL_STEP_SIZE)status = status + 1print_vels(target_linear_velocity, target_angular_velocity)elif key == 'a':target_angular_velocity =\check_angular_limit_velocity(target_angular_velocity + ANG_VEL_STEP_SIZE)status = status + 1print_vels(target_linear_velocity, target_angular_velocity)elif key == 'd':target_angular_velocity =\check_angular_limit_velocity(target_angular_velocity - ANG_VEL_STEP_SIZE)status = status + 1print_vels(target_linear_velocity, target_angular_velocity)elif key == ' ' or key == 's':target_linear_velocity = 0.0control_linear_velocity = 0.0target_angular_velocity = 0.0control_angular_velocity = 0.0print_vels(target_linear_velocity, target_angular_velocity)else:if (key == '\x03'):breakif status == 20:print(msg)status = 0twist = Twist()control_linear_velocity = make_simple_profile(control_linear_velocity,target_linear_velocity,(LIN_VEL_STEP_SIZE / 2.0))twist.linear.x = control_linear_velocitytwist.linear.y = 0.0twist.linear.z = 0.0control_angular_velocity = make_simple_profile(control_angular_velocity,target_angular_velocity,(ANG_VEL_STEP_SIZE / 2.0))twist.angular.x = 0.0twist.angular.y = 0.0twist.angular.z = control_angular_velocitypub.publish(twist)except Exception as e:print(e)finally:twist = Twist()twist.linear.x = 0.0twist.linear.y = 0.0twist.linear.z = 0.0twist.angular.x = 0.0twist.angular.y = 0.0twist.angular.z = 0.0pub.publish(twist)if os.name != 'nt':termios.tcsetattr(sys.stdin, termios.TCSADRAIN, settings)if __name__ == '__main__':main()簡單加入中文方便使用:
閱讀源碼非常重要。
4 節點
5 主題
6 服務
ros2 service list -t
- /apply_joint_effort [gazebo_msgs/srv/ApplyJointEffort]
- /apply_link_wrench [gazebo_msgs/srv/ApplyLinkWrench]
- /clear_joint_efforts [gazebo_msgs/srv/JointRequest]
- /clear_link_wrenches [gazebo_msgs/srv/LinkRequest]
- /delete_entity [gazebo_msgs/srv/DeleteEntity]
- /gazebo/describe_parameters [rcl_interfaces/srv/DescribeParameters]
- /gazebo/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
- /gazebo/get_parameters [rcl_interfaces/srv/GetParameters]
- /gazebo/list_parameters [rcl_interfaces/srv/ListParameters]
- /gazebo/set_parameters [rcl_interfaces/srv/SetParameters]
- /gazebo/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
- /get_model_list [gazebo_msgs/srv/GetModelList]
- /pause_physics [std_srvs/srv/Empty]
- /reset_simulation [std_srvs/srv/Empty]
- /reset_world [std_srvs/srv/Empty]
- /robot_state_publisher/describe_parameters [rcl_interfaces/srv/DescribeParameters]
- /robot_state_publisher/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
- /robot_state_publisher/get_parameters [rcl_interfaces/srv/GetParameters]
- /robot_state_publisher/list_parameters [rcl_interfaces/srv/ListParameters]
- /robot_state_publisher/set_parameters [rcl_interfaces/srv/SetParameters]
- /robot_state_publisher/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
- /rqt_gui_py_node_4338/describe_parameters [rcl_interfaces/srv/DescribeParameters]
- /rqt_gui_py_node_4338/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
- /rqt_gui_py_node_4338/get_parameters [rcl_interfaces/srv/GetParameters]
- /rqt_gui_py_node_4338/list_parameters [rcl_interfaces/srv/ListParameters]
- /rqt_gui_py_node_4338/set_parameters [rcl_interfaces/srv/SetParameters]
- /rqt_gui_py_node_4338/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
- /spawn_entity [gazebo_msgs/srv/SpawnEntity]
- /teleop_keyboard/describe_parameters [rcl_interfaces/srv/DescribeParameters]
- /teleop_keyboard/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
- /teleop_keyboard/get_parameters [rcl_interfaces/srv/GetParameters]
- /teleop_keyboard/list_parameters [rcl_interfaces/srv/ListParameters]
- /teleop_keyboard/set_parameters [rcl_interfaces/srv/SetParameters]
- /teleop_keyboard/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
- /turtlebot3_diff_drive/describe_parameters [rcl_interfaces/srv/DescribeParameters]
- /turtlebot3_diff_drive/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
- /turtlebot3_diff_drive/get_parameters [rcl_interfaces/srv/GetParameters]
- /turtlebot3_diff_drive/list_parameters [rcl_interfaces/srv/ListParameters]
- /turtlebot3_diff_drive/set_parameters [rcl_interfaces/srv/SetParameters]
- /turtlebot3_diff_drive/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
- /turtlebot3_imu/describe_parameters [rcl_interfaces/srv/DescribeParameters]
- /turtlebot3_imu/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
- /turtlebot3_imu/get_parameters [rcl_interfaces/srv/GetParameters]
- /turtlebot3_imu/list_parameters [rcl_interfaces/srv/ListParameters]
- /turtlebot3_imu/set_parameters [rcl_interfaces/srv/SetParameters]
- /turtlebot3_imu/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
- /turtlebot3_joint_state/describe_parameters [rcl_interfaces/srv/DescribeParameters]
- /turtlebot3_joint_state/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
- /turtlebot3_joint_state/get_parameters [rcl_interfaces/srv/GetParameters]
- /turtlebot3_joint_state/list_parameters [rcl_interfaces/srv/ListParameters]
- /turtlebot3_joint_state/set_parameters [rcl_interfaces/srv/SetParameters]
- /turtlebot3_joint_state/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
- /turtlebot3_laserscan/describe_parameters [rcl_interfaces/srv/DescribeParameters]
- /turtlebot3_laserscan/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
- /turtlebot3_laserscan/get_parameters [rcl_interfaces/srv/GetParameters]
- /turtlebot3_laserscan/list_parameters [rcl_interfaces/srv/ListParameters]
- /turtlebot3_laserscan/set_parameters [rcl_interfaces/srv/SetParameters]
- /turtlebot3_laserscan/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
- /unpause_physics [std_srvs/srv/Empty]
7 行動
SLAM和導航時候再補充。
8 更多
可參考前13篇中對應案例,在此三維環境中進行實踐哦。
總結
由二維環境到三維環境,仿真更炫酷,但是原理和指令幾乎一樣,學一招全掌控!
?
總結
以上是生活随笔為你收集整理的机器人编程趣味实践14-机器人三维仿真(Gazebo+TurtleBot3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vb.net显示系统通知
- 下一篇: python和vb的区别 程序语句_py