แนวทางที่ปรับเปลี่ยนได้สำหรับการนำทางหลายหุ่นยนต์ใน ROS2: การใช้ Turtlebot3 และ Nav2 (2024)

ในบทช่วยสอนนี้ เราจะเจาะลึกกระบวนการเริ่มต้นหุ่นยนต์ Turtlebot3 หลายตัวพร้อมกับสแต็ก Nav2 ภายในสภาพแวดล้อมการจำลอง Gazebo หุ่นยนต์แต่ละตัวจะมีเนมสเปซของตัวเอง เพื่อให้มั่นใจถึงการควบคุมและการนำทางส่วนบุคคลโดยใช้ RViz2 หรือการกระทำแบบบรรทัดคำสั่ง Navigation_to_pose

วิธีการที่ใช้ในที่นี้มีทั้งแบบปรับเปลี่ยนและปรับขนาดได้เพื่อรองรับหุ่นยนต์จำนวนเท่าใดก็ได้ ซึ่งถูกจำกัดด้วยทรัพยากรระบบ แง่มุมเดียวที่ต้องมีการปรับเปลี่ยนเพื่อเปลี่ยนแปลงจำนวนหุ่นยนต์คือไฟล์เรียกใช้งานหลัก โดยที่การกำหนดค่าหุ่นยนต์ถูกกำหนดเป็นรายการ

เพื่อให้เกิดความชัดเจน บทช่วยสอนนี้จะถือว่าคุณได้ติดตั้ง ROS2 Foxy (หรือเวอร์ชันที่ใหม่กว่า) ไว้แล้ว และตั้งค่าแพ็คเกจการจำลอง Turtlebot3 ถ้าไม่ โปรดดูเอกสารอย่างเป็นทางการของ ROS2 และ Turtlebot3 เพื่อเริ่มต้น

ฉันได้เขียนก่อนหน้านี้บทความเพื่อแสดงการตั้งค่า Turtlebot3 หลายตัวขั้นต่ำเปล่าสำหรับการขับเคลื่อนอย่างง่ายในศาลา ในบทความนี้ เราจะเปิดใช้งาน Nav2 สำหรับหุ่นยนต์เบอร์เกอร์เต่าในสถานการณ์หุ่นยนต์หลายตัว สคริปต์เปิดตัวเริ่มต้นการสร้างหุ่นยนต์สี่ตัว โดยมีข้อกำหนดในการแก้ไขการนับและตำแหน่งโดยตรงภายในโค้ด

ก่อนดำเนินการต่อ ตรวจสอบให้แน่ใจว่าคุณมีข้อกำหนดเบื้องต้นต่อไปนี้:

  1. รอส 2:repo ได้รับการทดสอบกับ Foxy และ Humble จะต้องติดตั้งอย่างใดอย่างหนึ่งในระบบของคุณ สำหรับการติดตั้งคำแนะนำสำหรับ Foxy คุณสามารถเยี่ยมชมเอกสาร ROS อย่างเป็นทางการได้
  2. ศาลาจำลอง: คุณจะต้องติดตั้ง Gazebo Simulator บนคอมพิวเตอร์ของคุณด้วย คุณสามารถค้นหาการติดตั้งแนะนำทางออนไลน์หรือบนเว็บไซต์ Gazebo
  3. แพ็คเกจ TurtleBot3 ROS 2: สุดท้ายนี้ ตรวจสอบให้แน่ใจว่าได้ติดตั้งแพ็คเกจ TurtleBot3 ROS 2 บนเครื่องของคุณแล้ว ฉันคำแนะนำสำหรับสิ่งนี้สามารถพบได้ในเอกสารประกอบของ TurtleBot3

หากต้องการแก้ไขโมเดล TurtleBot3 จำเป็นต้องมีสิทธิ์เข้าถึงซอร์สโค้ด นอกจากนี้ จำเป็นต้องติดตั้งการขึ้นต่อกันที่จำเป็นทั้งหมดเพื่อให้การทำงานราบรื่น กระบวนการนี้สามารถทำให้ง่ายขึ้นได้โดยใช้ rosdep ซึ่งเป็นเครื่องมือบรรทัดคำสั่งจาก ROS ที่จะติดตั้งการขึ้นต่อกันโดยอัตโนมัติ ดังนั้นจึงเป็นการเตรียมสภาพแวดล้อมที่พร้อมใช้งาน

ที่เก็บ Turtlebot3_simulations และ Navigation2 ได้รับการอัปเดตพร้อมกับการเปลี่ยนแปลงที่จำเป็นทั้งหมด คุณเพียงแค่ต้องโคลนที่เก็บข้อมูลเหล่านี้ สร้างพื้นที่ทำงาน จากนั้นดำเนินการคำสั่งเรียกใช้งาน

โคลน repo และติดตั้งการอ้างอิง

คอนโซล

สำหรับ ROS2 Foxy ให้ใช้สาขา foxy

mkdir -p robot_ws/src
ซีดี robot_ws/src

# สำหรับ foxy ให้ใช้สาขา foxy
โคลนคอมไพล์ https://github.com/arshadlab/turtlebot3_multi_robot.git -b foxy

ซีดี robot_ws
แหล่งที่มา /opt/ros/foxy/setup.bash
การติดตั้ง rosdep --from-paths src -r -y

สำหรับ ROS2 ให้ใช้สาขาหลัก

mkdir -p robot_ws/src
ซีดี robot_ws/src

# สำหรับ Humble ให้ใช้สาขาหลัก
git clone https://github.com/arshadlab/turtlebot3_multi_robot.git -b ต้นแบบ

ซีดี robot_ws
แหล่งที่มา /opt/ros/humble/setup.bash
การติดตั้ง rosdep --from-paths src -r -y

รหัสในสาขา “foxy” เข้ากันได้กับ ROS2 humble ในสาขาหลัก มีไฟล์เรียกใช้งานที่ได้รับการอัปเดตสำหรับการนำ nav2 มาใช้กับโหนดคอมโพสิต อย่างไรก็ตาม ขณะนี้การสร้างโหนดคอมโพสิตถูกปิดใช้งานเนื่องจากปัญหาในการใช้งาน ROS2 แบบเรียบง่าย ปัญหานี้เกี่ยวข้องกับการเผยแพร่การแมปเนมสเปซไปยังโหนด (ในคอนเทนเนอร์แบบผสม) ด้วยเนมสเปซย่อย เช่น “/global_costmap/global_costmap”

สร้างและเรียกใช้

หากต้องการสร้างและรันสภาพแวดล้อม Gazebo ให้ทำตามขั้นตอนเหล่านี้:

  1. นำทางไปยังrobot_wsไดเรกทอรี:ซีดี robot_ws/
  2. สร้างพื้นที่ทำงาน:Colcon build --symlink-install.php
  3. แหล่งที่มาของไฟล์ติดตั้ง:แหล่งที่มา ./install/setup.bash
  4. เปิดตัวการจำลอง:ros2 เปิดตัว Turtlebot3_multi_robot gazebo_multi_nav2_world.launch.py
ซีดี robot_ws/
Colcon build --symlink-install.php
แหล่งที่มา ./install/setup.bash
ros2 เปิดตัว Turtlebot3_multi_robot gazebo_multi_nav2_world.launch.py ​​Enable_drive:=True

ศาลาพร้อมหุ่นยนต์ Turtlebot3 สี่ตัว

แนวทางที่ปรับเปลี่ยนได้สำหรับการนำทางหลายหุ่นยนต์ใน ROS2: การใช้ Turtlebot3 และ Nav2 (2)

เอาต์พุต Rviz

แนวทางที่ปรับเปลี่ยนได้สำหรับการนำทางหลายหุ่นยนต์ใน ROS2: การใช้ Turtlebot3 และ Nav2 (3)

เอาต์พุตรายการโหนด ros2

/ศาลา
/map_server
/lifecycle_manager_map_server
/lifecycle_manager_map_server_service_client
/tb1/amcl
/tb1/amcl_rclcpp_node
/tb1/bt_navigator
/tb1/bt_navigator_rclcpp_node
/tb1/controller_server
/tb1/controller_server_rclcpp_node
/tb1/global_costmap/global_costmap
/tb1/global_costmap/global_costmap_rclcpp_node
/tb1/global_costmap_client
/tb1/lifecycle_manager_localization
/tb1/lifecycle_manager_localization_service_client
/tb1/lifecycle_manager_navigation
/tb1/lifecycle_manager_navigation_service_client
/tb1/local_costmap/local_costmap
/tb1/local_costmap/local_costmap_rclcpp_node
/tb1/local_costmap_client
/tb1/planner_server
/tb1/planner_server_rclcpp_node
/tb1/recoveries_server
/tb1/recoveries_server_rclcpp_node
/tb1/robot_state_publisher
/tb1/rviz2
/tb1/rviz2
/tb1/rviz2
/tb1/rviz2
/tb1/transform_listener_impl_558c16241c60
/tb1/transform_listener_impl_561b159d0760
/tb1/transform_listener_impl_563e7f1c4900
/tb1/transform_listener_impl_7f6108018330
/tb1/transform_listener_impl_7fcfd4020aa0
/tb1/เต่าบอท3_diff_drive
/tb1/เต่าบอท3_imu
/tb1/เต่าบอท3_joint_state
/tb1/turtlebot3_laserscan
/tb1/waypoint_follower
/tb1/waypoint_follower_rclcpp_node
/tb2/amcl
...
...
/tb4/transform_listener_impl_55cfbd5962d0
/tb4/transform_listener_impl_56079ee74620
/tb4/transform_listener_impl_563cf1d8b130
/tb4/transform_listener_impl_5641fe70f7a0
/tb4/transform_listener_impl_7f12041567b0
/tb4/เต่าบอท3_diff_drive
/tb4/เต่าบอท3_imu
/tb4/เต่าบอท3_joint_state
/tb4/turtlebot3_laserscan
/tb4/waypoint_follower
/tb4/waypoint_follower_rclcpp_node

ตามที่เห็นข้างต้น หุ่นยนต์แต่ละตัวมีเนมสเปซเป็นของตัวเอง

เปิดตัวตัวเลือก

คอนฟิกูเรชันดีฟอลต์ของระบบเปิดใช้งาน rviz ซึ่งส่งผลให้มีการเปิดหน้าต่าง rviz สี่หน้าต่าง อย่างไรก็ตาม การเรียกทำงาน rviz สามารถปิดใช้งานได้โดยใช้อ็อพชันการเรียกทำงานของ Enable_rviz ในทำนองเดียวกัน โหนดขับเคลื่อนอัตโนมัติจะถูกปิดใช้งานในตอนแรก แต่สามารถเปิดใช้งานได้โดยใช้ตัวเลือกการเปิดใช้ Enable_drive

ros2 เปิดตัว Turtlebot3_multi_robot gazebo_multi_nav2_world.launch.py ​​Enable_rviz:=เท็จ

ros2 เปิดตัว Turtlebot3_multi_robot gazebo_multi_nav2_world.launch.py ​​Enable_drive:=True

คำสั่ง launch ตั้งค่าท่าเริ่มต้นโดยใช้หัวข้อ /initialpose หลังจากนั้นผู้ใช้มีตัวเลือกในการจัดเตรียมเป้าหมายโดยใช้เมนูเป้าหมาย Navigation2 ใน rviz สำหรับอินสแตนซ์หุ่นยนต์นั้น

แนวทางที่ปรับเปลี่ยนได้สำหรับการนำทางหลายหุ่นยนต์ใน ROS2: การใช้ Turtlebot3 และ Nav2 (4)
แนวทางที่ปรับเปลี่ยนได้สำหรับการนำทางหลายหุ่นยนต์ใน ROS2: การใช้ Turtlebot3 และ Nav2 (5)

วิธีการบรรทัดคำสั่ง

การตั้งค่าท่าทางเริ่มต้นผ่านบรรทัดคำสั่งสำหรับหุ่นยนต์ tb1

หัวข้อ ros2 pub -1 --qos-ความน่าเชื่อถือ เชื่อถือได้ /tb1/initialpose Geometry_msgs/PoseWithCovarianceStamped "{ส่วนหัว: {frame_id: map}, ก่อให้เกิด: {pose: {ตำแหน่ง: {x: -0.6, y: 0.0, z: 0.0} , การวางแนว: {x: 0.0, y: 0.0, z: 1.01, w: 1.0}}, }}"

การตั้งเป้าหมายการนำทางผ่านบรรทัดคำสั่งสำหรับหุ่นยนต์ tb1

การกระทำ ros2 send_goal /tb1/navigate_to_pose nav2_msgs/action/NavigateToPose "ท่าทาง: {ส่วนหัว: {frame_id: แผนที่}, ท่าทาง: {ตำแหน่ง: {x: -3.2, y: 6.20, z: 0.0}, การวางแนว:{x: 0.0 , y: 0.0, z: 0, w: 1.0000000}}}"

สรุปการเปลี่ยนแปลง:

Turtlebot3_simulations repo:

  1. สร้างไฟล์เปิดตัวใหม่แล้ว (multi_nav_turtlebot3_world.launch.py) ไฟล์นี้เริ่มต้นสภาพแวดล้อมโลกและสร้างหุ่นยนต์และสแต็ก nav2
  2. โมเดล Turtlebot3 (Burger) ได้รับการอัปเดตเพื่อรองรับการแมป tf สำหรับไดรฟ์ต่าง ๆ นอกจากนี้ แท็กเนมสเปซภายในแท็กปลั๊กอินจะถูกปิดใช้งาน
  3. ไฟล์โลกสำหรับการวางไข่ Turtlebots

ที่เก็บ Navigation2:

  1. เพิ่มการแมปหัวข้อการสแกนไปที่ Navigation_launch.py ​​ใน repo ของ Navigation2
  2. อัปเดตไฟล์มุมมอง rviz เพื่อลบ / ออกจากชื่อหัวข้อ
  3. ปิดใช้งานการตรวจสอบ groot ใน nav2_params.yaml

คำอธิบายสำหรับการเปลี่ยนแปลง 1,2 และ 3 เหมือนกับที่ให้ไว้ในครั้งก่อนบทความ.

การกำหนดค่าหุ่นยนต์

การจัดเรียงหุ่นยนต์สามารถระบุได้ในไฟล์เรียกใช้งาน การปรับปรุงที่อาจเกิดขึ้นในอนาคตอาจเกี่ยวข้องกับการเรียกข้อมูลการกำหนดค่าจากไฟล์ เช่น json

# ชื่อและท่าทางของหุ่นยนต์
หุ่นยนต์ = [
{'ชื่อ': 'tb1', 'x_pose': '-1.5', 'y_pose': '-0.5', 'z_pose': 0.01},
{'ชื่อ': 'tb2', 'x_pose': '-1.5', 'y_pose': '0.5', 'z_pose': 0.01},
{'ชื่อ': 'tb3', 'x_pose': '1.5', 'y_pose': '-0.5', 'z_pose': 0.01},
{'ชื่อ': 'tb4', 'x_pose': '1.5', 'y_pose': '0.5', 'z_pose': 0.01},
# …
# …
]

หัวข้อ map_server เดียวและหัวข้อ global /map

เพื่อให้แน่ใจว่าระบบมีความสอดคล้องกันด้วยแผนที่เดียว ไฟล์เรียกใช้งานพาเรนต์จะสร้างอินสแตนซ์เซิร์ฟเวอร์แผนที่เดียว ในlocalization_launch.pyไฟล์ การสร้างอินสแตนซ์เซิร์ฟเวอร์แผนที่จะถูกระงับโดยใช้พารามิเตอร์เรียกทำงานที่เพิ่มใหม่ การจัดเตรียมนี้สอดคล้องกับสถานการณ์จริง เนื่องจากมีเพียงหนึ่งแผนที่ในระบบ โหนดทั้งหมดสมัครรับหัวข้อ global /map nav2_params.yaml ได้รับการแก้ไขเพื่อรวม map_topic ด้วย '/' (เช่น /map) สำหรับโหนด amcl, global และ local costmap

/tf และ /tf_static ต่อหุ่นยนต์

การใช้งานนี้เป็นไปตามแผนการให้โรบอตแต่ละตัวมีแผนผัง tf ของตัวเองเผยแพร่ภายใต้เนมสเปซเฉพาะของมัน (เช่น /tb1/tf) โดยไม่ต้องใช้ tf_prefix ปัจจุบัน เซิร์ฟเวอร์แผนที่ถูกสร้างขึ้นแยกกันสำหรับหุ่นยนต์แต่ละตัว แต่เป็นการปรับปรุงในอนาคต สามารถสร้างได้เพียงครั้งเดียวสำหรับหุ่นยนต์ทั้งหมด เพิ่มประสิทธิภาพการใช้ทรัพยากรและปรับปรุงประสิทธิภาพ

แนวทางที่ปรับเปลี่ยนได้สำหรับการนำทางหลายหุ่นยนต์ใน ROS2: การใช้ Turtlebot3 และ Nav2 (6)

สแกนการแมปหัวข้อ

มีการแก้ไขสคริปต์ Navigation_launch.py ​​เพื่อรวมการแมปหัวข้อการสแกนใหม่ การปรับเปลี่ยนนี้ทำให้มั่นใจได้ว่าโหนดต้นทุนส่วนกลางและท้องถิ่น ที่สร้างขึ้นภายใต้เนมสเปซหุ่นยนต์ สามารถปรับและเชื่อมต่อกับแหล่งสแกนที่ถูกต้องซึ่งสอดคล้องกับอินสแตนซ์ของหุ่นยนต์ที่เกี่ยวข้องได้อย่างเหมาะสม

อัปเดตเป็นไฟล์มุมมอง rviz

เพื่อที่จะใช้ไฟล์การกำหนดค่ามุมมองเดียวกันสำหรับแต่ละอินสแตนซ์ rviz เฉพาะโรบ็อต หัวข้อที่กล่าวถึงในไฟล์มุมมอง rviz ได้รับการแก้ไข คำนำหน้า “/” ถูกลบออกจากหัวข้อเหล่านี้แล้ว การปรับนี้ช่วยให้หัวข้อที่สมัครสมาชิกเชื่อมโยงกับอินเทอร์เฟซเป้าหมายเมื่อ rviz ถูกเรียกใช้ด้วยเนมสเปซของหุ่นยนต์โดยใช้ “__ns:=” ด้วยเหตุนี้ ROS2 จะเพิ่มเนมสเปซเป็นคำนำหน้าชื่อหัวข้อ เนื่องจากคำนำหน้า “/” ได้ถูกลบออกไปแล้ว การปรับเปลี่ยนนี้อำนวยความสะดวกในการใช้ไฟล์กำหนดค่ามุมมองเดียวกันในอินสแตนซ์ rviz ที่แตกต่างกันซึ่งเป็นตัวแทนของหุ่นยนต์

มุมมอง rviz ยังสามารถเริ่มต้นจากบรรทัดคำสั่งสำหรับหุ่นยนต์ตัวใดตัวหนึ่งได้

#ไวยากรณ์:
# rviz2 -d --ros-args -r __node:=rviz2 -r __ns:= -r /tf:=tf -r /tf_static:=tf_static -r /goal_pose:=goal_pose -r / clicked_point:=clicked_point -r /initialpose:=initialpose

#rvzi2 เรียก /tb1:
rviz2 -d ./src/navigation2/nav2_bringup/bringup/rviz/multi_nav2_default_view.rviz --ros-args -r __node:=rviz2 -r __ns:=/tb1 -r /tf:=tf -r /tf_static:=tf_static -r /goal_pose:=goal_pose -r /clicked_point:=clicked_point -r /initialpose:=initialpose

ปิดการใช้งานการตรวจสอบ Groot

เพื่อหลีกเลี่ยงข้อขัดแย้งและรับประกันการดำเนินการที่ประสบความสำเร็จของอินสแตนซ์ nav2 stack หลายรายการ จำเป็นต้องปิดใช้งานคุณลักษณะการตรวจสอบ groot ในไฟล์ nav2_param.xml หากไม่ทำเช่นนั้นจะส่งผลให้อินสแตนซ์ต่อมาพบพอร์ตที่ใช้งานอยู่แล้วโดยอินสแตนซ์แรก ดังนั้น สำหรับอินสแตนซ์แผนผังพฤติกรรม nav2 ใหม่แต่ละรายการ ให้ปิดใช้งานการตรวจสอบ groot หรือมอบหมายเลขพอร์ตใหม่ให้กับการเริ่มต้นสแต็ก nav2 แต่ละรายการเพื่อป้องกันความขัดแย้ง

บทช่วยสอนนี้ถือได้ว่าเป็นแนวทางเริ่มต้นในการตั้งค่าหุ่นยนต์หลายตัวในสภาพแวดล้อมการจำลอง Gazebo เราได้สำรวจกระบวนการทีละขั้นตอนในการตั้งค่าและควบคุมหุ่นยนต์ Turtlebot3 หลายตัวโดยใช้สแต็ก Navigation2 (Nav2) ด้วยหุ่นยนต์แต่ละตัวที่ได้รับการกำหนดเนมสเปซของตัวเอง การควบคุมและการนำทางแต่ละตัวสามารถทำได้ผ่าน RViz2 หรืออินเทอร์เฟซบรรทัดคำสั่ง บทช่วยสอนนี้ช่วยให้ผู้ใช้สามารถเริ่มต้นสถานการณ์หุ่นยนต์หลายตัวที่ปรับแต่งได้ ใช้การแมปหัวข้อการสแกนใหม่เพื่อการเชื่อมต่อที่เหมาะสม และเพิ่มประสิทธิภาพไฟล์มุมมอง rviz เพื่อการกำหนดค่าที่ราบรื่น เมื่อปฏิบัติตามคำแนะนำเหล่านี้ ผู้ใช้จะสามารถสร้างและควบคุมหุ่นยนต์ Turtlebot3 ได้หลายตัว ซึ่งเปิดโอกาสให้มีการจำลองหุ่นยนต์หลายตัวและการวิจัยด้านวิทยาการหุ่นยนต์ที่ล้ำหน้า

Insights, advice, suggestions, feedback and comments from experts

I am an expert in the field of setting up and controlling multiple robots in the Gazebo simulation environment using the Navigation2 (Nav2) stack. I have extensive knowledge and experience in this area, and I can provide you with detailed information and guidance on the topic.

In this article, the author discusses the process of initiating multiple Turtlebot3 robots along with the Nav2 stack in the Gazebo simulation environment. The methodology used in this tutorial is adaptable and scalable, allowing for the control and navigation of any number of robots, limited only by system resources. The author assumes that you already have ROS2 Foxy (or a later version) installed and have set up the Turtlebot3 simulation package. If you haven't done so, it is recommended to refer to the official ROS2 and Turtlebot3 documentation to get started.

To modify the Turtlebot3 models and ensure smooth operations, it is essential to have access to the source code and install all the required dependencies. This process can be simplified by using rosdep, a command-line tool from ROS that automatically installs dependencies and prepares a ready-to-go environment. The author provides instructions on how to clone the necessary repositories, build the workspace, and install the dependencies.

The article also mentions some changes and enhancements made to the Turtlebot3_simulations and Navigation2 repositories. These changes include the creation of a new launch file for initiating the world environment and spawning robots, updates to the Turtlebot3 model to handle tf remapping for differential drive, modifications to the navigation_launch.py script to incorporate scan topic remapping, and updates to the rviz view file to remove the "/" prefix from topic names.

The article provides a summary of the changes made, including the arrangement of robots in a launch file, the use of a single map server and global "/map" topic, the use of "/tf" and "/tf_static" per robot, scan topic mapping, and the disabling of Groot monitoring to avoid conflicts.

Overall, this tutorial serves as a starting guide for setting up multiple robots in the Gazebo simulation environment. It covers the step-by-step process of setting up and controlling multiple Turtlebot3 robots using the Nav2 stack. By following the instructions provided, you can create customizable multi-robot scenarios, implement scan topic remapping for proper connectivity, and optimize rviz view files for seamless configuration. This opens up possibilities for multi-robot simulations and advances in robotics research.

I hope this information helps you understand the concepts discussed in the article and provides you with a solid foundation for setting up and controlling multiple robots in the Gazebo simulation environment using the Nav2 stack. If you have any further questions or need additional assistance, feel free to ask!

แนวทางที่ปรับเปลี่ยนได้สำหรับการนำทางหลายหุ่นยนต์ใน ROS2: การใช้ Turtlebot3 และ Nav2 (2024)

References

Top Articles
Latest Posts
Article information

Author: Barbera Armstrong

Last Updated:

Views: 6245

Rating: 4.9 / 5 (59 voted)

Reviews: 90% of readers found this page helpful

Author information

Name: Barbera Armstrong

Birthday: 1992-09-12

Address: Suite 993 99852 Daugherty Causeway, Ritchiehaven, VT 49630

Phone: +5026838435397

Job: National Engineer

Hobby: Listening to music, Board games, Photography, Ice skating, LARPing, Kite flying, Rugby

Introduction: My name is Barbera Armstrong, I am a lovely, delightful, cooperative, funny, enchanting, vivacious, tender person who loves writing and wants to share my knowledge and understanding with you.